From ebb13f106a1ed466de6cfb6b2d9353dca22cdbd3 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Wed, 11 Aug 2021 23:55:34 -0400 Subject: [PATCH 01/30] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=BF=87=E7=9A=84=E9=A1=B9=E7=9B=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-collections-conversions/README.md | 15 ++ java-collections-conversions/pom.xml | 52 +++++++ .../java/com/ossez/convertToMap/Book.java | 48 ++++++ .../com/ossez/convertToMap/ConvertToMap.java | 30 ++++ .../convertcollectiontoarraylist/Foo.java | 52 +++++++ .../com/ossez/convertlisttomap/Animal.java | 27 ++++ .../ConvertListToMapService.java | 43 ++++++ .../src/main/resources/logback.xml | 13 ++ .../ArrayToListConversionUnitTest.java | 35 +++++ .../convertToMap/ConvertToMapUnitTest.java | 53 +++++++ .../CollectionToArrayListUnitTest.java | 145 ++++++++++++++++++ .../ConvertIteratorToListServiceUnitTest.java | 100 ++++++++++++ .../ConvertListToMapServiceUnitTest.java | 68 ++++++++ ...tWithDuplicatedIdToMapServiceUnitTest.java | 68 ++++++++ .../IterableToCollectionUnitTest.java | 122 +++++++++++++++ .../JavaCollectionConversionUnitTest.java | 145 ++++++++++++++++++ .../java/lists/ListToStringUnitTest.java | 31 ++++ 17 files changed, 1047 insertions(+) create mode 100644 java-collections-conversions/README.md create mode 100644 java-collections-conversions/pom.xml create mode 100644 java-collections-conversions/src/main/java/com/ossez/convertToMap/Book.java create mode 100644 java-collections-conversions/src/main/java/com/ossez/convertToMap/ConvertToMap.java create mode 100644 java-collections-conversions/src/main/java/com/ossez/convertcollectiontoarraylist/Foo.java create mode 100644 java-collections-conversions/src/main/java/com/ossez/convertlisttomap/Animal.java create mode 100644 java-collections-conversions/src/main/java/com/ossez/convertlisttomap/ConvertListToMapService.java create mode 100644 java-collections-conversions/src/main/resources/logback.xml create mode 100644 java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/convertToMap/ConvertToMapUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListToMapServiceUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/java/collections/IterableToCollectionUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/java/collections/JavaCollectionConversionUnitTest.java create mode 100644 java-collections-conversions/src/test/java/com/ossez/java/lists/ListToStringUnitTest.java diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md new file mode 100644 index 0000000000..25a4d11b8b --- /dev/null +++ b/java-collections-conversions/README.md @@ -0,0 +1,15 @@ +## Java Collections Cookbooks and Examples + +This module contains articles about conversions among Collection types and arrays in Java. + +### Relevant Articles: +- [Converting between an Array and a List in Java](https://www.baeldung.com/convert-array-to-list-and-list-to-array) +- [Converting between an Array and a Set in Java](https://www.baeldung.com/convert-array-to-set-and-set-to-array) +- [Convert a Map to an Array, List or Set in Java](https://www.baeldung.com/convert-map-values-to-array-list-set) +- [Converting a List to String in Java](https://www.baeldung.com/java-list-to-string) +- [How to Convert List to Map in Java](https://www.baeldung.com/java-list-to-map) +- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) +- [Java 8 Collectors toMap](https://www.baeldung.com/java-collectors-tomap) +- [Converting Iterable to Collection in Java](https://www.baeldung.com/java-iterable-to-collection) +- [Converting Iterator to List](https://www.baeldung.com/java-convert-iterator-to-list) +- More articles: [[next -->]](../java-collections-conversions-2) \ No newline at end of file diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml new file mode 100644 index 0000000000..ebebb80dd5 --- /dev/null +++ b/java-collections-conversions/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + java-collections-conversions + 0.1.0-SNAPSHOT + java-collections-conversions + jar + + + com.ossez + parent-java + 0.0.2-SNAPSHOT + ../parent-java + + + + + + org.assertj + assertj-core + 3.17.2 + test + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + java-collections-conversions + + + src/main/resources + true + + + + + + 4.1 + + + \ No newline at end of file diff --git a/java-collections-conversions/src/main/java/com/ossez/convertToMap/Book.java b/java-collections-conversions/src/main/java/com/ossez/convertToMap/Book.java new file mode 100644 index 0000000000..2a4e969ae6 --- /dev/null +++ b/java-collections-conversions/src/main/java/com/ossez/convertToMap/Book.java @@ -0,0 +1,48 @@ +package com.ossez.convertToMap; + +public class Book { + private String name; + private int releaseYear; + private String isbn; + + + @Override + public String toString() { + return "Book{" + + "name='" + name + '\'' + + ", releaseYear=" + releaseYear + + ", isbn='" + isbn + '\'' + + '}'; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getReleaseYear() { + return releaseYear; + } + + public void setReleaseYear(int releaseYear) { + this.releaseYear = releaseYear; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public Book(String name, int releaseYear, String isbn) { + this.name = name; + this.releaseYear = releaseYear; + this.isbn = isbn; + } +} + diff --git a/java-collections-conversions/src/main/java/com/ossez/convertToMap/ConvertToMap.java b/java-collections-conversions/src/main/java/com/ossez/convertToMap/ConvertToMap.java new file mode 100644 index 0000000000..61393a0ac5 --- /dev/null +++ b/java-collections-conversions/src/main/java/com/ossez/convertToMap/ConvertToMap.java @@ -0,0 +1,30 @@ +package com.ossez.convertToMap; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class ConvertToMap { + public Map listToMap(List books) { + return books.stream().collect(Collectors.toMap(Book::getIsbn, Book::getName)); + } + + public Map listToMapWithDupKeyError(List books) { + return books.stream().collect(Collectors.toMap(Book::getReleaseYear, Function.identity())); + } + + public Map listToMapWithDupKey(List books) { + return books.stream().collect(Collectors.toMap(Book::getReleaseYear, Function.identity(), (existing, replacement) -> existing)); + } + + public Map listToConcurrentMap(List books) { + return books.stream().collect(Collectors.toMap(Book::getReleaseYear, Function.identity(), (o1, o2) -> o1, ConcurrentHashMap::new)); + } + + public TreeMap listToSortedMap(List books) { + return books.stream() + .collect(Collectors.toMap(Book::getName, Function.identity(), (o1, o2) -> o1, TreeMap::new)); + } +} + diff --git a/java-collections-conversions/src/main/java/com/ossez/convertcollectiontoarraylist/Foo.java b/java-collections-conversions/src/main/java/com/ossez/convertcollectiontoarraylist/Foo.java new file mode 100644 index 0000000000..9a54f000bf --- /dev/null +++ b/java-collections-conversions/src/main/java/com/ossez/convertcollectiontoarraylist/Foo.java @@ -0,0 +1,52 @@ +package com.ossez.convertcollectiontoarraylist; + +/** + * This POJO is the element type of our collection. It has a deepCopy() method. + * + * @author chris + */ +public class Foo { + + private int id; + private String name; + private Foo parent; + + public Foo() { + } + + public Foo(int id, String name, Foo parent) { + this.id = id; + this.name = name; + this.parent = parent; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Foo getParent() { + return parent; + } + + public void setParent(Foo parent) { + this.parent = parent; + } + + public Foo deepCopy() { + return new Foo( + this.id, this.name, this.parent != null ? this.parent.deepCopy() : null); + } + +} diff --git a/java-collections-conversions/src/main/java/com/ossez/convertlisttomap/Animal.java b/java-collections-conversions/src/main/java/com/ossez/convertlisttomap/Animal.java new file mode 100644 index 0000000000..c8d9fdfcaf --- /dev/null +++ b/java-collections-conversions/src/main/java/com/ossez/convertlisttomap/Animal.java @@ -0,0 +1,27 @@ +package com.ossez.convertlisttomap; + +public class Animal { + private int id; + private String name; + + public Animal(int id, String name) { + this.id = id; + this.setName(name); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/java-collections-conversions/src/main/java/com/ossez/convertlisttomap/ConvertListToMapService.java b/java-collections-conversions/src/main/java/com/ossez/convertlisttomap/ConvertListToMapService.java new file mode 100644 index 0000000000..d162183f56 --- /dev/null +++ b/java-collections-conversions/src/main/java/com/ossez/convertlisttomap/ConvertListToMapService.java @@ -0,0 +1,43 @@ +package com.ossez.convertlisttomap; + +import com.google.common.collect.Maps; +import org.apache.commons.collections4.MapUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class ConvertListToMapService { + + public Map convertListBeforeJava8(List list) { + + Map map = new HashMap<>(); + + for (Animal animal : list) { + map.put(animal.getId(), animal); + } + return map; + } + + public Map convertListAfterJava8(List list) { + Map map = list.stream().collect(Collectors.toMap(Animal::getId, Function.identity())); + return map; + } + + public Map convertListWithGuava(List list) { + + Map map = Maps.uniqueIndex(list, Animal::getId); + return map; + } + + public Map convertListWithApacheCommons(List list) { + + Map map = new HashMap<>(); + + MapUtils.populateMap(map, list, Animal::getId); + + return map; + } +} diff --git a/java-collections-conversions/src/main/resources/logback.xml b/java-collections-conversions/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/java-collections-conversions/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java new file mode 100644 index 0000000000..cd8641b8a7 --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java @@ -0,0 +1,35 @@ +package com.ossez.arrayconversion; + +import org.assertj.core.api.ListAssert; +import org.hamcrest.CoreMatchers; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ArrayToListConversionUnitTest { + + @Test(expected = UnsupportedOperationException.class) + public void givenAnArray_whenConvertingToList_returnUnmodifiableListUnitTest() { + String[] stringArray = new String[]{"A", "B", "C", "D"}; + List stringList = Arrays.asList(stringArray); + stringList.set(0, "E"); + assertThat(stringList).containsExactly("E", "B", "C", "D"); + assertThat(stringArray).containsExactly("E", "B", "C", "D"); + stringList.add("F"); + } + + @Test + public void givenAnArray_whenConvertingToList_returnModifiableListUnitTest() { + String[] stringArray = new String[]{"A", "B", "C", "D"}; + List stringList = new ArrayList<>(Arrays.asList(stringArray)); + stringList.set(0, "E"); + assertThat(stringList).containsExactly("E", "B", "C", "D"); + assertThat(stringArray).containsExactly("A", "B", "C", "D"); + stringList.add("F"); + assertThat(stringList).containsExactly("E", "B", "C", "D", "F"); + } +} \ No newline at end of file diff --git a/java-collections-conversions/src/test/java/com/ossez/convertToMap/ConvertToMapUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/convertToMap/ConvertToMapUnitTest.java new file mode 100644 index 0000000000..745a801698 --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/convertToMap/ConvertToMapUnitTest.java @@ -0,0 +1,53 @@ +package com.ossez.convertToMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + + +public class ConvertToMapUnitTest { + + private List bookList; + private ConvertToMap convertToMap = new ConvertToMap(); + + @Before + public void init() { + bookList = new ArrayList<>(); + bookList.add(new Book("The Fellowship of the Ring", 1954, "0395489318")); + bookList.add(new Book("The Two Towers", 1954, "0345339711")); + bookList.add(new Book("The Return of the King", 1955, "0618129111")); + } + + @Test + public void whenConvertFromListToMap() { + assertTrue(convertToMap.listToMap(bookList).size() == 3); + } + + @Test(expected = IllegalStateException.class) + public void whenMapHasDuplicateKey_without_merge_function_then_runtime_exception() { + convertToMap.listToMapWithDupKeyError(bookList); + } + + @Test + public void whenMapHasDuplicateKeyThenMergeFunctionHandlesCollision() { + Map booksByYear = convertToMap.listToMapWithDupKey(bookList); + assertEquals(2, booksByYear.size()); + assertEquals("0395489318", booksByYear.get(1954).getIsbn()); + } + + @Test + public void whenCreateConcurrentHashMap() { + assertTrue(convertToMap.listToConcurrentMap(bookList) instanceof ConcurrentHashMap); + } + + @Test + public void whenMapisSorted() { + assertTrue(convertToMap.listToSortedMap(bookList).firstKey().equals("The Fellowship of the Ring")); + } +} diff --git a/java-collections-conversions/src/test/java/com/ossez/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java new file mode 100644 index 0000000000..be470671a7 --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java @@ -0,0 +1,145 @@ +package com.ossez.convertcollectiontoarraylist; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Iterator; +import static java.util.stream.Collectors.toCollection; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author chris + */ +public class CollectionToArrayListUnitTest { + private static Collection srcCollection = new HashSet<>(); + + public CollectionToArrayListUnitTest() { + } + + @BeforeClass + public static void setUpClass() { + int i = 0; + Foo john = new Foo(i++, "John", null); + Foo mary = new Foo(i++, "Mary", null); + Foo sam = new Foo(i++, "Sam", john); + Foo alice = new Foo(i++, "Alice", john); + Foo buffy = new Foo(i++, "Buffy", sam); + srcCollection.add(john); + srcCollection.add(mary); + srcCollection.add(sam); + srcCollection.add(alice); + srcCollection.add(buffy); + } + + /** + * Section 3. Using the ArrayList Constructor + */ + @Test + public void whenUsingConstructor_thenVerifyShallowCopy() { + ArrayList newList = new ArrayList<>(srcCollection); + verifyShallowCopy(srcCollection, newList); + } + + /** + * Section 4. Using the Streams API + */ + @Test + public void whenUsingStream_thenVerifyShallowCopy() { + ArrayList newList = srcCollection.stream().collect(toCollection(ArrayList::new)); + + verifyShallowCopy(srcCollection, newList); + } + + /** + * Section 5. Deep Copy + */ + @Test + public void whenUsingDeepCopy_thenVerifyDeepCopy() { + ArrayList newList = srcCollection.stream() + .map(Foo::deepCopy) + .collect(toCollection(ArrayList::new)); + + verifyDeepCopy(srcCollection, newList); + } + + /** + * Section 6. Controlling the List Order + */ + @Test + public void whenUsingSortedStream_thenVerifySortOrder() { + ArrayList newList = srcCollection.stream() + .sorted(Comparator.comparing(Foo::getName)) + .collect(toCollection(ArrayList::new)); + + assertTrue("ArrayList is not sorted by name", isSorted(newList)); + } + + /** + * Verify that the contents of the two collections are the same + * @param a + * @param b + */ + private void verifyShallowCopy(Collection a, Collection b) { + assertEquals("Collections have different lengths", a.size(), b.size()); + Iterator iterA = a.iterator(); + Iterator iterB = b.iterator(); + while (iterA.hasNext()) { + // test instance identity + assertSame("Foo instances differ!", iterA.next(), iterB.next()); + } + } + + /** + * Verify that the contents of the two collections are the same + * @param a + * @param b + */ + private void verifyDeepCopy(Collection a, Collection b) { + assertEquals("Collections have different lengths", a.size(), b.size()); + Iterator iterA = a.iterator(); + Iterator iterB = b.iterator(); + while (iterA.hasNext()) { + Foo nextA = iterA.next(); + Foo nextB = iterB.next(); + // should not be same instance + assertNotSame("Foo instances are the same!", nextA, nextB); + // but should have same content + assertFalse("Foo instances have different content!", fooDiff(nextA, nextB)); + } + } + + /** + * Return true if the contents of a and b differ. Test parent recursively + * @param a + * @param b + * @return False if the two items are the same + */ + private boolean fooDiff(Foo a, Foo b) { + if (a != null && b != null) { + return a.getId() != b.getId() + || !a.getName().equals(b.getName()) + || fooDiff(a.getParent(), b.getParent()); + } + return !(a == null && b == null); + } + + /** + * @param c collection of Foo + * @return true if the collection is sorted by name + */ + private static boolean isSorted(Collection c) { + String prevName = null; + for (Foo foo : c) { + if (prevName == null || foo.getName().compareTo(prevName) > 0) { + prevName = foo.getName(); + } else { + return false; + } + } + return true; + } +} diff --git a/java-collections-conversions/src/test/java/com/ossez/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java new file mode 100644 index 0000000000..97ba2e4326 --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java @@ -0,0 +1,100 @@ +package com.ossez.convertiteratortolist; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import org.apache.commons.collections4.IteratorUtils; +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; + +public class ConvertIteratorToListServiceUnitTest { + + Iterator iterator; + + @Before + public void setUp() { + iterator = Arrays.asList(1, 2, 3) + .iterator(); + } + + @Test + public void givenAnIterator_whenConvertIteratorToListUsingWhileLoop_thenReturnAList() { + + List actualList = new ArrayList<>(); + + // Convert Iterator to List using while loop dsf + while (iterator.hasNext()) { + actualList.add(iterator.next()); + } + + assertThat(actualList, hasSize(3)); + assertThat(actualList, containsInAnyOrder(1, 2, 3)); + } + + @Test + public void givenAnIterator_whenConvertIteratorToListAfterJava8_thenReturnAList() { + List actualList = new ArrayList<>(); + + // Convert Iterator to List using Java 8 + iterator.forEachRemaining(actualList::add); + + assertThat(actualList, hasSize(3)); + assertThat(actualList, containsInAnyOrder(1, 2, 3)); + } + + @Test + public void givenAnIterator_whenConvertIteratorToListJava8Stream_thenReturnAList() { + + // Convert iterator to iterable + Iterable iterable = () -> iterator; + + // Extract List from stream + List actualList = StreamSupport + .stream(iterable.spliterator(), false) + .collect(Collectors.toList()); + + assertThat(actualList, hasSize(3)); + assertThat(actualList, containsInAnyOrder(1, 2, 3)); + } + + @Test + public void givenAnIterator_whenConvertIteratorToImmutableListWithGuava_thenReturnAList() { + + // Convert Iterator to an Immutable list using Guava library in Java + List actualList = ImmutableList.copyOf(iterator); + + assertThat(actualList, hasSize(3)); + assertThat(actualList, containsInAnyOrder(1, 2, 3)); + } + + @Test + public void givenAnIterator_whenConvertIteratorToMutableListWithGuava_thenReturnAList() { + + // Convert Iterator to a mutable list using Guava library in Java + List actualList = Lists.newArrayList(iterator); + + assertThat(actualList, hasSize(3)); + assertThat(actualList, containsInAnyOrder(1, 2, 3)); + } + + @Test + public void givenAnIterator_whenConvertIteratorToMutableListWithApacheCommons_thenReturnAList() { + + // Convert Iterator to a mutable list using Apache Commons library in Java + List actualList = IteratorUtils.toList(iterator); + + assertThat(actualList, hasSize(3)); + assertThat(actualList, containsInAnyOrder(1, 2, 3)); + } +} diff --git a/java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListToMapServiceUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListToMapServiceUnitTest.java new file mode 100644 index 0000000000..e538cfc9b9 --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListToMapServiceUnitTest.java @@ -0,0 +1,68 @@ +package com.ossez.convertlisttomap; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; + +public class ConvertListToMapServiceUnitTest { + List list; + + private ConvertListToMapService convertListService; + + @Before + public void init() { + this.convertListService = new ConvertListToMapService(); + this.list = new ArrayList<>(); + + Animal cat = new Animal(1, "Cat"); + list.add(cat); + Animal dog = new Animal(2, "Dog"); + list.add(dog); + Animal pig = new Animal(3, "Pig"); + list.add(pig); + Animal cow = new Animal(4, "Cow"); + list.add(cow); + Animal goat = new Animal(5, "Goat"); + list.add(goat); + + } + + @Test + public void givenAList_whenConvertBeforeJava8_thenReturnMapWithTheSameElements() { + + Map map = convertListService.convertListBeforeJava8(list); + + assertThat(map.values(), containsInAnyOrder(list.toArray())); + } + + @Test + public void givenAList_whenConvertAfterJava8_thenReturnMapWithTheSameElements() { + + Map map = convertListService.convertListAfterJava8(list); + + assertThat(map.values(), containsInAnyOrder(list.toArray())); + } + + @Test + public void givenAList_whenConvertWithGuava_thenReturnMapWithTheSameElements() { + + Map map = convertListService.convertListWithGuava(list); + + assertThat(map.values(), containsInAnyOrder(list.toArray())); + } + + @Test + public void givenAList_whenConvertWithApacheCommons_thenReturnMapWithTheSameElements() { + + Map map = convertListService.convertListWithApacheCommons(list); + + assertThat(map.values(), containsInAnyOrder(list.toArray())); + } + +} diff --git a/java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java new file mode 100644 index 0000000000..51336cb0aa --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java @@ -0,0 +1,68 @@ +package com.ossez.convertlisttomap; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; + +public class ConvertListWithDuplicatedIdToMapServiceUnitTest { + List duplicatedIdList; + + private ConvertListToMapService convertListService = new ConvertListToMapService(); + + @Before + public void init() { + + this.duplicatedIdList = new ArrayList<>(); + + Animal cat = new Animal(1, "Cat"); + duplicatedIdList.add(cat); + Animal dog = new Animal(2, "Dog"); + duplicatedIdList.add(dog); + Animal pig = new Animal(3, "Pig"); + duplicatedIdList.add(pig); + Animal cow = new Animal(4, "Cow"); + duplicatedIdList.add(cow); + Animal goat = new Animal(4, "Goat"); + duplicatedIdList.add(goat); + + } + + @Test + public void givenADupIdList_whenConvertBeforeJava8_thenReturnMapWithRewrittenElement() { + + Map map = convertListService.convertListBeforeJava8(duplicatedIdList); + + assertThat(map.values(), hasSize(4)); + assertThat(map.values(), hasItem(duplicatedIdList.get(4))); + } + + @Test + public void givenADupIdList_whenConvertWithApacheCommons_thenReturnMapWithRewrittenElement() { + + Map map = convertListService.convertListWithApacheCommons(duplicatedIdList); + + assertThat(map.values(), hasSize(4)); + assertThat(map.values(), hasItem(duplicatedIdList.get(4))); + } + + @Test(expected = IllegalStateException.class) + public void givenADupIdList_whenConvertAfterJava8_thenException() { + + convertListService.convertListAfterJava8(duplicatedIdList); + } + + @Test(expected = IllegalArgumentException.class) + public void givenADupIdList_whenConvertWithGuava_thenException() { + + convertListService.convertListWithGuava(duplicatedIdList); + + } + +} diff --git a/java-collections-conversions/src/test/java/com/ossez/java/collections/IterableToCollectionUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/java/collections/IterableToCollectionUnitTest.java new file mode 100644 index 0000000000..22293a7c77 --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/java/collections/IterableToCollectionUnitTest.java @@ -0,0 +1,122 @@ +package com.ossez.java.collections; + +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertThat; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import org.apache.commons.collections4.IterableUtils; +import org.apache.commons.collections4.IteratorUtils; +import org.junit.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; + +public class IterableToCollectionUnitTest { + + Iterable iterable = Arrays.asList("john", "tom", "jane"); + Iterator iterator = iterable.iterator(); + + @Test + public void whenConvertIterableToListUsingJava_thenSuccess() { + List result = new ArrayList(); + for (String str : iterable) { + result.add(str); + } + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIterableToListUsingJava8_thenSuccess() { + List result = new ArrayList(); + iterable.forEach(result::add); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIterableToListUsingJava8WithSpliterator_thenSuccess() { + List result = StreamSupport.stream(iterable.spliterator(), false) + .collect(Collectors.toList()); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIterableToListUsingGuava_thenSuccess() { + List result = Lists.newArrayList(iterable); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIterableToImmutableListUsingGuava_thenSuccess() { + List result = ImmutableList.copyOf(iterable); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIterableToListUsingApacheCommons_thenSuccess() { + List result = IterableUtils.toList(iterable); + + assertThat(result, contains("john", "tom", "jane")); + } + + // ======================== Iterator + + @Test + public void whenConvertIteratorToListUsingJava_thenSuccess() { + List result = new ArrayList(); + while (iterator.hasNext()) { + result.add(iterator.next()); + } + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIteratorToListUsingJava8_thenSuccess() { + List result = new ArrayList(); + iterator.forEachRemaining(result::add); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIteratorToListUsingJava8WithSpliterator_thenSuccess() { + List result = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false) + .collect(Collectors.toList()); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIteratorToListUsingGuava_thenSuccess() { + List result = Lists.newArrayList(iterator); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIteratorToImmutableListUsingGuava_thenSuccess() { + List result = ImmutableList.copyOf(iterator); + + assertThat(result, contains("john", "tom", "jane")); + } + + @Test + public void whenConvertIteratorToListUsingApacheCommons_thenSuccess() { + List result = IteratorUtils.toList(iterator); + + assertThat(result, contains("john", "tom", "jane")); + } +} diff --git a/java-collections-conversions/src/test/java/com/ossez/java/collections/JavaCollectionConversionUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/java/collections/JavaCollectionConversionUnitTest.java new file mode 100644 index 0000000000..fdcbe1bf9f --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/java/collections/JavaCollectionConversionUnitTest.java @@ -0,0 +1,145 @@ +package com.ossez.java.collections; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.junit.Test; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.google.common.primitives.Ints; + +@SuppressWarnings("unused") +public class JavaCollectionConversionUnitTest { + + // List -> array; array -> List + + @Test + public final void givenUsingCoreJava_whenArrayConvertedToList_thenCorrect() { + final Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; + final List targetList = Arrays.asList(sourceArray); + } + + @Test + public final void givenUsingCoreJava_whenListConvertedToArray_thenCorrect() { + final List sourceList = Arrays.asList(0, 1, 2, 3, 4, 5); + final Integer[] targetArray = sourceList.toArray(new Integer[0]); + } + + @Test + public final void givenUsingGuava_whenArrayConvertedToList_thenCorrect() { + final Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; + final List targetList = Lists.newArrayList(sourceArray); + } + + @Test + public final void givenUsingGuava_whenListConvertedToArray_thenCorrect() { + final List sourceList = Lists.newArrayList(0, 1, 2, 3, 4, 5); + final int[] targetArray = Ints.toArray(sourceList); + } + + @Test + public final void givenUsingCommonsCollections_whenArrayConvertedToList_thenCorrect() { + final Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; + final List targetList = new ArrayList<>(6); + CollectionUtils.addAll(targetList, sourceArray); + } + + // Set -> array; array -> Set + + @Test + public final void givenUsingCoreJavaV1_whenArrayConvertedToSet_thenCorrect() { + final Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; + final Set targetSet = new HashSet(Arrays.asList(sourceArray)); + } + + @Test + public final void givenUsingCoreJavaV2_whenArrayConvertedToSet_thenCorrect() { + final Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; + final Set targetSet = new HashSet(); + Collections.addAll(targetSet, sourceArray); + } + + @Test + public final void givenUsingCoreJava_whenSetConvertedToArray_thenCorrect() { + final Set sourceSet = Sets.newHashSet(0, 1, 2, 3, 4, 5); + final Integer[] targetArray = sourceSet.toArray(new Integer[0]); + } + + @Test + public final void givenUsingGuava_whenArrayConvertedToSet_thenCorrect() { + final Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; + final Set targetSet = Sets.newHashSet(sourceArray); + } + + @Test + public final void givenUsingGuava_whenSetConvertedToArray_thenCorrect() { + final Set sourceSet = Sets.newHashSet(0, 1, 2, 3, 4, 5); + final int[] targetArray = Ints.toArray(sourceSet); + } + + @Test + public final void givenUsingCommonsCollections_whenArrayConvertedToSet_thenCorrect() { + final Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; + final Set targetSet = new HashSet<>(6); + CollectionUtils.addAll(targetSet, sourceArray); + } + + @Test + public final void givenUsingCommonsCollections_whenSetConvertedToArrayOfPrimitives_thenCorrect() { + final Set sourceSet = Sets.newHashSet(0, 1, 2, 3, 4, 5); + final Integer[] targetArray = sourceSet.toArray(new Integer[0]); + final int[] primitiveTargetArray = ArrayUtils.toPrimitive(targetArray); + } + + // Map (values) -> Array, List, Set + + @Test + public final void givenUsingCoreJava_whenMapValuesConvertedToArray_thenCorrect() { + final Map sourceMap = createMap(); + + final Collection values = sourceMap.values(); + final String[] targetArray = values.toArray(new String[0]); + } + + @Test + public final void givenUsingCoreJava_whenMapValuesConvertedToList_thenCorrect() { + final Map sourceMap = createMap(); + + final List targetList = new ArrayList<>(sourceMap.values()); + } + + @Test + public final void givenUsingGuava_whenMapValuesConvertedToList_thenCorrect() { + final Map sourceMap = createMap(); + + final List targetList = Lists.newArrayList(sourceMap.values()); + } + + @Test + public final void givenUsingCoreJava_whenMapValuesConvertedToSet_thenCorrect() { + final Map sourceMap = createMap(); + + final Set targetSet = new HashSet<>(sourceMap.values()); + } + + // UTIL + + private final Map createMap() { + final Map sourceMap = new HashMap<>(3); + sourceMap.put(0, "zero"); + sourceMap.put(1, "one"); + sourceMap.put(2, "two"); + return sourceMap; + } + +} diff --git a/java-collections-conversions/src/test/java/com/ossez/java/lists/ListToStringUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/java/lists/ListToStringUnitTest.java new file mode 100644 index 0000000000..b05002b9f4 --- /dev/null +++ b/java-collections-conversions/src/test/java/com/ossez/java/lists/ListToStringUnitTest.java @@ -0,0 +1,31 @@ +package com.ossez.java.lists; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +public class ListToStringUnitTest { + + @Test + public void whenListToString_thenPrintDefault() { + List intLIst = Arrays.asList(1, 2, 3); + System.out.println(intLIst); + } + + @Test + public void whenCollectorsJoining_thenPrintCustom() { + List intList = Arrays.asList(1, 2, 3); + System.out.println(intList.stream() + .map(n -> String.valueOf(n)) + .collect(Collectors.joining("-", "{", "}"))); + } + + @Test + public void whenStringUtilsJoin_thenPrintCustom() { + List intList = Arrays.asList(1, 2, 3); + System.out.println(StringUtils.join(intList, "|")); + } +} From 2eb82e8a22dfe0089cac4d9c6e6c6072aa78daf9 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Wed, 11 Aug 2021 23:56:08 -0400 Subject: [PATCH 02/30] =?UTF-8?q?=E4=B8=BB=E9=A1=B9=E7=9B=AE=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E8=BF=9B=E8=A1=8C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aa62148453..e71dbf6beb 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,13 @@ 1.7.30 2.2 + + 2.8.0 + 2.6 + 3.11 + 1.4 + 3.0.0 + 4.3.5.Final @@ -65,7 +72,8 @@ 4.11 - 1.3 + 2.2 + 1.3 1.9.0 @@ -234,6 +242,18 @@ 5.7.0 test + + org.hamcrest + hamcrest + ${hamcrest.version} + test + + + org.hamcrest + hamcrest-all + ${hamcrest-all.version} + test + From f8d0bd94bc461557e2a821107a604a45162d30ab Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 12 Aug 2021 18:45:40 -0400 Subject: [PATCH 03/30] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 5 + .idea/encodings.xml | 3 + .idea/misc.xml | 2 + .idea/modules.xml | 3 + .idea/runConfigurations.xml | 10 ++ .idea/workspace.xml | 88 +++++++++++- java-collections-conversions-2/README.md | 12 ++ java-collections-conversions-2/pom.xml | 64 +++++++++ .../convertlisttomap/ListToMapConverter.java | 70 +++++++++ .../com/baeldung/modelmapper/MapperUtil.java | 32 +++++ .../java/com/baeldung/modelmapper/User.java | 70 +++++++++ .../com/baeldung/modelmapper/UserDTO.java | 41 ++++++ .../com/baeldung/modelmapper/UserList.java | 21 +++ .../com/baeldung/modelmapper/UserListDTO.java | 21 +++ .../modelmapper/UsersListConverter.java | 23 +++ .../ArrayToListConversionUnitTest.java | 35 +++++ .../ArrayToStringUnitTest.java | 135 ++++++++++++++++++ .../convertlisttomap/ListToMapUnitTest.java | 46 ++++++ .../modelmapper/UsersListMappingUnitTest.java | 92 ++++++++++++ .../baeldung/setiteration/SetIteration.java | 74 ++++++++++ java-collections-conversions/pom.xml | 6 - .../ArrayToListConversionUnitTest.java | 16 +++ parent-java/pom.xml | 4 +- pom.xml | 2 + toolkits/codebank/pom.xml | 2 +- toolkits/discourse/pom.xml | 2 +- 26 files changed, 866 insertions(+), 13 deletions(-) create mode 100644 .idea/runConfigurations.xml create mode 100644 java-collections-conversions-2/README.md create mode 100644 java-collections-conversions-2/pom.xml create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java create mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java create mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java create mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java create mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java create mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index c1f674d39e..b00cdc2dd1 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,12 +7,17 @@ + + + + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 0cd0cea4ac..6ab87fde96 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,9 @@ + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index 17e19eb41d..94bf04de8e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,6 +4,8 @@ diff --git a/.idea/modules.xml b/.idea/modules.xml index d29913b7c7..ca48a0f8ca 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,9 @@ + + + diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000000..797acea53e --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index f915e30643..b801c976d4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,8 +5,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -24,13 +53,27 @@ + + + + + + + - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -52,6 +132,7 @@ + diff --git a/java-collections-conversions-2/README.md b/java-collections-conversions-2/README.md new file mode 100644 index 0000000000..83b3ec8786 --- /dev/null +++ b/java-collections-conversions-2/README.md @@ -0,0 +1,12 @@ +## Java Collections Cookbooks and Examples + +This module contains articles about conversions among Collection types and arrays in Java. + +### Relevant Articles: + +- [Array to String Conversions](https://www.baeldung.com/java-array-to-string) +- [Mapping Lists with ModelMapper](https://www.baeldung.com/java-modelmapper-lists) +- [Converting List to Map With a Custom Supplier](https://www.baeldung.com/list-to-map-supplier) +- [Arrays.asList vs new ArrayList(Arrays.asList())](https://www.baeldung.com/java-arrays-aslist-vs-new-arraylist) +- [Iterate Over a Set in Java](https://www.baeldung.com/java-iterate-set) +- More articles: [[<-- prev]](../java-collections-conversions) diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml new file mode 100644 index 0000000000..de551d756a --- /dev/null +++ b/java-collections-conversions-2/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + java-collections-conversions-2 + 0.1.0-SNAPSHOT + java-collections-conversions-2 + jar + + + com.ossez + parent-java + 0.0.2-SNAPSHOT + ../parent-java + + + + + org.assertj + assertj-core + 3.17.2 + test + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.modelmapper + modelmapper + ${modelmapper.version} + + + junit + junit + ${junit.version} + test + + + org.hamcrest + hamcrest + ${hamcrest.version} + test + + + io.vavr + vavr + 0.10.3 + + + + + java-collections-conversions-2 + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java b/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java new file mode 100644 index 0000000000..8450f54f9d --- /dev/null +++ b/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java @@ -0,0 +1,70 @@ +package com.baeldung.convertlisttomap; + +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * Convert a string list to a map whose key is the string's length and value is the collection with same length. + * Give a list {"Baeldung", "is", "very", "cool"}. + * After conversion we'll get a map like: + * {8 : ["Baeldung"], 2 : ["is"], 4 : ["very", "cool"]}. + * + * @author leasy.zhang + * + */ +public class ListToMapConverter { + + public Map> groupingByStringLength(List source, + Supplier>> mapSupplier, + Supplier> listSupplier) { + + return source.stream() + .collect(Collectors.groupingBy(String::length, mapSupplier, Collectors.toCollection(listSupplier))); + } + + public Map> streamCollectByStringLength(List source, + Supplier>> mapSupplier, + Supplier> listSupplier) { + + BiConsumer>, String> accumulator = (response, element) -> { + Integer key = element.length(); + List values = response.getOrDefault(key, listSupplier.get()); + values.add(element); + response.put(key, values); + }; + + BiConsumer>, Map>> combiner = (res1, res2) -> { + res1.putAll(res2); + }; + + return source.stream() + .collect(mapSupplier, accumulator, combiner); + } + + public Map> collectorToMapByStringLength(List source, + Supplier>> mapSupplier, + Supplier> listSupplier) { + + Function keyMapper = String::length; + + Function> valueMapper = (element) -> { + List collection = listSupplier.get(); + collection.add(element); + return collection; + }; + + BinaryOperator> mergeFunction = (existing, replacement) -> { + existing.addAll(replacement); + return existing; + }; + + return source.stream() + .collect(Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)); + } + +} diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java new file mode 100644 index 0000000000..23a549e652 --- /dev/null +++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java @@ -0,0 +1,32 @@ +package com.baeldung.modelmapper; + +import org.modelmapper.ModelMapper; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * This is a helper class that contains method for custom mapping of the users list. + * Initially, an instance of ModelMapper was created. + * + * @author Sasa Milenkovic + */ +public class MapperUtil { + + private static ModelMapper modelMapper = new ModelMapper(); + + + private MapperUtil() { + + + } + + public static List mapList(List source, Class targetClass) { + + return source + .stream() + .map(element -> modelMapper.map(element, targetClass)) + .collect(Collectors.toList()); + } + +} diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java new file mode 100644 index 0000000000..8ed674d86a --- /dev/null +++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java @@ -0,0 +1,70 @@ +package com.baeldung.modelmapper; + +/** + * User model entity class + * + * @author Sasa Milenkovic + */ +public class User { + + private String userId; + private String username; + private String email; + private String contactNumber; + private String userType; + + // Standard constructors, getters and setters + + public User() { + } + + public User(String userId, String username, String email, String contactNumber, String userType) { + this.userId = userId; + this.username = username; + this.email = email; + this.contactNumber = contactNumber; + this.userType = userType; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String userName) { + this.username = userName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getContactNumber() { + return contactNumber; + } + + public void setContactNumber(String contactNumber) { + this.contactNumber = contactNumber; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + +} diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java new file mode 100644 index 0000000000..b67bb58ef4 --- /dev/null +++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java @@ -0,0 +1,41 @@ +package com.baeldung.modelmapper; + +/** + * UserDTO model class + * + * @author Sasa Milenkovic + */ +public class UserDTO { + + private String userId; + private String username; + private String email; + + // getters and setters + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + +} diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java new file mode 100644 index 0000000000..7b6bed807b --- /dev/null +++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java @@ -0,0 +1,21 @@ +package com.baeldung.modelmapper; + +import java.util.Collection; + +/** + * UserList class that contain collection of users + * + * @author Sasa Milenkovic + */ +public class UserList { + + private Collection users; + + public Collection getUsers() { + return users; + } + + public void setUsers(Collection users) { + this.users = users; + } +} diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java new file mode 100644 index 0000000000..c001cbbc3c --- /dev/null +++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java @@ -0,0 +1,21 @@ +package com.baeldung.modelmapper; + +import java.util.List; + +/** + * UserListDTO class that contain list of username properties + * + * @author Sasa Milenkovic + */ +public class UserListDTO { + + private List usernames; + + public List getUsernames() { + return usernames; + } + + public void setUsernames(List usernames) { + this.usernames = usernames; + } +} diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java new file mode 100644 index 0000000000..19423713e2 --- /dev/null +++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java @@ -0,0 +1,23 @@ +package com.baeldung.modelmapper; + +import org.modelmapper.AbstractConverter; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * UsersListConverter class map the property data from the list of users into the list of user names. + * + * @author Sasa Milenkovic + */ +public class UsersListConverter extends AbstractConverter, List> { + + @Override + protected List convert(List users) { + + return users + .stream() + .map(User::getUsername) + .collect(Collectors.toList()); + } +} diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java new file mode 100644 index 0000000000..565c938d48 --- /dev/null +++ b/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.arrayconversion; + +import org.assertj.core.api.ListAssert; +import org.hamcrest.CoreMatchers; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ArrayToListConversionUnitTest { + + @Test(expected = UnsupportedOperationException.class) + public void givenAnArray_whenConvertingToList_returnUnmodifiableListUnitTest() { + String[] stringArray = new String[] { "A", "B", "C", "D" }; + List stringList = Arrays.asList(stringArray); + stringList.set(0, "E"); + assertThat(stringList).containsExactly("E", "B", "C", "D"); + assertThat(stringArray).containsExactly("E", "B", "C", "D"); + stringList.add("F"); + } + + @Test + public void givenAnArray_whenConvertingToList_returnModifiableListUnitTest() { + String[] stringArray = new String[] { "A", "B", "C", "D" }; + List stringList = new ArrayList<>(Arrays.asList(stringArray)); + stringList.set(0, "E"); + assertThat(stringList).containsExactly("E", "B", "C", "D"); + assertThat(stringArray).containsExactly("A", "B", "C", "D"); + stringList.add("F"); + assertThat(stringList).containsExactly("E", "B", "C", "D", "F"); + } +} diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java new file mode 100644 index 0000000000..73cf9d6baa --- /dev/null +++ b/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java @@ -0,0 +1,135 @@ +package com.baeldung.convertarraytostring; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; + +public class ArrayToStringUnitTest { + + // convert with Java + + @Test + public void givenAStringArray_whenConvertBeforeJava8_thenReturnString() { + + String[] strArray = { "Convert", "Array", "With", "Java" }; + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < strArray.length; i++) { + stringBuilder.append(strArray[i]); + } + String joinedString = stringBuilder.toString(); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertArrayWithJava", joinedString); + } + + @Test + public void givenAString_whenConvertBeforeJava8_thenReturnStringArray() { + + String input = "lorem ipsum dolor sit amet"; + String[] strArray = input.split(" "); + + assertThat(strArray, instanceOf(String[].class)); + assertEquals(5, strArray.length); + + input = "loremipsum"; + strArray = input.split(""); + assertThat(strArray, instanceOf(String[].class)); + assertEquals(10, strArray.length); + } + + @Test + public void givenAnIntArray_whenConvertBeforeJava8_thenReturnString() { + + int[] strArray = { 1, 2, 3, 4, 5 }; + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < strArray.length; i++) { + stringBuilder.append(Integer.valueOf(strArray[i])); + } + String joinedString = stringBuilder.toString(); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("12345", joinedString); + } + + // convert with Java Stream API + + @Test + public void givenAStringArray_whenConvertWithJavaStream_thenReturnString() { + + String[] strArray = { "Convert", "With", "Java", "Streams" }; + String joinedString = Arrays.stream(strArray) + .collect(Collectors.joining()); + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertWithJavaStreams", joinedString); + + joinedString = Arrays.stream(strArray) + .collect(Collectors.joining(",")); + assertThat(joinedString, instanceOf(String.class)); + assertEquals("Convert,With,Java,Streams", joinedString); + } + + + // convert with Apache Commons + + @Test + public void givenAStringArray_whenConvertWithApacheCommons_thenReturnString() { + + String[] strArray = { "Convert", "With", "Apache", "Commons" }; + String joinedString = StringUtils.join(strArray); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertWithApacheCommons", joinedString); + } + + @Test + public void givenAString_whenConvertWithApacheCommons_thenReturnStringArray() { + + String input = "lorem ipsum dolor sit amet"; + String[] strArray = StringUtils.split(input, " "); + + assertThat(strArray, instanceOf(String[].class)); + assertEquals(5, strArray.length); + } + + + // convert with Guava + + @Test + public void givenAStringArray_whenConvertWithGuava_thenReturnString() { + + String[] strArray = { "Convert", "With", "Guava", null }; + String joinedString = Joiner.on("") + .skipNulls() + .join(strArray); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertWithGuava", joinedString); + } + + + @Test + public void givenAString_whenConvertWithGuava_thenReturnStringArray() { + + String input = "lorem ipsum dolor sit amet"; + + List resultList = Splitter.on(' ') + .trimResults() + .omitEmptyStrings() + .splitToList(input); + String[] strArray = resultList.toArray(new String[0]); + + assertThat(strArray, instanceOf(String[].class)); + assertEquals(5, strArray.length); + } +} diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java new file mode 100644 index 0000000000..2b43813822 --- /dev/null +++ b/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.convertlisttomap; + +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; + +public class ListToMapUnitTest { + + private ListToMapConverter converter; + private List source; + + @Before + public void setUp() { + converter = new ListToMapConverter(); + source = Arrays.asList("List", "Map", "Set", "Tree"); + } + + @Test + public void givenAList_whenConvertWithJava8GroupBy_thenReturnMap() { + Map> convertedMap = converter.groupingByStringLength(source, HashMap::new, ArrayList::new); + assertTrue(convertedMap.get(3) + .contains("Map")); + } + + @Test + public void givenAList_whenConvertWithJava8Collect_thenReturnMap() { + Map> convertedMap = converter.streamCollectByStringLength(source, HashMap::new, ArrayList::new); + assertTrue(convertedMap.get(3) + .contains("Map")); + } + + @Test + public void givenAList_whenConvertWithCollectorToMap_thenReturnMap() { + Map> convertedMap = converter.collectorToMapByStringLength(source, HashMap::new, ArrayList::new); + assertTrue(convertedMap.get(3) + .contains("Map")); + } + +} diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java new file mode 100644 index 0000000000..a8a72b12f7 --- /dev/null +++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.modelmapper; + +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Test; +import org.modelmapper.ModelMapper; +import org.modelmapper.TypeMap; +import org.modelmapper.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasProperty; +import static org.junit.Assert.assertThat; + + +/** + * This class has test methods of mapping Integer to Character list, + * mapping users list to DTO list using MapperUtil custom type method and property mapping using converter class + * + * @author Sasa Milenkovic + */ +public class UsersListMappingUnitTest { + + private ModelMapper modelMapper; + private List users; + + @Before + public void init() { + + modelMapper = new ModelMapper(); + + TypeMap typeMap = modelMapper.createTypeMap(UserList.class, UserListDTO.class); + + typeMap.addMappings(mapper -> mapper.using(new UsersListConverter()) + .map(UserList::getUsers, UserListDTO::setUsernames)); + + users = new ArrayList(); + users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER")); + users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER")); + users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN")); + + } + + @Test + public void whenInteger_thenMapToCharacter() { + + List integers = new ArrayList(); + + integers.add(1); + integers.add(2); + integers.add(3); + + List characters = modelMapper.map(integers, new TypeToken>() { + }.getType()); + + assertThat(characters, hasItems('1', '2', '3')); + + } + + @Test + public void givenUsersList_whenUseGenericType_thenMapToUserDTO() { + + // Mapping lists using custom (generic) type mapping + + List userDtoList = MapperUtil.mapList(users, UserDTO.class); + + assertThat(userDtoList, Matchers.hasItem( + Matchers.both(hasProperty("userId", equalTo("b100"))) + .and(hasProperty("email", equalTo("user1@baeldung.com"))) + .and(hasProperty("username", equalTo("user1"))))); + + + } + + @Test + public void givenUsersList_whenUseConverter_thenMapToUsernames() { + + // Mapping lists using property mapping and converter + + UserList userList = new UserList(); + userList.setUsers(users); + UserListDTO dtos = new UserListDTO(); + modelMapper.map(userList, dtos); + + assertThat(dtos.getUsernames(), hasItems("user1", "user2", "user3")); + + } + +} \ No newline at end of file diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java b/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java new file mode 100644 index 0000000000..ee0943ec1c --- /dev/null +++ b/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java @@ -0,0 +1,74 @@ +package com.baeldung.setiteration; + +import com.google.common.collect.Sets; +import io.vavr.collection.Stream; +import org.junit.jupiter.api.Test; + +import java.util.Iterator; +import java.util.Set; +import java.util.stream.Collectors; + +class SetIteration { + + @Test + void givenSet_whenIteratorUsed_shouldIterateOverElements() { + // given + Set names = Sets.newHashSet("Tom", "Jane", "Karen"); + + // when + Iterator namesIterator1 = names.iterator(); + Iterator namesIterator2 = names.iterator(); + + // then + namesIterator1.forEachRemaining(System.out::println); + while(namesIterator2.hasNext()) { + System.out.println(namesIterator2.next()); + } + } + + @Test + void givenSet_whenStreamUsed_shouldIterateOverElements() { + // given + Set names = Sets.newHashSet("Tom", "Jane", "Karen"); + + // when & then + String namesJoined = names.stream() + .map(String::toUpperCase) + .peek(System.out::println) + .collect(Collectors.joining()); + } + + @Test + void givenSet_whenEnhancedLoopUsed_shouldIterateOverElements() { + // given + Set names = Sets.newHashSet("Tom", "Jane", "Karen"); + + // when & then + for (String name : names) { + System.out.println(name); + } + } + + @Test + void givenSet_whenMappedToArray_shouldIterateOverElements() { + // given + Set names = Sets.newHashSet("Tom", "Jane", "Karen"); + + // when & then + Object[] namesArray = names.toArray(); + for (int i = 0; i < namesArray.length; i++) { + System.out.println(i + ": " + namesArray[i]); + } + } + + @Test + void givenSet_whenZippedWithIndex_shouldIterateOverElements() { + // given + Set names = Sets.newHashSet("Tom", "Jane", "Karen"); + + // when & then + Stream.ofAll(names) + .zipWithIndex() + .forEach(t -> System.out.println(t._2() + ": " + t._1())); + } +} diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml index ebebb80dd5..b6f97ac4be 100644 --- a/java-collections-conversions/pom.xml +++ b/java-collections-conversions/pom.xml @@ -17,12 +17,6 @@ - - org.assertj - assertj-core - 3.17.2 - test - org.apache.commons commons-collections4 diff --git a/java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java b/java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java index cd8641b8a7..153d515d1b 100644 --- a/java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java +++ b/java-collections-conversions/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java @@ -10,6 +10,22 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +/** + *

+ * ArrayToListConversionUnitTest + *

+ *

+ * + * @author YuCheng + */ + + /*Line 1 + Line 2 + Line 3*/ + public class ArrayToListConversionUnitTest { @Test(expected = UnsupportedOperationException.class) diff --git a/parent-java/pom.xml b/parent-java/pom.xml index aad1572729..08dcf7ecf1 100644 --- a/parent-java/pom.xml +++ b/parent-java/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.ossez parent-java - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT parent-java Parent for all java modules pom @@ -11,7 +11,7 @@ com.ossez parent-modules - 0.0.1 + 0.0.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index e71dbf6beb..cc3d3bf7ce 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ + parent-java toolkits @@ -77,6 +78,7 @@ 1.9.0 + 2.4.4 diff --git a/toolkits/codebank/pom.xml b/toolkits/codebank/pom.xml index e9ff9aadc8..51e2342e48 100644 --- a/toolkits/codebank/pom.xml +++ b/toolkits/codebank/pom.xml @@ -11,7 +11,7 @@ com.ossez parent-java - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT ../../parent-java diff --git a/toolkits/discourse/pom.xml b/toolkits/discourse/pom.xml index 40dca25e9e..ab4642b1a5 100644 --- a/toolkits/discourse/pom.xml +++ b/toolkits/discourse/pom.xml @@ -11,7 +11,7 @@ com.ossez parent-java - 0.0.1-SNAPSHOT + 0.0.2-SNAPSHOT ../../parent-java From 1654988fe35e4c22931ca768055709a95e961d2c Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Fri, 13 Aug 2021 15:33:33 -0400 Subject: [PATCH 04/30] =?UTF-8?q?=E5=AF=B9=20Java=20=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=E8=BF=9B=E8=A1=8C=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=92=8C=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 8 ++ .idea/encodings.xml | 5 + .idea/misc.xml | 1 + .idea/modules.xml | 4 + .idea/workspace.xml | 77 ++++++++++----- .../core-java-annotations/pom.xml | 8 +- .../core-java-datetime-conversion/README.md | 9 ++ .../core-java-datetime-conversion/pom.xml | 72 ++++++++++++++ .../DateToLocalDateConverter.java | 39 ++++++++ .../DateToLocalDateTimeConverter.java | 39 ++++++++ .../LocalDateTimeToDateConverter.java | 27 ++++++ .../LocalDateToDateConverter.java | 28 ++++++ .../convert/ConvertDateTimeUnitTest.java | 59 +++++++++++ .../ConvertInstantToTimestampUnitTest.java | 45 +++++++++ .../DateToLocalDateConverterUnitTest.java | 89 +++++++++++++++++ .../DateToLocalDateTimeConverterUnitTest.java | 97 +++++++++++++++++++ .../LocalDateTimeToDateConverterUnitTest.java | 63 ++++++++++++ .../LocalDateToDateConverterUnitTest.java | 57 +++++++++++ ...XmlGregorianCalendarConverterUnitTest.java | 36 +++++++ core-java-modules/core-java-io/pom.xml | 23 ++--- core-java-modules/pom.xml | 17 ++-- java-collections-conversions-2/README.md | 4 +- persistence-modules/activejdbc/pom.xml | 2 +- pom.xml | 13 ++- .../algorithm/tests/VariableTest.java | 1 + 25 files changed, 770 insertions(+), 53 deletions(-) create mode 100644 core-java-modules/core-java-datetime-conversion/README.md create mode 100644 core-java-modules/core-java-datetime-conversion/pom.xml create mode 100644 core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b00cdc2dd1..1464860f04 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,18 +2,26 @@ + + + + + + + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 6ab87fde96..ef7546175b 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,11 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index 94bf04de8e..989935de3e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -6,6 +6,7 @@ diff --git a/.idea/modules.xml b/.idea/modules.xml index ca48a0f8ca..5d3bd2d54d 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,10 @@ + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b801c976d4..516b42fa67 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,33 +4,32 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - + + + + + - - + - + + + + + + + + + @@ -133,6 +150,8 @@ 1619410137650 + + 1619410303516 @@ -141,7 +160,14 @@ - @@ -161,6 +187,7 @@ - \ No newline at end of file diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml index 9a21ed8b3b..82dc9275d9 100644 --- a/core-java-modules/core-java-annotations/pom.xml +++ b/core-java-modules/core-java-annotations/pom.xml @@ -8,10 +8,10 @@ jar - com.ossez - parent-java - 0.0.1-SNAPSHOT - ../../parent-java + com.ossez.core-java-modules + core-java-modules + 0.0.2-SNAPSHOT + ../ diff --git a/core-java-modules/core-java-datetime-conversion/README.md b/core-java-modules/core-java-datetime-conversion/README.md new file mode 100644 index 0000000000..2503459f50 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/README.md @@ -0,0 +1,9 @@ +## Java Date/time conversion Cookbooks and Examples + +This module contains articles about converting between Java date and time objects. + +### Relevant Articles: +- [Converting Between LocalDate and XMLGregorianCalendar](https://www.baeldung.com/java-localdate-to-xmlgregoriancalendar) +- [Convert Time to Milliseconds in Java](https://www.baeldung.com/java-time-milliseconds) +- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime) +- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp) diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml new file mode 100644 index 0000000000..4f9799e363 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + core-java-datetime-conversion + ${project.parent.version} + core-java-datetime-conversion + jar + + + com.ossez.core-java-modules + core-java-modules + 0.0.2-SNAPSHOT + ../ + + + + + joda-time + joda-time + ${joda-time.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + log4j + log4j + ${log4j.version} + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + core-java-datetime-conversion + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + 2.10 + + 3.6.1 + 1.9 + 1.9 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java new file mode 100644 index 0000000000..80bccb399a --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows a way to convert java.util.Date into java.time.LocalDate. + * + * @author abialas + * + */ +public class DateToLocalDateConverter { + + public static LocalDate convertToLocalDateViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + + public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { + return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); + } + + public static LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + + public static LocalDate convertToLocalDate(Date dateToConvert) { + return LocalDate.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java new file mode 100644 index 0000000000..1d1e3b7d92 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows a way to convert java.util.Date into java.time.LocalDateTime. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverter { + + public static LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { + return new java.sql.Timestamp(dateToConvert.getTime()).toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTime(Date dateToConvert) { + return LocalDateTime.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java new file mode 100644 index 0000000000..9a6bb248fa --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java @@ -0,0 +1,27 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.time.LocalDateTime into java.util.Date. + * + * @author abialas + * + */ +public class LocalDateTimeToDateConverter { + + public static Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) { + return java.sql.Timestamp.valueOf(dateToConvert); + } + + public static Date convertToDateViaInstant(LocalDateTime dateToConvert) { + return java.util.Date.from(dateToConvert.atZone(ZoneId.systemDefault()) + .toInstant()); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java new file mode 100644 index 0000000000..f679ffb77a --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java @@ -0,0 +1,28 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.time.LocalDate into java.util.Date. + * + * @author abialas + * + */ +public class LocalDateToDateConverter { + + public static Date convertToDateViaSqlDate(LocalDate dateToConvert) { + return java.sql.Date.valueOf(dateToConvert); + } + + public static Date convertToDateViaInstant(LocalDate dateToConvert) { + return java.util.Date.from(dateToConvert.atStartOfDay() + .atZone(ZoneId.systemDefault()) + .toInstant()); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java new file mode 100644 index 0000000000..cd31ccc799 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java @@ -0,0 +1,59 @@ +package com.baeldung.convert; + +import org.joda.time.Instant; +import org.junit.Assert; +import org.junit.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Calendar; +import java.util.Date; + +public class ConvertDateTimeUnitTest { + + public final long millis = 1556175797428L; + + @Test + public void givenLocalDateTime_WhenToEpochMillis_ThenMillis() { + ZoneId id = ZoneId.systemDefault(); + + LocalDateTime localDateTime = + LocalDateTime.ofInstant(java.time.Instant.ofEpochMilli(millis), id); + + ZonedDateTime zdt = ZonedDateTime.of(localDateTime, id); + + Assert.assertEquals(millis, zdt.toInstant().toEpochMilli()); + } + + @Test + public void givenJava8Instant_WhenGToEpochMillis_ThenMillis() { + java.time.Instant instant = java.time.Instant.ofEpochMilli(millis); + Assert.assertEquals(millis, instant.toEpochMilli()); + } + + @Test + public void givenDate_WhenGetTime_ThenMillis() { + Date date = new Date(millis); + Assert.assertEquals(millis, date.getTime()); + } + + @Test + public void givenCalendar_WhenGetTimeInMillis_ThenMillis() { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date(millis)); + Assert.assertEquals(millis, calendar.getTimeInMillis()); + } + + @Test + public void givenJodaInstant_WhenGetMillis_ThenMillis() { + Instant jodaInstant = Instant.ofEpochMilli(millis); + Assert.assertEquals(millis, jodaInstant.getMillis()); + } + + @Test + public void givenJODADateTime_WhenGetMillis_ThenMillis() { + org.joda.time.DateTime jodaDateTime = new org.joda.time.DateTime(millis); + Assert.assertEquals(millis, jodaDateTime.getMillis()); + } +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java new file mode 100644 index 0000000000..45d6354606 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.datetime; + +import java.time.LocalDateTime; +import org.joda.time.DateTimeZone; +//import org.joda.time.format.ISODateTimeFormat; +//import org.joda.time.format.DateTimeFormatter; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; +import java.time.temporal.ChronoUnit; +import java.util.TimeZone; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ConvertInstantToTimestampUnitTest { + + private final static Logger logger = LoggerFactory.getLogger(ConvertInstantToTimestampUnitTest.class); + + @Test + public void givenInstant_whenConvertedToTimestamp_thenGetTimestampWithSamePointOnTimeline() { + Instant instant = Instant.now(); + Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant + assertThat(instant.toEpochMilli()).isEqualTo(timestamp.getTime()); + + instant = timestamp.toInstant(); + assertThat(instant.toEpochMilli()).isEqualTo(timestamp.getTime()); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + formatter = formatter.withZone(TimeZone.getTimeZone("UTC").toZoneId()); + + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + assertThat(formatter.format(instant)).isEqualTo(df.format(timestamp)); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java new file mode 100644 index 0000000000..b5a54e28eb --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java @@ -0,0 +1,89 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.datetolocaldate.DateToLocalDateConverter; + +/** + * JUnits for {@link DateToLocalDateConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateConverterUnitTest { + + @Test + public void shouldReturn10thNovember2010WhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaInstant(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaSqlDate(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertToLocalDate() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDateTime = DateToLocalDateConverter.convertToLocalDate(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java new file mode 100644 index 0000000000..e6098cec1c --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java @@ -0,0 +1,97 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.datetolocaldate.DateToLocalDateTimeConverter; + +/** + * JUnits for {@link DateToLocalDateTimeConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverterUnitTest { + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaInstant(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaSqlTimestamp() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaSqlTimestamp(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertToLocalDateTime() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTime(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java new file mode 100644 index 0000000000..c8e596c220 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java @@ -0,0 +1,63 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.datetolocaldate.LocalDateTimeToDateConverter; + +/** + * + * JUnits for {@link LocalDateTimeToDateConverter} class. + * + * @author abialas + * + */ +public class LocalDateTimeToDateConverterUnitTest { + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { + // given + LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20); + + // when + Date date = LocalDateTimeToDateConverter.convertToDateViaInstant(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + assertEquals(8, calendar.get(Calendar.HOUR)); + assertEquals(20, calendar.get(Calendar.MINUTE)); + assertEquals(0, calendar.get(Calendar.SECOND)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlTimestamp() { + // given + LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20); + + // when + Date date = LocalDateTimeToDateConverter.convertToDateViaSqlTimestamp(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + assertEquals(8, calendar.get(Calendar.HOUR)); + assertEquals(20, calendar.get(Calendar.MINUTE)); + assertEquals(0, calendar.get(Calendar.SECOND)); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java new file mode 100644 index 0000000000..4ff3682158 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java @@ -0,0 +1,57 @@ +/** + * + */ +package com.baeldung.datetolocaldate; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.datetolocaldate.LocalDateToDateConverter; + +/** + * + * JUnits for {@link LocalDateToDateConverter} class. + * + * @author abialas + * + */ +public class LocalDateToDateConverterUnitTest { + + @Test + public void shouldReturn10thNovember2010WhenConvertViaInstant() { + // given + LocalDate dateToConvert = LocalDate.of(2010, 11, 10); + + // when + Date date = LocalDateToDateConverter.convertToDateViaInstant(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { + // given + LocalDate dateToConvert = LocalDate.of(2010, 11, 10); + + // when + Date date = LocalDateToDateConverter.convertToDateViaSqlDate(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + } + +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java new file mode 100644 index 0000000000..b221c04199 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.xmlgregoriancalendar; + +import org.junit.Test; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeConstants; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; +import java.time.LocalDate; + +import static org.assertj.core.api.Assertions.assertThat; + +public class XmlGregorianCalendarConverterUnitTest { + + @Test + public void fromLocalDateToXMLGregorianCalendar() throws DatatypeConfigurationException { + LocalDate localDate = LocalDate.of(2017, 4, 25); + XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(localDate.toString()); + + assertThat(xmlGregorianCalendar.getYear()).isEqualTo(localDate.getYear()); + assertThat(xmlGregorianCalendar.getMonth()).isEqualTo(localDate.getMonthValue()); + assertThat(xmlGregorianCalendar.getDay()).isEqualTo(localDate.getDayOfMonth()); + assertThat(xmlGregorianCalendar.getTimezone()).isEqualTo(DatatypeConstants.FIELD_UNDEFINED); + } + + @Test + public void fromXMLGregorianCalendarToLocalDate() throws DatatypeConfigurationException { + XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar("2017-04-25"); + LocalDate localDate = LocalDate.of(xmlGregorianCalendar.getYear(), xmlGregorianCalendar.getMonth(), xmlGregorianCalendar.getDay()); + + assertThat(localDate.getYear()).isEqualTo(xmlGregorianCalendar.getYear()); + assertThat(localDate.getMonthValue()).isEqualTo(xmlGregorianCalendar.getMonth()); + assertThat(localDate.getDayOfMonth()).isEqualTo(xmlGregorianCalendar.getDay()); + } + +} diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index d97430f09e..d910e98e56 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -1,16 +1,16 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-io - 0.0.1 + ${project.parent.version} core-java-io jar - com.ossez - parent-java - 0.0.1 - ../../parent-java + com.ossez.core-java-modules + core-java-modules + 0.0.2-SNAPSHOT + ../ @@ -76,7 +76,7 @@ org.slf4j log4j-over-slf4j - ${org.slf4j.version} + ${slf4j.version} org.projectlombok @@ -105,7 +105,8 @@ org.javamoney moneta - ${moneta.version} + 1.4.2 + pom org.owasp.esapi @@ -198,7 +199,7 @@ -Xmx300m -XX:+UseParallelGC -classpath - + com.ossez.outofmemoryerror.OutOfMemoryGCLimitExceed @@ -212,7 +213,7 @@ ${maven.compiler.target} - + org.apache.maven.plugins @@ -252,7 +253,7 @@ java -classpath - + org.openjdk.jmh.Main .* diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 7114da934a..bf08f30b41 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -1,24 +1,23 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.ossez.core-java-modules core-java-modules core-java-modules pom - + parent-modules com.ossez - 1.0.0-SNAPSHOT + 0.0.2-SNAPSHOT + ../parent-java - pre-jpms - core-java-optional - core-java-lang-operators - core-java-networking-2 - core-java-security-manager + core-java-annotations + core-java-datetime-conversion + core-java-io - + diff --git a/java-collections-conversions-2/README.md b/java-collections-conversions-2/README.md index 83b3ec8786..bf5f7ced73 100644 --- a/java-collections-conversions-2/README.md +++ b/java-collections-conversions-2/README.md @@ -4,9 +4,9 @@ This module contains articles about conversions among Collection types and array ### Relevant Articles: -- [Array to String Conversions](https://www.baeldung.com/java-array-to-string) +- [Java Array 和 String 的转换](https://www.ossez.com/t/java-array-string/13685) - [Mapping Lists with ModelMapper](https://www.baeldung.com/java-modelmapper-lists) - [Converting List to Map With a Custom Supplier](https://www.baeldung.com/list-to-map-supplier) -- [Arrays.asList vs new ArrayList(Arrays.asList())](https://www.baeldung.com/java-arrays-aslist-vs-new-arraylist) +- [Java Arrays.asList 和 new ArrayList(Arrays.asList()) 的对比](https://www.ossez.com/t/java-arrays-aslist-new-arraylist-arrays-aslist/13680) - [Iterate Over a Set in Java](https://www.baeldung.com/java-iterate-set) - More articles: [[<-- prev]](../java-collections-conversions) diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml index 7eef65b48c..e971c3859f 100644 --- a/persistence-modules/activejdbc/pom.xml +++ b/persistence-modules/activejdbc/pom.xml @@ -34,7 +34,7 @@ org.slf4j slf4j-simple - ${org.slf4j.version} + ${version.slf4j} diff --git a/pom.xml b/pom.xml index cc3d3bf7ce..ea06c89b58 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,7 @@ 1.7.30 + 1.2.17 2.2 @@ -71,6 +72,9 @@ 2.6.8 2.3.2 + + 2.12.4 + 4.11 2.2 @@ -79,7 +83,12 @@ 1.9.0 2.4.4 - + 1.18.20 + 1.3 + 1.33 + 3.0.0 + 2.21.0 + 3.8.1 @@ -118,6 +127,8 @@ 2.7.6
+ + dom4j dom4j diff --git a/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java b/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java index a4cfa28a76..e5dc576f65 100644 --- a/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java +++ b/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java @@ -44,6 +44,7 @@ public class VariableTest extends TestCase { OssezVariable objB = new OssezVariable(4, 5, 6); logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objA.s1, objA.s2, OssezVariable.s3); logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objB.s1, objB.s2, OssezVariable.s3); + } } From a32b2971eafa618c65cc6723bd4506925e5d8cfc Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Wed, 1 Sep 2021 16:15:22 -0400 Subject: [PATCH 05/30] =?UTF-8?q?JSON=20=E6=95=B0=E6=8D=AE=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/to-java-collection/books.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.json diff --git a/jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.json b/jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.json new file mode 100644 index 0000000000..6daf426736 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.json @@ -0,0 +1,13 @@ +[ { + "bookId" : 1, + "title" : "A Song of Ice and Fire", + "author" : "George R. R. Martin" +}, { + "bookId" : 2, + "title" : "The Hitchhiker's Guide to the Galaxy", + "author" : "Douglas Adams" +}, { + "bookId" : 3, + "title" : "Hackers And Painters", + "author" : "Paul Graham" +} ] From 103e960eda9977ed097b135e1ad3d6931264d3e3 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 9 Sep 2021 13:43:33 -0400 Subject: [PATCH 06/30] Core Java for loop test --- .../com/ossez/java8/Java8ForEachUnitTest.java | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8ForEachUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8ForEachUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8ForEachUnitTest.java new file mode 100644 index 0000000000..8c1a2fba03 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8ForEachUnitTest.java @@ -0,0 +1,133 @@ +package com.ossez.java8; + +import java.util.*; +import java.util.function.Consumer; + + +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Java8ForEachUnitTest { + + private static final Logger logger = LoggerFactory.getLogger(Java8ForEachUnitTest.class); + + @Test + public void compareForEachMethods_thenPrintResults() { + + List names = new ArrayList<>(); + names.add("Larry"); + names.add("Steve"); + names.add("James"); + names.add("Conan"); + names.add("Ellen"); + + // Java 5 - for-loop + logger.debug("--- Enhanced for-loop ---"); + for (String name : names) { + logger.debug(name); + } + + // Java 8 - forEach + names.forEach(name -> { + System.out.println(name); + }); + + logger.debug("--- Print Consumer ---"); + Consumer printConsumer = new Consumer() { + public void accept(String name) { + System.out.println(name); + } + + ; + }; + + names.forEach(printConsumer); + + // Anonymous inner class that implements Consumer interface + logger.debug("--- Anonymous inner class ---"); + names.forEach(new Consumer() { + public void accept(String name) { + logger.debug(name); + } + }); + + // Java 8 - forEach - Lambda Syntax + logger.debug("--- forEach method ---"); + names.forEach(name -> logger.debug(name)); + + // Java 8 - forEach - Print elements using a Method Reference + logger.debug("--- Method Reference ---"); + names.forEach(logger::debug); + } + + @Test + public void givenList_thenIterateAndPrintResults() { + List names = Arrays.asList("Larry", "Steve", "James"); + + names.forEach(System.out::println); + } + + @Test + public void givenSet_thenIterateAndPrintResults() { + Set uniqueNames = new HashSet<>(Arrays.asList("Larry", "Steve", "James")); + + uniqueNames.forEach(System.out::println); + } + + @Test + public void givenQueue_thenIterateAndPrintResults() { + Queue namesQueue = new ArrayDeque<>(Arrays.asList("Larry", "Steve", "James")); + + namesQueue.forEach(System.out::println); + } + + @Test + public void givenMap_thenIterateAndPrintResults() { + Map namesMap = new HashMap<>(); + namesMap.put(1, "Larry"); + namesMap.put(2, "Steve"); + namesMap.put(3, "James"); + + namesMap.entrySet() + .forEach(entry -> System.out.println(entry.getKey() + " " + entry.getValue())); + } + + @Test + public void givenMap_whenUsingBiConsumer_thenIterateAndPrintResults2() { + Map namesMap = new HashMap<>(); + namesMap.put(1, "Larry"); + namesMap.put(2, "Steve"); + namesMap.put(3, "James"); + + namesMap.forEach((key, value) -> System.out.println(key + " " + value)); + } + + @Test + public void testIteratorAndFor() { + List testList = Arrays.asList("A", "B", "C"); + + Iterator iterator = testList.iterator(); + while (iterator.hasNext()) { + logger.debug((String) iterator.next()); + + } + + logger.debug("--- FOR ---"); + for (int i = 0; i < testList.size(); i++) { + logger.debug("{} > {}", i, testList.get(i)); + } + + logger.debug("--- FOR LOOP ---"); + for (String s : testList) { + logger.debug(s); + } + + logger.debug("--- FOR EACH ---"); + testList.forEach(s -> { + logger.debug(s); + }); + } + +} From 7d0cf99b3d9bee2ba592be5f7f5429415a389ce3 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Wed, 22 Sep 2021 17:34:51 -0400 Subject: [PATCH 07/30] Add java numbers --- java-numbers-2/.idea/.gitignore | 8 + java-numbers-2/.idea/compiler.xml | 13 ++ java-numbers-2/.idea/encodings.xml | 6 + java-numbers-2/.idea/jarRepositories.xml | 20 ++ java-numbers-2/.idea/misc.xml | 12 ++ java-numbers-2/.idea/runConfigurations.xml | 10 + java-numbers-2/.idea/vcs.xml | 6 + java-numbers-2/README.md | 16 ++ java-numbers-2/pom.xml | 45 +++++ .../primechecker/BigIntegerPrimeChecker.java | 13 ++ .../primechecker/BruteForcePrimeChecker.java | 14 ++ .../primechecker/OptimisedPrimeChecker.java | 13 ++ .../algorithms/primechecker/PrimeChecker.java | 6 + .../primechecker/PrimesPrimeChecker.java | 12 ++ .../java/com/ossez/area/circle/Circle.java | 26 +++ .../com/ossez/area/circle/CircleArea.java | 36 ++++ .../ossez/binarynumbers/BinaryNumbers.java | 140 ++++++++++++++ .../java/com/ossez/lcm/BigIntegerLCM.java | 13 ++ .../com/ossez/lcm/EuclideanAlgorithm.java | 40 ++++ .../lcm/PrimeFactorizationAlgorithm.java | 42 +++++ .../java/com/ossez/lcm/SimpleAlgorithm.java | 18 ++ .../main/java/com/ossez/nan/NaNExample.java | 81 ++++++++ .../main/java/com/ossez/pow/PowerExample.java | 19 ++ .../java/com/ossez/prime/PrimeGenerator.java | 59 ++++++ .../primechecker/PrimeCheckerUnitTest.java | 74 ++++++++ .../binarynumbers/BinaryNumbersUnitTest.java | 73 ++++++++ .../com/ossez/java/math/MathUnitTest.java | 175 ++++++++++++++++++ .../com/ossez/lcm/BigIntegerLCMUnitTest.java | 18 ++ .../ossez/lcm/EuclideanAlgorithmUnitTest.java | 27 +++ .../PrimeFactorizationAlgorithmUnitTest.java | 28 +++ .../ossez/lcm/SimpleAlgorithmUnitTest.java | 13 ++ .../ConversionTechniquesUnitTest.java | 68 +++++++ .../ossez/prime/PrimeGeneratorUnitTest.java | 29 +++ .../primechecker/PrimeCheckerUnitTest.java | 72 +++++++ 34 files changed, 1245 insertions(+) create mode 100644 java-numbers-2/.idea/.gitignore create mode 100644 java-numbers-2/.idea/compiler.xml create mode 100644 java-numbers-2/.idea/encodings.xml create mode 100644 java-numbers-2/.idea/jarRepositories.xml create mode 100644 java-numbers-2/.idea/misc.xml create mode 100644 java-numbers-2/.idea/runConfigurations.xml create mode 100644 java-numbers-2/.idea/vcs.xml create mode 100644 java-numbers-2/README.md create mode 100644 java-numbers-2/pom.xml create mode 100644 java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java create mode 100644 java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java create mode 100644 java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java create mode 100644 java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java create mode 100644 java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java create mode 100644 java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java create mode 100644 java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java create mode 100644 java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java create mode 100644 java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java create mode 100644 java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java create mode 100644 java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java create mode 100644 java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java create mode 100644 java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java create mode 100644 java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java create mode 100644 java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java create mode 100644 java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java diff --git a/java-numbers-2/.idea/.gitignore b/java-numbers-2/.idea/.gitignore new file mode 100644 index 0000000000..73f69e0958 --- /dev/null +++ b/java-numbers-2/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/java-numbers-2/.idea/compiler.xml b/java-numbers-2/.idea/compiler.xml new file mode 100644 index 0000000000..0464686f1a --- /dev/null +++ b/java-numbers-2/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/java-numbers-2/.idea/encodings.xml b/java-numbers-2/.idea/encodings.xml new file mode 100644 index 0000000000..63e9001932 --- /dev/null +++ b/java-numbers-2/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java-numbers-2/.idea/jarRepositories.xml b/java-numbers-2/.idea/jarRepositories.xml new file mode 100644 index 0000000000..712ab9d985 --- /dev/null +++ b/java-numbers-2/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/java-numbers-2/.idea/misc.xml b/java-numbers-2/.idea/misc.xml new file mode 100644 index 0000000000..d31b37ac7b --- /dev/null +++ b/java-numbers-2/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/java-numbers-2/.idea/runConfigurations.xml b/java-numbers-2/.idea/runConfigurations.xml new file mode 100644 index 0000000000..797acea53e --- /dev/null +++ b/java-numbers-2/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/java-numbers-2/.idea/vcs.xml b/java-numbers-2/.idea/vcs.xml new file mode 100644 index 0000000000..6c0b863585 --- /dev/null +++ b/java-numbers-2/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md new file mode 100644 index 0000000000..1d996e32cc --- /dev/null +++ b/java-numbers-2/README.md @@ -0,0 +1,16 @@ +## Java Number Cookbooks and Examples + +This module contains articles about numbers in Java. + +### Relevant Articles +- [Lossy Conversion in Java](https://www.baeldung.com/java-lossy-conversion) +- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) +- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) +- [NaN in Java](https://www.baeldung.com/java-not-a-number) +- [Generating Prime Numbers in Java](https://www.baeldung.com/java-generate-prime-numbers) +- [Using Math.pow in Java](https://www.baeldung.com/java-math-pow) +- [Check If a Number Is Prime in Java](https://www.baeldung.com/java-prime-numbers) +- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) +- [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) +- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) +- More articles: [[<-- prev]](/java-numbers) [[next -->]](/java-numbers-3) diff --git a/java-numbers-2/pom.xml b/java-numbers-2/pom.xml new file mode 100644 index 0000000000..de25f0bb35 --- /dev/null +++ b/java-numbers-2/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + java-numbers-2 + ${parent.version} + java-numbers-2 + jar + + + com.ossez + parent-java + 0.0.2-SNAPSHOT + ../parent-java + + + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + + + it.unimi.dsi + dsiutils + ${dsiutils.version} + + + + + java-numbers-2 + + + src/main/resources + true + + + + + + 2.6.0 + + + \ No newline at end of file diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java new file mode 100644 index 0000000000..9075b5051e --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java @@ -0,0 +1,13 @@ +package com.ossez.algorithms.primechecker; + +import java.math.BigInteger; + +public class BigIntegerPrimeChecker implements PrimeChecker{ + + @Override + public boolean isPrime(Long number) { + BigInteger bigInt = BigInteger.valueOf(number); + return bigInt.isProbablePrime(100); + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java new file mode 100644 index 0000000000..3b1afbd1fe --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java @@ -0,0 +1,14 @@ +package com.ossez.algorithms.primechecker; + +import java.util.stream.IntStream; + +public class BruteForcePrimeChecker implements PrimeChecker { + + @Override + public boolean isPrime(Integer number) { + + return number > 1 ? IntStream.range(2, number) + .noneMatch(n -> (number % n == 0)) : false; + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java new file mode 100644 index 0000000000..c693ed7311 --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java @@ -0,0 +1,13 @@ +package com.ossez.algorithms.primechecker; + +import java.util.stream.IntStream; + +public class OptimisedPrimeChecker implements PrimeChecker { + + @Override + public boolean isPrime(Integer number) { + return number > 1 ? IntStream.rangeClosed(2, (int) Math.sqrt(number)) + .noneMatch(n -> (number % n == 0)) : false; + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java new file mode 100644 index 0000000000..f571afe58c --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java @@ -0,0 +1,6 @@ +package com.ossez.algorithms.primechecker; + +public interface PrimeChecker { + + public boolean isPrime( T number ); +} diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java new file mode 100644 index 0000000000..8fb8517d8d --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java @@ -0,0 +1,12 @@ +package com.ossez.algorithms.primechecker; + +import org.apache.commons.math3.primes.Primes; + +public class PrimesPrimeChecker implements PrimeChecker{ + + @Override + public boolean isPrime(Integer number) { + return Primes.isPrime(number); + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java b/java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java new file mode 100644 index 0000000000..4229f27353 --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java @@ -0,0 +1,26 @@ +package com.ossez.area.circle; + +public class Circle { + + private double radius; + + public Circle(double radius) { + this.radius = radius; + } + + public double getRadius() { + return radius; + } + + public void setRadius(double radius) { + this.radius = radius; + } + + private double calculateArea() { + return radius * radius * Math.PI; + } + + public String toString() { + return "The area of the circle [radius = " + radius + "]: " + calculateArea(); + } +} diff --git a/java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java b/java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java new file mode 100644 index 0000000000..5003547b27 --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java @@ -0,0 +1,36 @@ +package com.ossez.area.circle; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class CircleArea { + + public static void main(String[] args) { + if (args.length > 0) { + try { + double radius = Double.parseDouble(args[0]); + calculateArea(radius); + } catch (NumberFormatException nfe) { + System.out.println("Invalid value for radius"); + System.exit(0); + } + } + + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Please enter radius value: "); + double radius = scanner.nextDouble(); + calculateArea(radius); + } catch (InputMismatchException e) { + System.out.println("Invalid value for radius"); + System.exit(0); + } + + Circle circle = new Circle(7); + System.out.println(circle); + } + + private static void calculateArea(double radius) { + double area = radius * radius * Math.PI; + System.out.println("The area of the circle [radius = " + radius + "]: " + area); + } +} diff --git a/java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java b/java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java new file mode 100644 index 0000000000..8f941bb7bd --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java @@ -0,0 +1,140 @@ +package com.ossez.binarynumbers; + +public class BinaryNumbers { + + /** + * This method takes a decimal number and convert it into a binary number. + * example:- input:10, output:1010 + * + * @param decimalNumber + * @return binary number + */ + public Integer convertDecimalToBinary(Integer decimalNumber) { + + if (decimalNumber == 0) { + return decimalNumber; + } + + StringBuilder binaryNumber = new StringBuilder(); + Integer quotient = decimalNumber; + + while (quotient > 0) { + + int remainder = quotient % 2; + binaryNumber.append(remainder); + quotient /= 2; + } + + binaryNumber = binaryNumber.reverse(); + return Integer.valueOf(binaryNumber.toString()); + } + + /** + * This method takes a binary number and convert it into a decimal number. + * example:- input:101, output:5 + * + * @param binary number + * @return decimal Number + */ + public Integer convertBinaryToDecimal(Integer binaryNumber) { + + Integer decimalNumber = 0; + Integer base = 1; + + while (binaryNumber > 0) { + + int lastDigit = binaryNumber % 10; + binaryNumber = binaryNumber / 10; + + decimalNumber += lastDigit * base; + base = base * 2; + } + return decimalNumber; + } + + /** + * This method accepts two binary numbers and returns sum of input numbers. + * Example:- firstNum: 101, secondNum: 100, output: 1001 + * + * @param firstNum + * @param secondNum + * @return addition of input numbers + */ + public Integer addBinaryNumber(Integer firstNum, Integer secondNum) { + + StringBuilder output = new StringBuilder(); + + int carry = 0; + int temp; + + while (firstNum != 0 || secondNum != 0) { + + temp = (firstNum % 10 + secondNum % 10 + carry) % 2; + output.append(temp); + + carry = (firstNum % 10 + secondNum % 10 + carry) / 2; + + firstNum = firstNum / 10; + secondNum = secondNum / 10; + } + + if (carry != 0) { + output.append(carry); + } + + return Integer.valueOf(output.reverse() + .toString()); + } + + /** + * This method takes two binary number as input and subtract second number from the first number. + * example:- firstNum: 1000, secondNum: 11, output: 101 + * @param firstNum + * @param secondNum + * @return Result of subtraction of secondNum from first + */ + public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) { + + int onesComplement = Integer.valueOf(getOnesComplement(secondNum)); + StringBuilder output = new StringBuilder(); + int carry = 0; + int temp; + + while (firstNum != 0 || onesComplement != 0) { + + temp = (firstNum % 10 + onesComplement % 10 + carry) % 2; + output.append(temp); + + carry = (firstNum % 10 + onesComplement % 10 + carry) / 2; + + firstNum = firstNum / 10; + onesComplement = onesComplement / 10; + } + + String additionOfFirstNumAndOnesComplement = output.reverse() + .toString(); + + if (carry == 1) { + return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry); + } else { + return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement)); + } + } + + public Integer getOnesComplement(Integer num) { + + StringBuilder onesComplement = new StringBuilder(); + while (num > 0) { + int lastDigit = num % 10; + if (lastDigit == 0) { + onesComplement.append(1); + } else { + onesComplement.append(0); + } + num = num / 10; + } + return Integer.valueOf(onesComplement.reverse() + .toString()); + } + +} \ No newline at end of file diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java b/java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java new file mode 100644 index 0000000000..5c61817ac8 --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java @@ -0,0 +1,13 @@ +package com.ossez.lcm; + +import java.math.BigInteger; + +public class BigIntegerLCM { + + public static BigInteger lcm(BigInteger number1, BigInteger number2) { + BigInteger gcd = number1.gcd(number2); + BigInteger absProduct = number1.multiply(number2).abs(); + return absProduct.divide(gcd); + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java b/java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java new file mode 100644 index 0000000000..de169bf7fd --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java @@ -0,0 +1,40 @@ +package com.ossez.lcm; + +import java.util.Arrays; + +public class EuclideanAlgorithm { + + public static int gcd(int number1, int number2) { + if (number1 == 0 || number2 == 0) { + return number1 + number2; + } else { + int absNumber1 = Math.abs(number1); + int absNumber2 = Math.abs(number2); + int biggerValue = Math.max(absNumber1, absNumber2); + int smallerValue = Math.min(absNumber1, absNumber2); + return gcd(biggerValue % smallerValue, smallerValue); + } + } + + public static int lcm(int number1, int number2) { + if (number1 == 0 || number2 == 0) + return 0; + else { + int gcd = gcd(number1, number2); + return Math.abs(number1 * number2) / gcd; + } + } + + public static int lcmForArray(int[] numbers) { + int lcm = numbers[0]; + for (int i = 1; i <= numbers.length - 1; i++) { + lcm = lcm(lcm, numbers[i]); + } + return lcm; + } + + public static int lcmByLambda(int... numbers) { + return Arrays.stream(numbers).reduce(1, (lcmSoFar, currentNumber) -> Math.abs(lcmSoFar * currentNumber) / gcd(lcmSoFar, currentNumber)); + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java b/java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java new file mode 100644 index 0000000000..62872285d2 --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java @@ -0,0 +1,42 @@ +package com.ossez.lcm; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class PrimeFactorizationAlgorithm { + + public static Map getPrimeFactors(int number) { + int absNumber = Math.abs(number); + Map primeFactorsMap = new HashMap(); + for (int factor = 2; factor <= absNumber; factor++) { + while (absNumber % factor == 0) { + Integer power = primeFactorsMap.get(factor); + if (power == null) { + power = 0; + } + primeFactorsMap.put(factor, power + 1); + absNumber /= factor; + } + } + return primeFactorsMap; + } + + public static int lcm(int number1, int number2) { + if (number1 == 0 || number2 == 0) { + return 0; + } + Map primeFactorsForNum1 = getPrimeFactors(number1); + Map primeFactorsForNum2 = getPrimeFactors(number2); + Set primeFactorsUnionSet = new HashSet(primeFactorsForNum1.keySet()); + primeFactorsUnionSet.addAll(primeFactorsForNum2.keySet()); + int lcm = 1; + for (Integer primeFactor : primeFactorsUnionSet) { + lcm *= Math.pow(primeFactor, Math.max(primeFactorsForNum1.getOrDefault(primeFactor, 0), + primeFactorsForNum2.getOrDefault(primeFactor, 0))); + } + return lcm; + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java b/java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java new file mode 100644 index 0000000000..4e3bc550e4 --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java @@ -0,0 +1,18 @@ +package com.ossez.lcm; + +public class SimpleAlgorithm { + public static int lcm(int number1, int number2) { + if (number1 == 0 || number2 == 0) { + return 0; + } + int absNumber1 = Math.abs(number1); + int absNumber2 = Math.abs(number2); + int absHigherNumber = Math.max(absNumber1, absNumber2); + int absLowerNumber = Math.min(absNumber1, absNumber2); + int lcm = absHigherNumber; + while (lcm % absLowerNumber != 0) { + lcm += absHigherNumber; + } + return lcm; + } +} diff --git a/java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java b/java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java new file mode 100644 index 0000000000..3ffcdce30e --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java @@ -0,0 +1,81 @@ +package com.ossez.nan; + +/** + * Sample usage of NaN. + * + */ +public class NaNExample { + + public static void main(String[] args) { + NaNExample naNExample = new NaNExample(); + naNExample.demo(); + } + + void demo() { + undefined_operations_produce_NaN(); + operations_with_no_real_results_produce_NaN(); + operations_with_NaN_produce_NaN(); + comparison_with_NaN(); + check_if_a_value_is_NaN(); + assign_NaN_to_missing_values(); + } + + void undefined_operations_produce_NaN() { + System.out.println("Undefined Operations Produce NaN"); + final double ZERO = 0; + System.out.println("ZERO / ZERO = " + (ZERO / ZERO)); + System.out.println("INFINITY - INFINITY = " + (Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY)); + System.out.println("INFINITY * ZERO = " + (Double.POSITIVE_INFINITY * ZERO)); + System.out.println(); + } + + void operations_with_no_real_results_produce_NaN() { + System.out.println("Operations with no real results produce NaN"); + System.out.println("SQUARE ROOT OF -1 = " + Math.sqrt(-1)); + System.out.println("LOG OF -1 = " + Math.log(-1)); + System.out.println(); + } + + void operations_with_NaN_produce_NaN() { + System.out.println("Operations with NaN produce NaN"); + System.out.println("2 + NaN = " + (2 + Double.NaN)); + System.out.println("2 - NaN = " + (2 - Double.NaN)); + System.out.println("2 * NaN = " + (2 * Double.NaN)); + System.out.println("2 / NaN = " + (2 / Double.NaN)); + System.out.println(); + } + + void assign_NaN_to_missing_values() { + System.out.println("Assign NaN to Missing values"); + double salaryRequired = Double.NaN; + System.out.println(salaryRequired); + System.out.println(); + } + + void comparison_with_NaN() { + System.out.println("Comparison with NaN"); + final double NAN = Double.NaN; + System.out.println("NaN == 1 = " + (NAN == 1)); + System.out.println("NaN > 1 = " + (NAN > 1)); + System.out.println("NaN < 1 = " + (NAN < 1)); + System.out.println("NaN != 1 = " + (NAN != 1)); + System.out.println("NaN == NaN = " + (NAN == NAN)); + System.out.println("NaN > NaN = " + (NAN > NAN)); + System.out.println("NaN < NaN = " + (NAN < NAN)); + System.out.println("NaN != NaN = " + (NAN != NAN)); + System.out.println(); + } + + void check_if_a_value_is_NaN() { + System.out.println("Check if a value is NaN"); + double x = 1; + System.out.println(x + " is NaN = " + (x != x)); + System.out.println(x + " is NaN = " + (Double.isNaN(x))); + + x = Double.NaN; + System.out.println(x + " is NaN = " + (x != x)); + System.out.println(x + " is NaN = " + (Double.isNaN(x))); + System.out.println(); + } + +} diff --git a/java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java b/java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java new file mode 100644 index 0000000000..67ebbdbce0 --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java @@ -0,0 +1,19 @@ +package com.ossez.pow; + +import java.text.DecimalFormat; + +public class PowerExample { + + public static void main(String[] args) { + + int intResult = (int) Math.pow(2, 3); + System.out.println("Math.pow(2, 3) = " + intResult); + + double dblResult = Math.pow(4.2, 3); + System.out.println("Math.pow(4.2, 3) = " + Math.pow(4.2, 3)); + + DecimalFormat df = new DecimalFormat(".00"); + System.out.println("Math.pow(4.2, 3) rounded = " + df.format(dblResult)); + + } +} diff --git a/java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java b/java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java new file mode 100644 index 0000000000..db7b36b88e --- /dev/null +++ b/java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java @@ -0,0 +1,59 @@ +package com.ossez.prime; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class PrimeGenerator { + public static List sieveOfEratosthenes(int n) { + final boolean prime[] = new boolean[n + 1]; + Arrays.fill(prime, true); + + for (int p = 2; p * p <= n; p++) { + if (prime[p]) { + for (int i = p * 2; i <= n; i += p) + prime[i] = false; + } + } + + final List primes = new LinkedList<>(); + for (int i = 2; i <= n; i++) { + if (prime[i]) + primes.add(i); + } + return primes; + } + + public static List primeNumbersBruteForce(int max) { + final List primeNumbers = new LinkedList(); + for (int i = 2; i <= max; i++) { + if (isPrimeBruteForce(i)) { + primeNumbers.add(i); + } + } + return primeNumbers; + } + + private static boolean isPrimeBruteForce(int x) { + for (int i = 2; i < x; i++) { + if (x % i == 0) { + return false; + } + } + return true; + } + + public static List primeNumbersTill(int max) { + return IntStream.rangeClosed(2, max) + .filter(x -> isPrime(x)) + .boxed() + .collect(Collectors.toList()); + } + + private static boolean isPrime(int x) { + return IntStream.rangeClosed(2, (int) (Math.sqrt(x))) + .allMatch(n -> x % n != 0); + } +} diff --git a/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java b/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java new file mode 100644 index 0000000000..f9d7a33e61 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java @@ -0,0 +1,74 @@ +package com.ossez.algorithms.primechecker; + + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + + +public class PrimeCheckerUnitTest { + + private final BigIntegerPrimeChecker primeChecker = new BigIntegerPrimeChecker(); + + @Test + public void whenCheckIsPrime_thenTrue() { + assertTrue(primeChecker.isPrime(2L)); + assertTrue(primeChecker.isPrime(13L)); + assertTrue(primeChecker.isPrime(1009L)); + assertTrue(primeChecker.isPrime(74207281L)); + } + + @Test + public void whenCheckIsPrime_thenFalse() { + assertFalse(primeChecker.isPrime(50L)); + assertFalse(primeChecker.isPrime(1001L)); + assertFalse(primeChecker.isPrime(74207282L)); + } + + private final BruteForcePrimeChecker bfPrimeChecker = new BruteForcePrimeChecker(); + + @Test + public void whenBFCheckIsPrime_thenTrue() { + assertTrue(bfPrimeChecker.isPrime(2)); + assertTrue(bfPrimeChecker.isPrime(13)); + assertTrue(bfPrimeChecker.isPrime(1009)); + } + + @Test + public void whenBFCheckIsPrime_thenFalse() { + assertFalse(bfPrimeChecker.isPrime(50)); + assertFalse(bfPrimeChecker.isPrime(1001)); + } + + private final OptimisedPrimeChecker optimisedPrimeChecker = new OptimisedPrimeChecker(); + + @Test + public void whenOptCheckIsPrime_thenTrue() { + assertTrue(optimisedPrimeChecker.isPrime(2)); + assertTrue(optimisedPrimeChecker.isPrime(13)); + assertTrue(optimisedPrimeChecker.isPrime(1009)); + } + + @Test + public void whenOptCheckIsPrime_thenFalse() { + assertFalse(optimisedPrimeChecker.isPrime(50)); + assertFalse(optimisedPrimeChecker.isPrime(1001)); + } + + private final PrimesPrimeChecker primesPrimeChecker = new PrimesPrimeChecker(); + + @Test + public void whenPrimesCheckIsPrime_thenTrue() { + assertTrue(primesPrimeChecker.isPrime(2)); + assertTrue(primesPrimeChecker.isPrime(13)); + assertTrue(primesPrimeChecker.isPrime(1009)); + } + + @Test + public void whenPrimesCheckIsPrime_thenFalse() { + assertFalse(primesPrimeChecker.isPrime(50)); + assertFalse(primesPrimeChecker.isPrime(1001)); + } + +} diff --git a/java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java b/java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java new file mode 100644 index 0000000000..f3c2631082 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java @@ -0,0 +1,73 @@ +package com.ossez.binarynumbers; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class BinaryNumbersUnitTest { + + private BinaryNumbers binaryNumbers = new BinaryNumbers(); + + @Test + public void given_decimalNumber_then_returnBinaryNumber() { + assertEquals(Integer.valueOf(1000), binaryNumbers.convertDecimalToBinary(8)); + assertEquals(Integer.valueOf(10100), binaryNumbers.convertDecimalToBinary(20)); + } + + @Test + public void given_decimalNumber_then_convertToBinaryNumber() { + assertEquals("1000", Integer.toBinaryString(8)); + assertEquals("10100", Integer.toBinaryString(20)); + } + + @Test + public void given_binaryNumber_then_ConvertToDecimalNumber() { + assertEquals(8, Integer.parseInt("1000", 2)); + assertEquals(20, Integer.parseInt("10100", 2)); + } + + @Test + public void given_binaryNumber_then_returnDecimalNumber() { + assertEquals(Integer.valueOf(8), binaryNumbers.convertBinaryToDecimal(1000)); + assertEquals(Integer.valueOf(20), binaryNumbers.convertBinaryToDecimal(10100)); + } + + @Test + public void given_twoBinaryNumber_then_returnAddition() { + // adding 4 and 10 + assertEquals(Integer.valueOf(1110), binaryNumbers.addBinaryNumber(100, 1010)); + + // adding 26 and 14 + assertEquals(Integer.valueOf(101000), binaryNumbers.addBinaryNumber(11010, 1110)); + } + + @Test + public void given_twoBinaryNumber_then_returnSubtraction() { + // subtracting 16 from 25 + assertEquals(Integer.valueOf(1001), binaryNumbers.substractBinaryNumber(11001, 10000)); + + // subtracting 29 from 16, the output here is negative + assertEquals(Integer.valueOf(1101), binaryNumbers.substractBinaryNumber(10000, 11101)); + } + + @Test + public void given_binaryLiteral_thenReturnDecimalValue() { + + byte five = 0b101; + assertEquals((byte) 5, five); + + short three = 0b11; + assertEquals((short) 3, three); + + int nine = 0B1001; + assertEquals(9, nine); + + long twentyNine = 0B11101; + assertEquals(29, twentyNine); + + int minusThirtySeven = -0B100101; + assertEquals(-37, minusThirtySeven); + + } + +} diff --git a/java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java b/java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java new file mode 100644 index 0000000000..86a3767048 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java @@ -0,0 +1,175 @@ +package com.ossez.java.math; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class MathUnitTest { + + @Test + public void whenAbsInteger_thenReturnAbsoluteValue() { + assertEquals(5,Math.abs(-5)); + } + + @Test + public void whenMaxBetweenTwoValue_thenReturnMaximum() { + assertEquals(10, Math.max(5,10)); + } + + @Test + public void whenMinBetweenTwoValue_thenReturnMinimum() { + assertEquals(5, Math.min(5,10)); + } + + @Test + public void whenSignumWithNegativeNumber_thenReturnMinusOne() { + assertEquals(-1, Math.signum(-5), 0); + } + + @Test + public void whenCopySignWithNegativeSign_thenReturnNegativeArgument() { + assertEquals(-5, Math.copySign(5,-1), 0); + } + + @Test + public void whenPow_thenReturnPoweredValue() { + assertEquals(25, Math.pow(5,2),0); + } + + @Test + public void whenSqrt_thenReturnSquareRoot() { + assertEquals(5, Math.sqrt(25),0); + } + + @Test + public void whenCbrt_thenReturnCubeRoot() { + assertEquals(5, Math.cbrt(125),0); + } + + @Test + public void whenExp_thenReturnEulerNumberRaised() { + assertEquals(2.718, Math.exp(1),0.1); + } + + @Test + public void whenExpm1_thenReturnEulerNumberMinusOne() { + assertEquals(1.718, Math.expm1(1),0.1); + } + + @Test + public void whenGetExponent_thenReturnUnbiasedExponent() { + assertEquals(8, Math.getExponent(333.3),0); + assertEquals(7, Math.getExponent(222.2f),0); + } + + @Test + public void whenLog_thenReturnValue() { + assertEquals(1, Math.log(Math.E),0); + } + + @Test + public void whenLog10_thenReturnValue() { + assertEquals(1, Math.log10(10),0); + } + + @Test + public void whenLog1p_thenReturnValue() { + assertEquals(1.31, Math.log1p(Math.E),0.1); + } + + @Test + public void whenSin_thenReturnValue() { + assertEquals(1, Math.sin(Math.PI/2),0); + } + + @Test + public void whenCos_thenReturnValue() { + assertEquals(1, Math.cos(0),0); + } + + @Test + public void whenTan_thenReturnValue() { + assertEquals(1, Math.tan(Math.PI/4),0.1); + } + + @Test + public void whenAsin_thenReturnValue() { + assertEquals(Math.PI/2, Math.asin(1),0); + } + + @Test + public void whenAcos_thenReturnValue() { + assertEquals(Math.PI/2, Math.acos(0),0); + } + + @Test + public void whenAtan_thenReturnValue() { + assertEquals(Math.PI/4, Math.atan(1),0); + } + + @Test + public void whenAtan2_thenReturnValue() { + assertEquals(Math.PI/4, Math.atan2(1,1),0); + } + + @Test + public void whenToDegrees_thenReturnValue() { + assertEquals(180, Math.toDegrees(Math.PI),0); + } + + @Test + public void whenToRadians_thenReturnValue() { + assertEquals(Math.PI, Math.toRadians(180),0); + } + + @Test + public void whenCeil_thenReturnValue() { + assertEquals(4, Math.ceil(Math.PI),0); + } + + @Test + public void whenFloor_thenReturnValue() { + assertEquals(3, Math.floor(Math.PI),0); + } + + @Test + public void whenGetExponent_thenReturnValue() { + assertEquals(8, Math.getExponent(333.3),0); + } + + @Test + public void whenIEEERemainder_thenReturnValue() { + assertEquals(1.0, Math.IEEEremainder(5,2),0); + } + + @Test + public void whenNextAfter_thenReturnValue() { + assertEquals(1.9499999284744263, Math.nextAfter(1.95f,1),0.0000001); + } + + @Test + public void whenNextUp_thenReturnValue() { + assertEquals(1.9500002, Math.nextUp(1.95f),0.0000001); + } + + @Test + public void whenRint_thenReturnValue() { + assertEquals(2.0, Math.rint(1.95f),0.0); + } + + @Test + public void whenRound_thenReturnValue() { + assertEquals(2.0, Math.round(1.95f),0.0); + } + + @Test + public void whenScalb_thenReturnValue() { + assertEquals(48, Math.scalb(3, 4),0.0); + } + + @Test + public void whenHypot_thenReturnValue() { + assertEquals(5, Math.hypot(4, 3),0.0); + } + +} diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java b/java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java new file mode 100644 index 0000000000..3b3fc0f81c --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java @@ -0,0 +1,18 @@ +package com.ossez.lcm; + + +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigInteger; + +public class BigIntegerLCMUnitTest { + + @Test + public void testLCM() { + BigInteger number1 = new BigInteger("12"); + BigInteger number2 = new BigInteger("18"); + BigInteger expectedLCM = new BigInteger("36"); + Assert.assertEquals(expectedLCM, BigIntegerLCM.lcm(number1, number2)); + } +} diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java b/java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java new file mode 100644 index 0000000000..890dbb79d8 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java @@ -0,0 +1,27 @@ +package com.ossez.lcm; + +import org.junit.Assert; +import org.junit.Test; + +public class EuclideanAlgorithmUnitTest { + + @Test + public void testGCD() { + Assert.assertEquals(6, EuclideanAlgorithm.gcd(12, 18)); + } + + @Test + public void testLCM() { + Assert.assertEquals(36, EuclideanAlgorithm.lcm(12, 18)); + } + + @Test + public void testLCMForArray() { + Assert.assertEquals(15, EuclideanAlgorithm.lcmForArray(new int[]{3, 5, 15})); + } + + @Test + public void testLCMByLambdaForArray() { + Assert.assertEquals(15, EuclideanAlgorithm.lcmByLambda(new int[]{3, 5, 15})); + } +} diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java b/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java new file mode 100644 index 0000000000..7cb3bbbd92 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java @@ -0,0 +1,28 @@ +package com.ossez.lcm; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class PrimeFactorizationAlgorithmUnitTest { + + @Test + public void testGetPrimeFactors() { + Map expectedPrimeFactorsMapForTwelve = new HashMap<>(); + expectedPrimeFactorsMapForTwelve.put(2, 2); + expectedPrimeFactorsMapForTwelve.put(3, 1); + Map expectedPrimeFactorsMapForEighteen = new HashMap<>(); + expectedPrimeFactorsMapForEighteen.put(2, 1); + expectedPrimeFactorsMapForEighteen.put(3, 2); + Assert.assertEquals(expectedPrimeFactorsMapForTwelve, getPrimeFactors(12)); + Assert.assertEquals(expectedPrimeFactorsMapForEighteen, getPrimeFactors(18)); + } + + @Test + public void testLCM() { + Assert.assertEquals(36, PrimeFactorizationAlgorithm.lcm(12, 18)); + } +} diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java b/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java new file mode 100644 index 0000000000..05df73c058 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java @@ -0,0 +1,13 @@ +package com.ossez.lcm; + +import org.junit.Assert; +import org.junit.Test; + +public class SimpleAlgorithmUnitTest { + + @Test + public void testLCM() { + Assert.assertEquals(36, lcm(12, 18)); + } + +} diff --git a/java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java b/java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java new file mode 100644 index 0000000000..061f240ef2 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java @@ -0,0 +1,68 @@ +package com.ossez.lossyconversion; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.jupiter.api.Test; + +public class ConversionTechniquesUnitTest { + + @Test + public void testPrimitiveConversion() { + + long longNum = 24; + short shortNum = (short) longNum; + assertEquals(24, shortNum); + + double doubleNum = 15.6; + int integerNum = (int) doubleNum; + assertEquals(15, integerNum); + + long largeLongNum = 32768; + short minShortNum = (short) largeLongNum; + assertEquals(-32768, minShortNum); + + long smallLongNum = -32769; + short maxShortNum = (short) smallLongNum; + assertEquals(32767, maxShortNum); + + long maxLong = Long.MAX_VALUE; + int minInt = (int) maxLong; + assertEquals(-1, minInt); + + long minLong = Long.MIN_VALUE; + int maxInt = (int) minLong; + assertEquals(0, maxInt); + } + + @Test + public void testWrapperToPrimitiveConversion() { + + Float floatNum = 17.564f; + long longNum = floatNum.longValue(); + assertEquals(17, longNum); + + Double doubleNum = 15.9999; + longNum = doubleNum.longValue(); + assertEquals(15, longNum); + } + + @Test + public void testWrapperToPrimitiveConversionUsingMathRound() { + + Double doubleNum = 15.9999; + long longNum = Math.round(doubleNum); + assertEquals(16, longNum); + } + + @Test + public void testWrapperConversion() { + + Double doubleNum = 10.3; + double dbl = doubleNum.doubleValue(); //unboxing + int intgr = (int) dbl; //downcasting + Integer intNum = Integer.valueOf(intgr); + assertEquals(Integer.valueOf(10), intNum); + } + +} diff --git a/java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java b/java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java new file mode 100644 index 0000000000..543aac7d88 --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java @@ -0,0 +1,29 @@ +package com.ossez.prime; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static com.ossez.prime.PrimeGenerator.*; +import static org.junit.Assert.*; + +public class PrimeGeneratorUnitTest { + @Test + public void whenBruteForced_returnsSuccessfully() { + final List primeNumbers = primeNumbersBruteForce(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenOptimized_returnsSuccessfully() { + final List primeNumbers = primeNumbersTill(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenSieveOfEratosthenes_returnsSuccessfully() { + final List primeNumbers = sieveOfEratosthenes(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } +} diff --git a/java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java b/java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java new file mode 100644 index 0000000000..9c62ceb5ba --- /dev/null +++ b/java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java @@ -0,0 +1,72 @@ +package com.ossez.primechecker; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class PrimeCheckerUnitTest { + + private final BigIntegerPrimeChecker primeChecker = new BigIntegerPrimeChecker(); + + @Test + public void whenCheckIsPrime_thenTrue() { + assertTrue(primeChecker.isPrime(2L)); + assertTrue(primeChecker.isPrime(13L)); + assertTrue(primeChecker.isPrime(1009L)); + assertTrue(primeChecker.isPrime(74207281L)); + } + + @Test + public void whenCheckIsPrime_thenFalse() { + assertFalse(primeChecker.isPrime(50L)); + assertFalse(primeChecker.isPrime(1001L)); + assertFalse(primeChecker.isPrime(74207282L)); + } + + private final BruteForcePrimeChecker bfPrimeChecker = new BruteForcePrimeChecker(); + + @Test + public void whenBFCheckIsPrime_thenTrue() { + assertTrue(bfPrimeChecker.isPrime(2)); + assertTrue(bfPrimeChecker.isPrime(13)); + assertTrue(bfPrimeChecker.isPrime(1009)); + } + + @Test + public void whenBFCheckIsPrime_thenFalse() { + assertFalse(bfPrimeChecker.isPrime(50)); + assertFalse(bfPrimeChecker.isPrime(1001)); + } + + private final OptimisedPrimeChecker optimisedPrimeChecker = new OptimisedPrimeChecker(); + + @Test + public void whenOptCheckIsPrime_thenTrue() { + assertTrue(optimisedPrimeChecker.isPrime(2)); + assertTrue(optimisedPrimeChecker.isPrime(13)); + assertTrue(optimisedPrimeChecker.isPrime(1009)); + } + + @Test + public void whenOptCheckIsPrime_thenFalse() { + assertFalse(optimisedPrimeChecker.isPrime(50)); + assertFalse(optimisedPrimeChecker.isPrime(1001)); + } + + private final PrimesPrimeChecker primesPrimeChecker = new PrimesPrimeChecker(); + + @Test + public void whenPrimesCheckIsPrime_thenTrue() { + assertTrue(primesPrimeChecker.isPrime(2)); + assertTrue(primesPrimeChecker.isPrime(13)); + assertTrue(primesPrimeChecker.isPrime(1009)); + } + + @Test + public void whenPrimesCheckIsPrime_thenFalse() { + assertFalse(primesPrimeChecker.isPrime(50)); + assertFalse(primesPrimeChecker.isPrime(1001)); + } + +} From 3984d494175658b5871238a0632eb1ce0fd85dfd Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Wed, 22 Sep 2021 17:51:45 -0400 Subject: [PATCH 08/30] set jmh-core.version Test --- pom.xml | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/pom.xml b/pom.xml index ea06c89b58..f8c3de95e5 100644 --- a/pom.xml +++ b/pom.xml @@ -76,9 +76,13 @@ 2.12.4 - 4.11 + 4.13.2 + 5.7.0 2.2 1.3 + 3.17.2 + 1.19 + 1.19 1.9.0 @@ -89,6 +93,8 @@ 3.0.0 2.21.0 3.8.1 + 1.2.5 + 3.1.1 @@ -97,9 +103,9 @@ - org.apache.logging.log4j - log4j-slf4j18-impl - 2.14.0 + ch.qos.logback + logback-classic + ${logback-classic.version} @@ -108,19 +114,16 @@ commons-compress 1.20 - - - org.apache.velocity - velocity - 1.7 - - org.apache.commons commons-math3 3.6.1 - + + org.apache.velocity + velocity + 1.7 + antlr antlr @@ -128,29 +131,26 @@ - - dom4j + org.dom4j dom4j - 1.6.1 + 2.1.3 commons-cli commons-cli - 1.2 + 1.4 org.apache.velocity velocity-tools 2.0 - jaxen jaxen 1.1.6 - javax.persistence persistence-api @@ -159,14 +159,13 @@ com.google.guava guava - 17.0 + 30.1.1-jre com.google.gdata core 1.47.1 - org.ow2.orchestra.eclipse.birt org.ow2.orchestra.eclipse.birt.core @@ -182,17 +181,15 @@ commons-net 2.0 - com.mchange mchange-commons-java 0.2.9 - junit junit - 4.13.2 + ${junit4.version} org.jasypt @@ -246,13 +243,13 @@ org.junit.jupiter junit-jupiter-api - 5.7.0 + ${junit5.version} test org.junit.jupiter junit-jupiter-engine - 5.7.0 + ${junit5.version} test From 8470f8bf9f80ce338aaa5de10dfbc314f60643eb Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 23 Sep 2021 14:03:26 -0400 Subject: [PATCH 09/30] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=88=B0=E4=B8=8D=E5=90=8C=E7=9A=84=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {java-numbers-2 => parent-java/java-numbers-2}/README.md | 0 {java-numbers-2 => parent-java/java-numbers-2}/pom.xml | 1 - .../algorithms/primechecker/BigIntegerPrimeChecker.java | 0 .../algorithms/primechecker/BruteForcePrimeChecker.java | 0 .../ossez/algorithms/primechecker/OptimisedPrimeChecker.java | 0 .../java/com/ossez/algorithms/primechecker/PrimeChecker.java | 0 .../ossez/algorithms/primechecker/PrimesPrimeChecker.java | 0 .../src/main/java/com/ossez/area/circle/Circle.java | 0 .../src/main/java/com/ossez/area/circle/CircleArea.java | 0 .../src/main/java/com/ossez/binarynumbers/BinaryNumbers.java | 0 .../src/main/java/com/ossez/lcm/BigIntegerLCM.java | 0 .../src/main/java/com/ossez/lcm/EuclideanAlgorithm.java | 0 .../main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java | 0 .../src/main/java/com/ossez/lcm/SimpleAlgorithm.java | 0 .../src/main/java/com/ossez/nan/NaNExample.java | 0 .../src/main/java/com/ossez/pow/PowerExample.java | 0 .../src/main/java/com/ossez/prime/PrimeGenerator.java | 0 .../ossez/algorithms/primechecker/PrimeCheckerUnitTest.java | 2 -- .../java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java | 0 .../src/test/java/com/ossez/java/math/MathUnitTest.java | 0 .../src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java | 0 .../test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java | 0 .../com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java | 2 ++ .../src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java | 2 ++ .../ossez/lossyconversion/ConversionTechniquesUnitTest.java | 0 .../test/java/com/ossez/prime/PrimeGeneratorUnitTest.java | 0 {java-numbers => parent-java/java-numbers}/.gitignore | 0 {java-numbers => parent-java/java-numbers}/README.md | 0 {java-numbers => parent-java/java-numbers}/pom.xml | 3 +-- .../src/main/java/com/ossez/maths/BigDecimalDemo.java | 0 .../main/java/com/ossez/maths/FloatingPointArithmetic.java | 0 .../java-numbers}/src/main/java/com/ossez/maths/Round.java | 0 .../com/ossez/nth/root/calculator/NthRootCalculator.java | 0 .../src/main/java/com/ossez/nth/root/main/Main.java | 0 .../src/main/java/com/ossez/numberofdigits/Benchmarking.java | 0 .../main/java/com/ossez/numberofdigits/NumberOfDigits.java | 0 .../java/com/ossez/numberofdigits/NumberOfDigitsDriver.java | 0 .../main/java/com/ossez/pairsaddupnumber/DifferentPairs.java | 0 .../main/java/com/ossez/pairsaddupnumber/ExistingPairs.java | 0 .../src/main/java/com/ossez/pairsaddupnumber/FindPairs.java | 0 .../src/main/java/com/ossez/random/SecureRandomDemo.java | 0 .../src/main/java/com/ossez/string/DoubleToString.java | 0 .../java-numbers}/src/main/resources/log4j.properties | 0 .../java-numbers}/src/main/resources/logback.xml | 0 .../ossez/decimalformat/DecimalFormatExamplesUnitTest.java | 0 .../test/java/com/ossez/maths/BigDecimalDemoUnitTest.java | 0 .../test/java/com/ossez/maths/BigDecimalImplUnitTest.java | 0 .../test/java/com/ossez/maths/BigIntegerDemoUnitTest.java | 0 .../test/java/com/ossez/maths/BigIntegerImplUnitTest.java | 0 .../com/ossez/maths/FloatingPointArithmeticUnitTest.java | 0 .../src/test/java/com/ossez/maths/MathSinUnitTest.java | 0 .../src/test/java/com/ossez/maths/RoundUnitTest.java | 0 .../ossez/nth/root/calculator/NthRootCalculatorUnitTest.java | 0 .../src/test/java/com/ossez/nth/root/main/MainUnitTest.java | 0 .../ossez/numberofdigits/NumberOfDigitsIntegrationTest.java | 0 .../com/ossez/pairsaddupnumber/DifferentPairsUnitTest.java | 0 .../com/ossez/pairsaddupnumber/ExistingPairsUnitTest.java | 0 .../src/test/java/com/ossez/random/JavaRandomUnitTest.java | 0 .../ossez/removingdecimals/RemovingDecimalsManualTest.java | 0 .../com/ossez/removingdecimals/RemovingDecimalsUnitTest.java | 0 .../test/java/com/ossez/string/DoubleToStringUnitTest.java | 0 parent-java/pom.xml | 5 +++++ 62 files changed, 10 insertions(+), 5 deletions(-) rename {java-numbers-2 => parent-java/java-numbers-2}/README.md (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/pom.xml (96%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/area/circle/Circle.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/area/circle/CircleArea.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/lcm/BigIntegerLCM.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/lcm/SimpleAlgorithm.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/nan/NaNExample.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/pow/PowerExample.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/main/java/com/ossez/prime/PrimeGenerator.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java (99%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/java/math/MathUnitTest.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java (93%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java (81%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java (100%) rename {java-numbers-2 => parent-java/java-numbers-2}/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/.gitignore (100%) rename {java-numbers => parent-java/java-numbers}/README.md (100%) rename {java-numbers => parent-java/java-numbers}/pom.xml (94%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/maths/BigDecimalDemo.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/maths/FloatingPointArithmetic.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/maths/Round.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/nth/root/calculator/NthRootCalculator.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/nth/root/main/Main.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/numberofdigits/Benchmarking.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/numberofdigits/NumberOfDigits.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/numberofdigits/NumberOfDigitsDriver.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/pairsaddupnumber/DifferentPairs.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/pairsaddupnumber/ExistingPairs.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/pairsaddupnumber/FindPairs.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/random/SecureRandomDemo.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/java/com/ossez/string/DoubleToString.java (100%) rename {java-numbers => parent-java/java-numbers}/src/main/resources/log4j.properties (100%) rename {java-numbers => parent-java/java-numbers}/src/main/resources/logback.xml (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/decimalformat/DecimalFormatExamplesUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/maths/BigDecimalImplUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/maths/BigIntegerDemoUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/maths/BigIntegerImplUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/maths/FloatingPointArithmeticUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/maths/MathSinUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/maths/RoundUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/nth/root/calculator/NthRootCalculatorUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/nth/root/main/MainUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/numberofdigits/NumberOfDigitsIntegrationTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/pairsaddupnumber/DifferentPairsUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/pairsaddupnumber/ExistingPairsUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/random/JavaRandomUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/removingdecimals/RemovingDecimalsManualTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/removingdecimals/RemovingDecimalsUnitTest.java (100%) rename {java-numbers => parent-java/java-numbers}/src/test/java/com/ossez/string/DoubleToStringUnitTest.java (100%) diff --git a/java-numbers-2/README.md b/parent-java/java-numbers-2/README.md similarity index 100% rename from java-numbers-2/README.md rename to parent-java/java-numbers-2/README.md diff --git a/java-numbers-2/pom.xml b/parent-java/java-numbers-2/pom.xml similarity index 96% rename from java-numbers-2/pom.xml rename to parent-java/java-numbers-2/pom.xml index de25f0bb35..713ea83fa1 100644 --- a/java-numbers-2/pom.xml +++ b/parent-java/java-numbers-2/pom.xml @@ -12,7 +12,6 @@ com.ossez parent-java 0.0.2-SNAPSHOT - ../parent-java diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java b/parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BigIntegerPrimeChecker.java diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java b/parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/BruteForcePrimeChecker.java diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java b/parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/OptimisedPrimeChecker.java diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java b/parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimeChecker.java diff --git a/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java b/parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/algorithms/primechecker/PrimesPrimeChecker.java diff --git a/java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java b/parent-java/java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/area/circle/Circle.java diff --git a/java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java b/parent-java/java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/area/circle/CircleArea.java diff --git a/java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java b/parent-java/java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/binarynumbers/BinaryNumbers.java diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java b/parent-java/java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/lcm/BigIntegerLCM.java diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java b/parent-java/java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/lcm/EuclideanAlgorithm.java diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java b/parent-java/java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/lcm/PrimeFactorizationAlgorithm.java diff --git a/java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java b/parent-java/java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/lcm/SimpleAlgorithm.java diff --git a/java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java b/parent-java/java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/nan/NaNExample.java diff --git a/java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java b/parent-java/java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/pow/PowerExample.java diff --git a/java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java b/parent-java/java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java similarity index 100% rename from java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java rename to parent-java/java-numbers-2/src/main/java/com/ossez/prime/PrimeGenerator.java diff --git a/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java similarity index 99% rename from java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java index f9d7a33e61..51e5c61523 100644 --- a/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java +++ b/parent-java/java-numbers-2/src/test/java/com/ossez/algorithms/primechecker/PrimeCheckerUnitTest.java @@ -1,12 +1,10 @@ package com.ossez.algorithms.primechecker; - import org.junit.Test; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; - public class PrimeCheckerUnitTest { private final BigIntegerPrimeChecker primeChecker = new BigIntegerPrimeChecker(); diff --git a/java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/binarynumbers/BinaryNumbersUnitTest.java diff --git a/java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/java/math/MathUnitTest.java diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/lcm/BigIntegerLCMUnitTest.java diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/lcm/EuclideanAlgorithmUnitTest.java diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java similarity index 93% rename from java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java index 7cb3bbbd92..fc015adb8f 100644 --- a/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java +++ b/parent-java/java-numbers-2/src/test/java/com/ossez/lcm/PrimeFactorizationAlgorithmUnitTest.java @@ -6,6 +6,8 @@ import org.junit.Test; import java.util.HashMap; import java.util.Map; +import static com.ossez.lcm.PrimeFactorizationAlgorithm.*; + public class PrimeFactorizationAlgorithmUnitTest { diff --git a/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java similarity index 81% rename from java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java index 05df73c058..6f401d1b8d 100644 --- a/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java +++ b/parent-java/java-numbers-2/src/test/java/com/ossez/lcm/SimpleAlgorithmUnitTest.java @@ -3,6 +3,8 @@ package com.ossez.lcm; import org.junit.Assert; import org.junit.Test; +import static com.ossez.lcm.SimpleAlgorithm.*; + public class SimpleAlgorithmUnitTest { @Test diff --git a/java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/lossyconversion/ConversionTechniquesUnitTest.java diff --git a/java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java b/parent-java/java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java rename to parent-java/java-numbers-2/src/test/java/com/ossez/prime/PrimeGeneratorUnitTest.java diff --git a/java-numbers/.gitignore b/parent-java/java-numbers/.gitignore similarity index 100% rename from java-numbers/.gitignore rename to parent-java/java-numbers/.gitignore diff --git a/java-numbers/README.md b/parent-java/java-numbers/README.md similarity index 100% rename from java-numbers/README.md rename to parent-java/java-numbers/README.md diff --git a/java-numbers/pom.xml b/parent-java/java-numbers/pom.xml similarity index 94% rename from java-numbers/pom.xml rename to parent-java/java-numbers/pom.xml index a5404a6fee..859bb031f1 100644 --- a/java-numbers/pom.xml +++ b/parent-java/java-numbers/pom.xml @@ -10,8 +10,7 @@ com.ossez parent-java - 0.0.1-SNAPSHOT - ../parent-java + 0.0.2-SNAPSHOT diff --git a/java-numbers/src/main/java/com/ossez/maths/BigDecimalDemo.java b/parent-java/java-numbers/src/main/java/com/ossez/maths/BigDecimalDemo.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/maths/BigDecimalDemo.java rename to parent-java/java-numbers/src/main/java/com/ossez/maths/BigDecimalDemo.java diff --git a/java-numbers/src/main/java/com/ossez/maths/FloatingPointArithmetic.java b/parent-java/java-numbers/src/main/java/com/ossez/maths/FloatingPointArithmetic.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/maths/FloatingPointArithmetic.java rename to parent-java/java-numbers/src/main/java/com/ossez/maths/FloatingPointArithmetic.java diff --git a/java-numbers/src/main/java/com/ossez/maths/Round.java b/parent-java/java-numbers/src/main/java/com/ossez/maths/Round.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/maths/Round.java rename to parent-java/java-numbers/src/main/java/com/ossez/maths/Round.java diff --git a/java-numbers/src/main/java/com/ossez/nth/root/calculator/NthRootCalculator.java b/parent-java/java-numbers/src/main/java/com/ossez/nth/root/calculator/NthRootCalculator.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/nth/root/calculator/NthRootCalculator.java rename to parent-java/java-numbers/src/main/java/com/ossez/nth/root/calculator/NthRootCalculator.java diff --git a/java-numbers/src/main/java/com/ossez/nth/root/main/Main.java b/parent-java/java-numbers/src/main/java/com/ossez/nth/root/main/Main.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/nth/root/main/Main.java rename to parent-java/java-numbers/src/main/java/com/ossez/nth/root/main/Main.java diff --git a/java-numbers/src/main/java/com/ossez/numberofdigits/Benchmarking.java b/parent-java/java-numbers/src/main/java/com/ossez/numberofdigits/Benchmarking.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/numberofdigits/Benchmarking.java rename to parent-java/java-numbers/src/main/java/com/ossez/numberofdigits/Benchmarking.java diff --git a/java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigits.java b/parent-java/java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigits.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigits.java rename to parent-java/java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigits.java diff --git a/java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigitsDriver.java b/parent-java/java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigitsDriver.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigitsDriver.java rename to parent-java/java-numbers/src/main/java/com/ossez/numberofdigits/NumberOfDigitsDriver.java diff --git a/java-numbers/src/main/java/com/ossez/pairsaddupnumber/DifferentPairs.java b/parent-java/java-numbers/src/main/java/com/ossez/pairsaddupnumber/DifferentPairs.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/pairsaddupnumber/DifferentPairs.java rename to parent-java/java-numbers/src/main/java/com/ossez/pairsaddupnumber/DifferentPairs.java diff --git a/java-numbers/src/main/java/com/ossez/pairsaddupnumber/ExistingPairs.java b/parent-java/java-numbers/src/main/java/com/ossez/pairsaddupnumber/ExistingPairs.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/pairsaddupnumber/ExistingPairs.java rename to parent-java/java-numbers/src/main/java/com/ossez/pairsaddupnumber/ExistingPairs.java diff --git a/java-numbers/src/main/java/com/ossez/pairsaddupnumber/FindPairs.java b/parent-java/java-numbers/src/main/java/com/ossez/pairsaddupnumber/FindPairs.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/pairsaddupnumber/FindPairs.java rename to parent-java/java-numbers/src/main/java/com/ossez/pairsaddupnumber/FindPairs.java diff --git a/java-numbers/src/main/java/com/ossez/random/SecureRandomDemo.java b/parent-java/java-numbers/src/main/java/com/ossez/random/SecureRandomDemo.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/random/SecureRandomDemo.java rename to parent-java/java-numbers/src/main/java/com/ossez/random/SecureRandomDemo.java diff --git a/java-numbers/src/main/java/com/ossez/string/DoubleToString.java b/parent-java/java-numbers/src/main/java/com/ossez/string/DoubleToString.java similarity index 100% rename from java-numbers/src/main/java/com/ossez/string/DoubleToString.java rename to parent-java/java-numbers/src/main/java/com/ossez/string/DoubleToString.java diff --git a/java-numbers/src/main/resources/log4j.properties b/parent-java/java-numbers/src/main/resources/log4j.properties similarity index 100% rename from java-numbers/src/main/resources/log4j.properties rename to parent-java/java-numbers/src/main/resources/log4j.properties diff --git a/java-numbers/src/main/resources/logback.xml b/parent-java/java-numbers/src/main/resources/logback.xml similarity index 100% rename from java-numbers/src/main/resources/logback.xml rename to parent-java/java-numbers/src/main/resources/logback.xml diff --git a/java-numbers/src/test/java/com/ossez/decimalformat/DecimalFormatExamplesUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/decimalformat/DecimalFormatExamplesUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/decimalformat/DecimalFormatExamplesUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/decimalformat/DecimalFormatExamplesUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/maths/BigDecimalImplUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/maths/BigDecimalImplUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/maths/BigDecimalImplUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/maths/BigDecimalImplUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/maths/BigIntegerDemoUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/maths/BigIntegerDemoUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/maths/BigIntegerDemoUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/maths/BigIntegerDemoUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/maths/BigIntegerImplUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/maths/BigIntegerImplUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/maths/BigIntegerImplUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/maths/BigIntegerImplUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/maths/FloatingPointArithmeticUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/maths/FloatingPointArithmeticUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/maths/FloatingPointArithmeticUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/maths/FloatingPointArithmeticUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/maths/MathSinUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/maths/MathSinUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/maths/MathSinUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/maths/MathSinUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/maths/RoundUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/maths/RoundUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/maths/RoundUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/maths/RoundUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/nth/root/calculator/NthRootCalculatorUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/nth/root/calculator/NthRootCalculatorUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/nth/root/calculator/NthRootCalculatorUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/nth/root/calculator/NthRootCalculatorUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/nth/root/main/MainUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/nth/root/main/MainUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/nth/root/main/MainUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/nth/root/main/MainUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/numberofdigits/NumberOfDigitsIntegrationTest.java b/parent-java/java-numbers/src/test/java/com/ossez/numberofdigits/NumberOfDigitsIntegrationTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/numberofdigits/NumberOfDigitsIntegrationTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/numberofdigits/NumberOfDigitsIntegrationTest.java diff --git a/java-numbers/src/test/java/com/ossez/pairsaddupnumber/DifferentPairsUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/pairsaddupnumber/DifferentPairsUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/pairsaddupnumber/DifferentPairsUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/pairsaddupnumber/DifferentPairsUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/pairsaddupnumber/ExistingPairsUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/pairsaddupnumber/ExistingPairsUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/pairsaddupnumber/ExistingPairsUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/pairsaddupnumber/ExistingPairsUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/random/JavaRandomUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/random/JavaRandomUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/random/JavaRandomUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/random/JavaRandomUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsManualTest.java b/parent-java/java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsManualTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsManualTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsManualTest.java diff --git a/java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/removingdecimals/RemovingDecimalsUnitTest.java diff --git a/java-numbers/src/test/java/com/ossez/string/DoubleToStringUnitTest.java b/parent-java/java-numbers/src/test/java/com/ossez/string/DoubleToStringUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/ossez/string/DoubleToStringUnitTest.java rename to parent-java/java-numbers/src/test/java/com/ossez/string/DoubleToStringUnitTest.java diff --git a/parent-java/pom.xml b/parent-java/pom.xml index 08dcf7ecf1..04e2b49c49 100644 --- a/parent-java/pom.xml +++ b/parent-java/pom.xml @@ -14,6 +14,11 @@ 0.0.2-SNAPSHOT + + java-numbers + java-numbers-2 + + From e6b16cbf16083aa6b6c70cca1e5aab28c0a24a8d Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 23 Sep 2021 14:04:28 -0400 Subject: [PATCH 10/30] Update change to different folder and set to rebuild --- .idea/compiler.xml | 21 +- .idea/encodings.xml | 11 +- .idea/misc.xml | 4 +- .idea/modules.xml | 18 -- .idea/workspace.xml | 239 +++++++++--------- .../core-java-annotations/pom.xml | 6 +- .../core-java-datetime-conversion/pom.xml | 2 +- .../ConvertInstantToTimestampUnitTest.java | 2 + core-java-modules/core-java-io/pom.xml | 5 +- core-java-modules/pom.xml | 1 + java-collections-conversions-2/pom.xml | 6 +- .../convertlisttomap/ListToMapConverter.java | 2 +- .../modelmapper/MapperUtil.java | 2 +- .../{baeldung => ossez}/modelmapper/User.java | 2 +- .../modelmapper/UserDTO.java | 2 +- .../modelmapper/UserList.java | 2 +- .../modelmapper/UserListDTO.java | 2 +- .../modelmapper/UsersListConverter.java | 2 +- .../ArrayToListConversionUnitTest.java | 2 +- .../ArrayToStringUnitTest.java | 2 +- .../convertlisttomap/ListToMapUnitTest.java | 2 +- .../modelmapper/UsersListMappingUnitTest.java | 2 +- .../setiteration/SetIteration.java | 2 +- java-collections-conversions/pom.xml | 6 + java-numbers-2/.idea/.gitignore | 8 - java-numbers-2/.idea/compiler.xml | 13 - java-numbers-2/.idea/encodings.xml | 6 - java-numbers-2/.idea/jarRepositories.xml | 20 -- java-numbers-2/.idea/misc.xml | 12 - java-numbers-2/.idea/runConfigurations.xml | 10 - java-numbers-2/.idea/vcs.xml | 6 - .../primechecker/PrimeCheckerUnitTest.java | 72 ------ .../algorithm/tests/VariableTest.java | 98 +++++-- 33 files changed, 231 insertions(+), 359 deletions(-) delete mode 100644 .idea/modules.xml rename java-collections-conversions-2/src/main/java/com/{baeldung => ossez}/convertlisttomap/ListToMapConverter.java (98%) rename java-collections-conversions-2/src/main/java/com/{baeldung => ossez}/modelmapper/MapperUtil.java (95%) rename java-collections-conversions-2/src/main/java/com/{baeldung => ossez}/modelmapper/User.java (97%) rename java-collections-conversions-2/src/main/java/com/{baeldung => ossez}/modelmapper/UserDTO.java (94%) rename java-collections-conversions-2/src/main/java/com/{baeldung => ossez}/modelmapper/UserList.java (90%) rename java-collections-conversions-2/src/main/java/com/{baeldung => ossez}/modelmapper/UserListDTO.java (91%) rename java-collections-conversions-2/src/main/java/com/{baeldung => ossez}/modelmapper/UsersListConverter.java (94%) rename java-collections-conversions-2/src/test/java/com/{baeldung => ossez}/arrayconversion/ArrayToListConversionUnitTest.java (97%) rename java-collections-conversions-2/src/test/java/com/{baeldung => ossez}/convertarraytostring/ArrayToStringUnitTest.java (99%) rename java-collections-conversions-2/src/test/java/com/{baeldung => ossez}/convertlisttomap/ListToMapUnitTest.java (97%) rename java-collections-conversions-2/src/test/java/com/{baeldung => ossez}/modelmapper/UsersListMappingUnitTest.java (98%) rename java-collections-conversions-2/src/test/java/com/{baeldung => ossez}/setiteration/SetIteration.java (98%) delete mode 100644 java-numbers-2/.idea/.gitignore delete mode 100644 java-numbers-2/.idea/compiler.xml delete mode 100644 java-numbers-2/.idea/encodings.xml delete mode 100644 java-numbers-2/.idea/jarRepositories.xml delete mode 100644 java-numbers-2/.idea/misc.xml delete mode 100644 java-numbers-2/.idea/runConfigurations.xml delete mode 100644 java-numbers-2/.idea/vcs.xml delete mode 100644 java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 1464860f04..aeed8b2aec 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,32 +2,15 @@ - - - - - - + + - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index ef7546175b..3ec6972f06 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,14 +1,9 @@ - - - - - - - - + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index 989935de3e..d31b37ac7b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,12 +1,10 @@ + diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 5d3bd2d54d..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 516b42fa67..6fd8d918d0 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,31 +4,101 @@ - - - - - - - - - - - - - - + - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + \ No newline at end of file diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml index 82dc9275d9..73290bb025 100644 --- a/core-java-modules/core-java-annotations/pom.xml +++ b/core-java-modules/core-java-annotations/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.ossez core-java-annotations - 0.1.0-SNAPSHOT + ${project.parent.version} core-java-annotations jar @@ -11,7 +11,7 @@ com.ossez.core-java-modules core-java-modules 0.0.2-SNAPSHOT - ../ + @@ -73,7 +73,7 @@ - 3.6.1 + 3.17.2 1.8.9 1.19 1.19 diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml index 4f9799e363..4c4e9f1eb7 100644 --- a/core-java-modules/core-java-datetime-conversion/pom.xml +++ b/core-java-modules/core-java-datetime-conversion/pom.xml @@ -12,7 +12,7 @@ com.ossez.core-java-modules core-java-modules 0.0.2-SNAPSHOT - ../ + diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java index 45d6354606..fda9908829 100644 --- a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java @@ -40,6 +40,8 @@ public class ConvertInstantToTimestampUnitTest { df.setTimeZone(TimeZone.getTimeZone("UTC")); assertThat(formatter.format(instant)).isEqualTo(df.format(timestamp)); + + } } diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index d910e98e56..def447300d 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -10,7 +10,7 @@ com.ossez.core-java-modules core-java-modules 0.0.2-SNAPSHOT - ../ + @@ -175,7 +175,7 @@ com.nimbusds nimbus-jose-jwt - 9.0.1 + ${nimbus-jose-jwt.version} @@ -297,6 +297,7 @@ 0.1.5 3.1.0 + 9.13 diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index bf08f30b41..1a0497c41b 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -15,6 +15,7 @@ + core-java-8 core-java-annotations core-java-datetime-conversion core-java-io diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml index de551d756a..03d7164285 100644 --- a/java-collections-conversions-2/pom.xml +++ b/java-collections-conversions-2/pom.xml @@ -33,9 +33,9 @@ ${modelmapper.version} - junit - junit - ${junit.version} + org.junit.jupiter + junit-jupiter-api + ${junit5.version} test diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java b/java-collections-conversions-2/src/main/java/com/ossez/convertlisttomap/ListToMapConverter.java similarity index 98% rename from java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java rename to java-collections-conversions-2/src/main/java/com/ossez/convertlisttomap/ListToMapConverter.java index 8450f54f9d..0fd321e18b 100644 --- a/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java +++ b/java-collections-conversions-2/src/main/java/com/ossez/convertlisttomap/ListToMapConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.convertlisttomap; +package com.ossez.convertlisttomap; import java.util.List; import java.util.Map; diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/MapperUtil.java similarity index 95% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java rename to java-collections-conversions-2/src/main/java/com/ossez/modelmapper/MapperUtil.java index 23a549e652..549c61ad9d 100644 --- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java +++ b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/MapperUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.modelmapper; +package com.ossez.modelmapper; import org.modelmapper.ModelMapper; diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/User.java similarity index 97% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java rename to java-collections-conversions-2/src/main/java/com/ossez/modelmapper/User.java index 8ed674d86a..78f883cf09 100644 --- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java +++ b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/User.java @@ -1,4 +1,4 @@ -package com.baeldung.modelmapper; +package com.ossez.modelmapper; /** * User model entity class diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserDTO.java similarity index 94% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java rename to java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserDTO.java index b67bb58ef4..049fa375cf 100644 --- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java +++ b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserDTO.java @@ -1,4 +1,4 @@ -package com.baeldung.modelmapper; +package com.ossez.modelmapper; /** * UserDTO model class diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserList.java similarity index 90% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java rename to java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserList.java index 7b6bed807b..7e924b22b7 100644 --- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java +++ b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserList.java @@ -1,4 +1,4 @@ -package com.baeldung.modelmapper; +package com.ossez.modelmapper; import java.util.Collection; diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserListDTO.java similarity index 91% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java rename to java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserListDTO.java index c001cbbc3c..891392724a 100644 --- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java +++ b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UserListDTO.java @@ -1,4 +1,4 @@ -package com.baeldung.modelmapper; +package com.ossez.modelmapper; import java.util.List; diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UsersListConverter.java similarity index 94% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java rename to java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UsersListConverter.java index 19423713e2..0a667dbbf5 100644 --- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java +++ b/java-collections-conversions-2/src/main/java/com/ossez/modelmapper/UsersListConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.modelmapper; +package com.ossez.modelmapper; import org.modelmapper.AbstractConverter; diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java b/java-collections-conversions-2/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java similarity index 97% rename from java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java rename to java-collections-conversions-2/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java index 565c938d48..5705d09804 100644 --- a/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java +++ b/java-collections-conversions-2/src/test/java/com/ossez/arrayconversion/ArrayToListConversionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.arrayconversion; +package com.ossez.arrayconversion; import org.assertj.core.api.ListAssert; import org.hamcrest.CoreMatchers; diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/java-collections-conversions-2/src/test/java/com/ossez/convertarraytostring/ArrayToStringUnitTest.java similarity index 99% rename from java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java rename to java-collections-conversions-2/src/test/java/com/ossez/convertarraytostring/ArrayToStringUnitTest.java index 73cf9d6baa..fc71433354 100644 --- a/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java +++ b/java-collections-conversions-2/src/test/java/com/ossez/convertarraytostring/ArrayToStringUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.convertarraytostring; +package com.ossez.convertarraytostring; import com.google.common.base.Joiner; import com.google.common.base.Splitter; diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java b/java-collections-conversions-2/src/test/java/com/ossez/convertlisttomap/ListToMapUnitTest.java similarity index 97% rename from java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java rename to java-collections-conversions-2/src/test/java/com/ossez/convertlisttomap/ListToMapUnitTest.java index 2b43813822..869a2c719e 100644 --- a/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java +++ b/java-collections-conversions-2/src/test/java/com/ossez/convertlisttomap/ListToMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.convertlisttomap; +package com.ossez.convertlisttomap; import static org.junit.Assert.assertTrue; diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/java-collections-conversions-2/src/test/java/com/ossez/modelmapper/UsersListMappingUnitTest.java similarity index 98% rename from java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java rename to java-collections-conversions-2/src/test/java/com/ossez/modelmapper/UsersListMappingUnitTest.java index a8a72b12f7..a3db205d9e 100644 --- a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java +++ b/java-collections-conversions-2/src/test/java/com/ossez/modelmapper/UsersListMappingUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.modelmapper; +package com.ossez.modelmapper; import org.hamcrest.Matchers; import org.junit.Before; diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java b/java-collections-conversions-2/src/test/java/com/ossez/setiteration/SetIteration.java similarity index 98% rename from java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java rename to java-collections-conversions-2/src/test/java/com/ossez/setiteration/SetIteration.java index ee0943ec1c..9765d7f6fe 100644 --- a/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java +++ b/java-collections-conversions-2/src/test/java/com/ossez/setiteration/SetIteration.java @@ -1,4 +1,4 @@ -package com.baeldung.setiteration; +package com.ossez.setiteration; import com.google.common.collect.Sets; import io.vavr.collection.Stream; diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml index b6f97ac4be..bb8351d963 100644 --- a/java-collections-conversions/pom.xml +++ b/java-collections-conversions/pom.xml @@ -27,6 +27,12 @@ commons-lang3 ${commons-lang3.version} + + org.assertj + assertj-core + ${assertj.version} + test + diff --git a/java-numbers-2/.idea/.gitignore b/java-numbers-2/.idea/.gitignore deleted file mode 100644 index 73f69e0958..0000000000 --- a/java-numbers-2/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/java-numbers-2/.idea/compiler.xml b/java-numbers-2/.idea/compiler.xml deleted file mode 100644 index 0464686f1a..0000000000 --- a/java-numbers-2/.idea/compiler.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/java-numbers-2/.idea/encodings.xml b/java-numbers-2/.idea/encodings.xml deleted file mode 100644 index 63e9001932..0000000000 --- a/java-numbers-2/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/java-numbers-2/.idea/jarRepositories.xml b/java-numbers-2/.idea/jarRepositories.xml deleted file mode 100644 index 712ab9d985..0000000000 --- a/java-numbers-2/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/java-numbers-2/.idea/misc.xml b/java-numbers-2/.idea/misc.xml deleted file mode 100644 index d31b37ac7b..0000000000 --- a/java-numbers-2/.idea/misc.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/java-numbers-2/.idea/runConfigurations.xml b/java-numbers-2/.idea/runConfigurations.xml deleted file mode 100644 index 797acea53e..0000000000 --- a/java-numbers-2/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/java-numbers-2/.idea/vcs.xml b/java-numbers-2/.idea/vcs.xml deleted file mode 100644 index 6c0b863585..0000000000 --- a/java-numbers-2/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java b/java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java deleted file mode 100644 index 9c62ceb5ba..0000000000 --- a/java-numbers-2/src/test/java/com/ossez/primechecker/PrimeCheckerUnitTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ossez.primechecker; - -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class PrimeCheckerUnitTest { - - private final BigIntegerPrimeChecker primeChecker = new BigIntegerPrimeChecker(); - - @Test - public void whenCheckIsPrime_thenTrue() { - assertTrue(primeChecker.isPrime(2L)); - assertTrue(primeChecker.isPrime(13L)); - assertTrue(primeChecker.isPrime(1009L)); - assertTrue(primeChecker.isPrime(74207281L)); - } - - @Test - public void whenCheckIsPrime_thenFalse() { - assertFalse(primeChecker.isPrime(50L)); - assertFalse(primeChecker.isPrime(1001L)); - assertFalse(primeChecker.isPrime(74207282L)); - } - - private final BruteForcePrimeChecker bfPrimeChecker = new BruteForcePrimeChecker(); - - @Test - public void whenBFCheckIsPrime_thenTrue() { - assertTrue(bfPrimeChecker.isPrime(2)); - assertTrue(bfPrimeChecker.isPrime(13)); - assertTrue(bfPrimeChecker.isPrime(1009)); - } - - @Test - public void whenBFCheckIsPrime_thenFalse() { - assertFalse(bfPrimeChecker.isPrime(50)); - assertFalse(bfPrimeChecker.isPrime(1001)); - } - - private final OptimisedPrimeChecker optimisedPrimeChecker = new OptimisedPrimeChecker(); - - @Test - public void whenOptCheckIsPrime_thenTrue() { - assertTrue(optimisedPrimeChecker.isPrime(2)); - assertTrue(optimisedPrimeChecker.isPrime(13)); - assertTrue(optimisedPrimeChecker.isPrime(1009)); - } - - @Test - public void whenOptCheckIsPrime_thenFalse() { - assertFalse(optimisedPrimeChecker.isPrime(50)); - assertFalse(optimisedPrimeChecker.isPrime(1001)); - } - - private final PrimesPrimeChecker primesPrimeChecker = new PrimesPrimeChecker(); - - @Test - public void whenPrimesCheckIsPrime_thenTrue() { - assertTrue(primesPrimeChecker.isPrime(2)); - assertTrue(primesPrimeChecker.isPrime(13)); - assertTrue(primesPrimeChecker.isPrime(1009)); - } - - @Test - public void whenPrimesCheckIsPrime_thenFalse() { - assertFalse(primesPrimeChecker.isPrime(50)); - assertFalse(primesPrimeChecker.isPrime(1001)); - } - -} diff --git a/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java b/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java index e5dc576f65..844680237d 100644 --- a/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java +++ b/src/test/java/com/ossez/codebank/algorithm/tests/VariableTest.java @@ -6,45 +6,97 @@ import org.slf4j.LoggerFactory; import junit.framework.TestCase; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + /** * Object of VariableOssez - * - * @author YuCheng * + * @author YuCheng */ class OssezVariable { - int s1, s2; - static int s3; + int s1, s2; + static int s3; - OssezVariable(int x, int y, int z) { - s1 = x; - s2 = y; - s3 = z; - } + OssezVariable(int x, int y, int z) { + s1 = x; + s2 = y; + s3 = z; + } } /** - * * @author YuCheng - * */ public class VariableTest extends TestCase { - private final static Logger logger = LoggerFactory.getLogger(VariableTest.class); + private final static Logger logger = LoggerFactory.getLogger(VariableTest.class); - /** - * Do RetsServerConnection Test - */ - @Test - public void testStaticVariableChange() { + /** + * Do RetsServerConnection Test + */ + @Test + public void testStaticVariableChange() { - OssezVariable objA = new OssezVariable(1, 2, 3); - logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objA.s1, objA.s2, OssezVariable.s3); +// OssezVariable objA = new OssezVariable(1, 2, 3); +// logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objA.s1, objA.s2, OssezVariable.s3); +// +// OssezVariable objB = new OssezVariable(4, 5, 6); +// logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objA.s1, objA.s2, OssezVariable.s3); +// logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objB.s1, objB.s2, OssezVariable.s3); - OssezVariable objB = new OssezVariable(4, 5, 6); - logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objA.s1, objA.s2, OssezVariable.s3); - logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objB.s1, objB.s2, OssezVariable.s3); + String[][] connections = {{"192.167.0.0", "192.167.0.1"}, {"192.167.0.2", "192.167.0.0"}, {"192.167.0.0", "192.167.0.3"}}; + Boolean[][] connectionsP = {{false, false}, {false, false}, {false, false}}; + String[] toggleIps = {"192.167.0.1", "192.167.0.0", "192.167.0.2", "192.167.0.0", "0.0.0.0"}; + HashMap ipMap = new HashMap(); + HashMap devMap = new HashMap(); + Integer retArray[] = new Integer[toggleIps.length]; - } + + for (int i = 0; i < toggleIps.length; i++) { + String toggleIp = toggleIps[i]; + int count = 0; + + // INIT + Boolean dStatus = false; + for (int row = 0; row < connections.length; row++) { + for (int col = 0; col < connections[row].length; col++) { + + String ipKey = connections[row][col]; + if (ipKey.equals(toggleIp)) + if (connectionsP[row][col] == false) { + connectionsP[row][col] = true; + dStatus = true; + } + else if (connectionsP[row][col] == true) { + connectionsP[row][col] = false; + dStatus = false; + } + } + } + + String retStr = ""; + for (int row = 0; row < connectionsP.length; row++) { + List statusList = new ArrayList<>(); + for (int col = 0; col < connectionsP[row].length; col++) { + statusList.add(connectionsP[row][col]); + } + + if (statusList.get(0) && statusList.get(1) && dStatus) { + count ++; + } + } + + System.out.println(count); + + + } + + +// + } } From 32311cd13847b3728aa27580965c4c2e0a9b38c2 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 23 Sep 2021 15:00:31 -0400 Subject: [PATCH 11/30] Java number related and examples --- .idea/workspace.xml | 147 +++++++++------------------ parent-java/java-numbers-2/README.md | 8 +- 2 files changed, 54 insertions(+), 101 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6fd8d918d0..32f656b6ed 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,102 +4,9 @@
- - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
\ No newline at end of file diff --git a/parent-java/java-numbers-2/README.md b/parent-java/java-numbers-2/README.md index 1d996e32cc..d29b9e1809 100644 --- a/parent-java/java-numbers-2/README.md +++ b/parent-java/java-numbers-2/README.md @@ -1,12 +1,12 @@ -## Java Number Cookbooks and Examples +## Java 数字相关的文章和实例 -This module contains articles about numbers in Java. +本模块中包含了与 Java 数字相关的一些文章 -### Relevant Articles +### 相关文章 - [Lossy Conversion in Java](https://www.baeldung.com/java-lossy-conversion) - [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) - [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) -- [NaN in Java](https://www.baeldung.com/java-not-a-number) +- [Java 中的 NaN](https://www.ossez.com/t/java-nan/13748) - [Generating Prime Numbers in Java](https://www.baeldung.com/java-generate-prime-numbers) - [Using Math.pow in Java](https://www.baeldung.com/java-math-pow) - [Check If a Number Is Prime in Java](https://www.baeldung.com/java-prime-numbers) From 1a634bdd032e0d21984bdc979173c588c825b857 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 23 Sep 2021 15:03:44 -0400 Subject: [PATCH 12/30] Init commit all code --- core-java-modules/core-java-8/.gitignore | 26 +++ core-java-modules/core-java-8/README.md | 15 ++ core-java-modules/core-java-8/pom.xml | 55 +++++ .../ChangeCallsToCurrentTimeInMillisMethod.aj | 9 + .../com/ossez/java_8_features/Address.java | 14 ++ .../java_8_features/CustomException.java | 4 + .../java_8_features/OptionalAddress.java | 16 ++ .../ossez/java_8_features/OptionalUser.java | 16 ++ .../java/com/ossez/java_8_features/User.java | 40 ++++ .../com/ossez/java_8_features/Vehicle.java | 18 ++ .../ossez/java_8_features/VehicleImpl.java | 9 + .../java_8_features/groupingby/BlogPost.java | 36 +++ .../groupingby/BlogPostType.java | 5 + .../java_8_features/groupingby/Tuple.java | 41 ++++ ...lectionStreamsUsingCommonsEmptyIfNull.java | 19 ++ ...ionStreamsUsingJava8OptionalContainer.java | 21 ++ ...ctionStreamsUsingNullDereferenceCheck.java | 20 ++ .../com/ossez/spliteratorAPI/Article.java | 44 ++++ .../java/com/ossez/spliteratorAPI/Author.java | 33 +++ .../com/ossez/spliteratorAPI/Executor.java | 19 ++ .../spliteratorAPI/RelatedAuthorCounter.java | 27 +++ .../RelatedAuthorSpliterator.java | 49 ++++ .../java/com/ossez/spliteratorAPI/Task.java | 27 +++ .../ossez/strategy/ChristmasDiscounter.java | 11 + .../java/com/ossez/strategy/Discounter.java | 23 ++ .../com/ossez/strategy/EasterDiscounter.java | 11 + .../streamreduce/application/Application.java | 63 +++++ .../ossez/streamreduce/entities/Rating.java | 39 ++++ .../ossez/streamreduce/entities/Review.java | 28 +++ .../com/ossez/streamreduce/entities/User.java | 30 +++ .../streamreduce/utilities/NumberUtils.java | 52 +++++ .../src/main/resources/logback.xml | 13 ++ .../DateFormatUnitTest.java | 110 +++++++++ .../NumbersCurrenciesFormattingUnitTest.java | 76 +++++++ ...8DefaultStaticIntefaceMethodsUnitTest.java | 27 +++ .../java8/Java8MethodReferenceUnitTest.java | 67 ++++++ .../ossez/java8/Java8OptionalUnitTest.java | 116 ++++++++++ .../com/ossez/java8/comparator/Employee.java | 22 ++ .../comparator/Java8ComparatorUnitTest.java | 152 +++++++++++++ .../Java8GroupingByCollectorUnitTest.java | 215 ++++++++++++++++++ ...treamsUsingCommonsEmptyIfNullUnitTest.java | 41 ++++ ...msUsingJava8OptionalContainerUnitTest.java | 50 ++++ ...eamsUsingNullDereferenceCheckUnitTest.java | 45 ++++ .../spliteratorAPI/ExecutorUnitTest.java | 44 ++++ .../StrategyDesignPatternUnitTest.java | 72 ++++++ .../tests/StreamReduceManualTest.java | 153 +++++++++++++ .../typeinference/TypeInferenceUnitTest.java | 87 +++++++ .../ossez/util/CurrentDateTimeUnitTest.java | 42 ++++ .../core-java-8/src/test/resources/.gitignore | 13 ++ 49 files changed, 2165 insertions(+) create mode 100644 core-java-modules/core-java-8/.gitignore create mode 100644 core-java-modules/core-java-8/README.md create mode 100644 core-java-modules/core-java-8/pom.xml create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Address.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/CustomException.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalAddress.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalUser.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/User.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Vehicle.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/VehicleImpl.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPost.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPostType.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/Tuple.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Article.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Author.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Executor.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorCounter.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorSpliterator.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Task.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/strategy/ChristmasDiscounter.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/strategy/Discounter.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/strategy/EasterDiscounter.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/application/Application.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Rating.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Review.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/User.java create mode 100644 core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/utilities/NumberUtils.java create mode 100644 core-java-modules/core-java-8/src/main/resources/logback.xml create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/DateFormatUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/NumbersCurrenciesFormattingUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8MethodReferenceUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8OptionalUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Employee.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Java8ComparatorUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/spliteratorAPI/ExecutorUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/strategy/StrategyDesignPatternUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/streamreduce/tests/StreamReduceManualTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/typeinference/TypeInferenceUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/ossez/util/CurrentDateTimeUnitTest.java create mode 100644 core-java-modules/core-java-8/src/test/resources/.gitignore diff --git a/core-java-modules/core-java-8/.gitignore b/core-java-modules/core-java-8/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-modules/core-java-8/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md new file mode 100644 index 0000000000..72bdafe5fa --- /dev/null +++ b/core-java-modules/core-java-8/README.md @@ -0,0 +1,15 @@ +## Core Java 8 + +This module contains articles about Java 8 core features + +### Relevant Articles: +- [New Features in Java 8](https://www.baeldung.com/java-8-new-features) +- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector) +- [Strategy Design Pattern in Java 8](https://www.baeldung.com/java-strategy-pattern) +- [Guide to Java 8 Comparator.comparing()](https://www.baeldung.com/java-8-comparator-comparing) +- [Guide to the Java 8 forEach](https://www.baeldung.com/foreach-java) +- [Introduction to Spliterator in Java](https://www.baeldung.com/java-spliterator) +- [Finding Min/Max in an Array with Java](https://www.baeldung.com/java-array-min-max) +- [Internationalization and Localization in Java 8](https://www.baeldung.com/java-8-localization) +- [Generalized Target-Type Inference in Java](https://www.baeldung.com/java-generalized-target-type-inference) +- [[More -->]](/core-java-modules/core-java-8-2) diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml new file mode 100644 index 0000000000..c5ffa6e8ec --- /dev/null +++ b/core-java-modules/core-java-8/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + core-java-8 + 0.1.0-SNAPSHOT + core-java-8 + jar + + + com.ossez.core-java-modules + core-java-modules + 0.0.2-SNAPSHOT + + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + core-java-8 + + + src/main/resources + true + + + + + + + 4.1 + + 3.6.1 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj b/core-java-modules/core-java-8/src/main/java/com/ossez/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj new file mode 100644 index 0000000000..b28bebfdaf --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj @@ -0,0 +1,9 @@ +package com.baeldung.aspect; + +public aspect ChangeCallsToCurrentTimeInMillisMethod { + long around(): + call(public static native long java.lang.System.currentTimeMillis()) + && within(user.code.base.pckg.*) { + return 0; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Address.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Address.java new file mode 100644 index 0000000000..8f6cd17e26 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Address.java @@ -0,0 +1,14 @@ +package com.ossez.java_8_features; + +public class Address { + + private String street; + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/CustomException.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/CustomException.java new file mode 100644 index 0000000000..5fb2a527de --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/CustomException.java @@ -0,0 +1,4 @@ +package com.ossez.java_8_features; + +public class CustomException extends RuntimeException { +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalAddress.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalAddress.java new file mode 100644 index 0000000000..7a17de1079 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalAddress.java @@ -0,0 +1,16 @@ +package com.ossez.java_8_features; + +import java.util.Optional; + +public class OptionalAddress { + + private String street; + + public Optional getStreet() { + return Optional.ofNullable(street); + } + + public void setStreet(String street) { + this.street = street; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalUser.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalUser.java new file mode 100644 index 0000000000..ba519770ff --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/OptionalUser.java @@ -0,0 +1,16 @@ +package com.ossez.java_8_features; + +import java.util.Optional; + +public class OptionalUser { + + private OptionalAddress address; + + public Optional getAddress() { + return Optional.of(address); + } + + public void setAddress(OptionalAddress address) { + this.address = address; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/User.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/User.java new file mode 100644 index 0000000000..c63cc2c956 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/User.java @@ -0,0 +1,40 @@ +package com.ossez.java_8_features; + +import java.util.Optional; + +public class User { + + private String name; + + private Address address; + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + public User() { + } + + public User(String name) { + this.name = name; + } + + public static boolean isRealUser(User user) { + return true; + } + + public String getOrThrow() { + String value = null; + Optional valueOpt = Optional.ofNullable(value); + String result = valueOpt.orElseThrow(CustomException::new).toUpperCase(); + return result; + } + + public boolean isLegalName(String name) { + return name.length() > 3 && name.length() < 16; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Vehicle.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Vehicle.java new file mode 100644 index 0000000000..110e8cc5e9 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/Vehicle.java @@ -0,0 +1,18 @@ +package com.ossez.java_8_features; + +public interface Vehicle { + + void moveTo(long altitude, long longitude); + + static String producer() { + return "N&F Vehicles"; + } + + default long[] startPosition() { + return new long[] { 23, 15 }; + } + + default String getOverview() { + return "ATV made by " + producer(); + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/VehicleImpl.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/VehicleImpl.java new file mode 100644 index 0000000000..4bd702534d --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/VehicleImpl.java @@ -0,0 +1,9 @@ +package com.ossez.java_8_features; + +public class VehicleImpl implements Vehicle { + + @Override + public void moveTo(long altitude, long longitude) { + // do nothing + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPost.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPost.java new file mode 100644 index 0000000000..44965f0ce2 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPost.java @@ -0,0 +1,36 @@ +package com.ossez.java_8_features.groupingby; + +public class BlogPost { + private String title; + private String author; + private BlogPostType type; + private int likes; + + public BlogPost(String title, String author, BlogPostType type, int likes) { + this.title = title; + this.author = author; + this.type = type; + this.likes = likes; + } + + public String getTitle() { + return title; + } + + public String getAuthor() { + return author; + } + + public BlogPostType getType() { + return type; + } + + public int getLikes() { + return likes; + } + + @Override + public String toString() { + return "BlogPost{" + "title='" + title + '\'' + ", type=" + type + ", likes=" + likes + '}'; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPostType.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPostType.java new file mode 100644 index 0000000000..3b8eeb3da5 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/BlogPostType.java @@ -0,0 +1,5 @@ +package com.ossez.java_8_features.groupingby; + +public enum BlogPostType { + NEWS, REVIEW, GUIDE +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/Tuple.java b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/Tuple.java new file mode 100644 index 0000000000..1761e2757a --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/java_8_features/groupingby/Tuple.java @@ -0,0 +1,41 @@ +package com.ossez.java_8_features.groupingby; + +import java.util.Objects; + +public class Tuple { + private final BlogPostType type; + private final String author; + + public Tuple(BlogPostType type, String author) { + this.type = type; + this.author = author; + } + + public BlogPostType getType() { + return type; + } + + public String getAuthor() { + return author; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Tuple tuple = (Tuple) o; + return type == tuple.type && author.equals(tuple.author); + } + + @Override + public int hashCode() { + return Objects.hash(type, author); + } + + @Override + public String toString() { + return "Tuple{" + "type=" + type + ", author='" + author + '\'' + '}'; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java b/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java new file mode 100644 index 0000000000..fb72c104ee --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java @@ -0,0 +1,19 @@ +package com.ossez.nullsafecollectionstreams; + +import java.util.Collection; +import java.util.stream.Stream; +import static org.apache.commons.collections4.CollectionUtils.emptyIfNull; + +public class NullSafeCollectionStreamsUsingCommonsEmptyIfNull { + + /** + * This method shows how to make a null safe stream from a collection through the use of + * emptyIfNull() method from Apache Commons CollectionUtils library + * + * @param collection The collection that is to be converted into a stream + * @return The stream that has been created from the collection or an empty stream if the collection is null + */ + public Stream collectionAsStream(Collection collection) { + return emptyIfNull(collection).stream(); + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java b/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java new file mode 100644 index 0000000000..7ab449f232 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java @@ -0,0 +1,21 @@ +package com.ossez.nullsafecollectionstreams; + +import java.util.Collection; +import java.util.Optional; +import java.util.stream.Stream; + +public class NullSafeCollectionStreamsUsingJava8OptionalContainer { + + /** + * This method shows how to make a null safe stream from a collection through the use of + * Java SE 8’s Optional Container + * + * @param collection The collection that is to be converted into a stream + * @return The stream that has been created from the collection or an empty stream if the collection is null + */ + public Stream collectionAsStream(Collection collection) { + return Optional.ofNullable(collection) + .map(Collection::stream) + .orElseGet(Stream::empty); + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java b/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java new file mode 100644 index 0000000000..d06bd2e270 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java @@ -0,0 +1,20 @@ +package com.ossez.nullsafecollectionstreams; + +import java.util.Collection; +import java.util.stream.Stream; + +public class NullSafeCollectionStreamsUsingNullDereferenceCheck { + + /** + * This method shows how to make a null safe stream from a collection through the use of a check + * to prevent null dereferences + * + * @param collection The collection that is to be converted into a stream + * @return The stream that has been created from the collection or an empty stream if the collection is null + */ + public Stream collectionAsStream(Collection collection) { + return collection == null ? Stream.empty() : collection.stream(); + } + + +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Article.java b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Article.java new file mode 100644 index 0000000000..99784cbfbe --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Article.java @@ -0,0 +1,44 @@ +package com.ossez.spliteratorAPI; + +import java.util.List; + +public class Article { + private List listOfAuthors; + private int id; + private String name; + + public Article(String name) { + this.name = name; + } + + public Article(List listOfAuthors, int id) { + super(); + this.listOfAuthors = listOfAuthors; + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public List getListOfAuthors() { + return listOfAuthors; + } + + public void setListOfAuthors(List listOfAuthors) { + this.listOfAuthors = listOfAuthors; + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Author.java b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Author.java new file mode 100644 index 0000000000..68f9ae21f2 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Author.java @@ -0,0 +1,33 @@ +package com.ossez.spliteratorAPI; + +public class Author { + private String name; + private int relatedArticleId; + + public Author(String name, int relatedArticleId) { + this.name = name; + this.relatedArticleId = relatedArticleId; + } + + public int getRelatedArticleId() { + return relatedArticleId; + } + + public void setRelatedArticleId(int relatedArticleId) { + this.relatedArticleId = relatedArticleId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "[name: " + name + ", relatedId: " + relatedArticleId + "]"; + } +} + diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Executor.java b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Executor.java new file mode 100644 index 0000000000..894bd5ba66 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Executor.java @@ -0,0 +1,19 @@ +package com.ossez.spliteratorAPI; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Executor { + + public static int countAutors(Stream stream) { + RelatedAuthorCounter wordCounter = stream.reduce(new RelatedAuthorCounter(0, true), + RelatedAuthorCounter::accumulate, RelatedAuthorCounter::combine); + return wordCounter.getCounter(); + } + + public static List
generateElements() { + return Stream.generate(() -> new Article("Java")).limit(35000).collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorCounter.java b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorCounter.java new file mode 100644 index 0000000000..f6bca6ac3e --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorCounter.java @@ -0,0 +1,27 @@ +package com.ossez.spliteratorAPI; + +public class RelatedAuthorCounter { + private final int counter; + private final boolean isRelated; + + public RelatedAuthorCounter(int counter, boolean isRelated) { + this.counter = counter; + this.isRelated = isRelated; + } + + public RelatedAuthorCounter accumulate(Author author) { + if (author.getRelatedArticleId() == 0) { + return isRelated ? this : new RelatedAuthorCounter(counter, true); + } else { + return isRelated ? new RelatedAuthorCounter(counter + 1, false) : this; + } + } + + public RelatedAuthorCounter combine(RelatedAuthorCounter RelatedAuthorCounter) { + return new RelatedAuthorCounter(counter + RelatedAuthorCounter.counter, RelatedAuthorCounter.isRelated); + } + + public int getCounter() { + return counter; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorSpliterator.java b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorSpliterator.java new file mode 100644 index 0000000000..239747f7a5 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/RelatedAuthorSpliterator.java @@ -0,0 +1,49 @@ +package com.ossez.spliteratorAPI; + +import java.util.List; +import java.util.Spliterator; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +public class RelatedAuthorSpliterator implements Spliterator { + private final List list; + AtomicInteger current = new AtomicInteger(); + + public RelatedAuthorSpliterator(List list) { + this.list = list; + } + + @Override + public boolean tryAdvance(Consumer action) { + + action.accept(list.get(current.getAndIncrement())); + return current.get() < list.size(); + } + + @Override + public Spliterator trySplit() { + int currentSize = list.size() - current.get(); + if (currentSize < 10) { + return null; + } + for (int splitPos = currentSize / 2 + current.intValue(); splitPos < list.size(); splitPos++) { + if (list.get(splitPos).getRelatedArticleId() == 0) { + Spliterator spliterator = new RelatedAuthorSpliterator(list.subList(current.get(), splitPos)); + current.set(splitPos); + return spliterator; + } + } + return null; + } + + @Override + public long estimateSize() { + return list.size() - current.get(); + } + + @Override + public int characteristics() { + return CONCURRENT; + } + +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Task.java b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Task.java new file mode 100644 index 0000000000..e4bff0efa7 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/spliteratorAPI/Task.java @@ -0,0 +1,27 @@ +package com.ossez.spliteratorAPI; + +import java.util.Spliterator; +import java.util.concurrent.Callable; + +public class Task implements Callable { + private Spliterator
spliterator; + private final static String SUFFIX = "- published by Baeldung"; + + public Task(Spliterator
spliterator) { + this.spliterator = spliterator; + } + + @Override + public String call() { + int current = 0; + while (spliterator.tryAdvance(article -> { + article.setName(article.getName() + .concat(SUFFIX)); + })) { + current++; + } + ; + return Thread.currentThread() + .getName() + ":" + current; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/ChristmasDiscounter.java b/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/ChristmasDiscounter.java new file mode 100644 index 0000000000..87532af1fd --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/ChristmasDiscounter.java @@ -0,0 +1,11 @@ +package com.ossez.strategy; + +import java.math.BigDecimal; + +public class ChristmasDiscounter implements Discounter { + + @Override + public BigDecimal apply(BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.9)); + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/Discounter.java b/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/Discounter.java new file mode 100644 index 0000000000..82e177638a --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/Discounter.java @@ -0,0 +1,23 @@ +package com.ossez.strategy; + +import java.math.BigDecimal; +import java.util.function.UnaryOperator; + +public interface Discounter extends UnaryOperator { + + default Discounter combine(Discounter after) { + return value -> after.apply(this.apply(value)); + } + + static Discounter christmas() { + return (amount) -> amount.multiply(BigDecimal.valueOf(0.9)); + } + + static Discounter newYear() { + return (amount) -> amount.multiply(BigDecimal.valueOf(0.8)); + } + + static Discounter easter() { + return (amount) -> amount.multiply(BigDecimal.valueOf(0.5)); + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/EasterDiscounter.java b/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/EasterDiscounter.java new file mode 100644 index 0000000000..32d1c4d69e --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/strategy/EasterDiscounter.java @@ -0,0 +1,11 @@ +package com.ossez.strategy; + +import java.math.BigDecimal; + +public class EasterDiscounter implements Discounter { + + @Override + public BigDecimal apply(BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.5)); + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/application/Application.java b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/application/Application.java new file mode 100644 index 0000000000..07a58b70b6 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/application/Application.java @@ -0,0 +1,63 @@ +package com.ossez.streamreduce.application; + +import com.ossez.streamreduce.entities.User; +import com.ossez.streamreduce.utilities.NumberUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Application { + + public static void main(String[] args) { + List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); + int result1 = numbers.stream().reduce(0, (a, b) -> a + b); + System.out.println(result1); + + int result2 = numbers.stream().reduce(0, Integer::sum); + System.out.println(result2); + + List letters = Arrays.asList("a", "b", "c", "d", "e"); + String result3 = letters.stream().reduce("", (a, b) -> a + b); + System.out.println(result3); + + String result4 = letters.stream().reduce("", String::concat); + System.out.println(result4); + + String result5 = letters.stream().reduce("", (a, b) -> a.toUpperCase() + b.toUpperCase()); + System.out.println(result5); + + List users = Arrays.asList(new User("John", 30), new User("Julie", 35)); + int result6 = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); + System.out.println(result6); + + String result7 = letters.parallelStream().reduce("", String::concat); + System.out.println(result7); + + int result8 = users.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); + System.out.println(result8); + + List userList = new ArrayList<>(); + for (int i = 0; i <= 1000000; i++) { + userList.add(new User("John" + i, i)); + } + + long t1 = System.currentTimeMillis(); + int result9 = userList.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); + long t2 = System.currentTimeMillis(); + System.out.println(result9); + System.out.println("Sequential stream time: " + (t2 - t1) + "ms"); + + long t3 = System.currentTimeMillis(); + int result10 = userList.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); + long t4 = System.currentTimeMillis(); + System.out.println(result10); + System.out.println("Parallel stream time: " + (t4 - t3) + "ms"); + + int result11 = NumberUtils.divideListElements(numbers, 1); + System.out.println(result11); + + int result12 = NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 0); + System.out.println(result12); + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Rating.java b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Rating.java new file mode 100644 index 0000000000..a36371dde1 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Rating.java @@ -0,0 +1,39 @@ +package com.ossez.streamreduce.entities; + +import java.util.ArrayList; +import java.util.List; + +public class Rating { + + double points; + List reviews = new ArrayList<>(); + + public Rating() {} + + public void add(Review review) { + reviews.add(review); + computeRating(); + } + + private double computeRating() { + double totalPoints = reviews.stream().map(Review::getPoints).reduce(0, Integer::sum); + this.points = totalPoints / reviews.size(); + return this.points; + } + + public static Rating average(Rating r1, Rating r2) { + Rating combined = new Rating(); + combined.reviews = new ArrayList<>(r1.reviews); + combined.reviews.addAll(r2.reviews); + combined.computeRating(); + return combined; + } + + public double getPoints() { + return points; + } + + public List getReviews() { + return reviews; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Review.java b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Review.java new file mode 100644 index 0000000000..3f63d00f98 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/Review.java @@ -0,0 +1,28 @@ +package com.ossez.streamreduce.entities; + +public class Review { + + int points; + String review; + + public Review(int points, String review) { + this.points = points; + this.review = review; + } + + public int getPoints() { + return points; + } + + public void setPoints(int points) { + this.points = points; + } + + public String getReview() { + return review; + } + + public void setReview(String review) { + this.review = review; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/User.java b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/User.java new file mode 100644 index 0000000000..949b9ef388 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/entities/User.java @@ -0,0 +1,30 @@ +package com.ossez.streamreduce.entities; + +public class User { + + private final String name; + private final int age; + private final Rating rating = new Rating(); + + public User(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + public Rating getRating() { + return rating; + } + + @Override + public String toString() { + return "User{" + "name=" + name + ", age=" + age + '}'; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/utilities/NumberUtils.java b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/utilities/NumberUtils.java new file mode 100644 index 0000000000..b36c4b3554 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/ossez/streamreduce/utilities/NumberUtils.java @@ -0,0 +1,52 @@ +package com.ossez.streamreduce.utilities; + +import java.util.List; +import java.util.function.BiFunction; +import java.util.logging.Level; +import java.util.logging.Logger; + +public abstract class NumberUtils { + + private static final Logger LOGGER = Logger.getLogger(NumberUtils.class.getName()); + + public static int divideListElements(List values, Integer divider) { + return values.stream() + .reduce(0, (a, b) -> { + try { + return a / divider + b / divider; + } catch (ArithmeticException e) { + LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero"); + } + return 0; + }); + } + + public static int divideListElementsWithExtractedTryCatchBlock(List values, int divider) { + return values.stream().reduce(0, (a, b) -> divide(a, divider) + divide(b, divider)); + } + + public static int divideListElementsWithApplyFunctionMethod(List values, int divider) { + BiFunction division = (a, b) -> a / b; + return values.stream().reduce(0, (a, b) -> applyFunction(division, a, divider) + applyFunction(division, b, divider)); + } + + private static int divide(int value, int factor) { + int result = 0; + try { + result = value / factor; + } catch (ArithmeticException e) { + LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero"); + } + return result; + } + + private static int applyFunction(BiFunction function, int a, int b) { + try { + return function.apply(a, b); + } + catch(Exception e) { + LOGGER.log(Level.INFO, "Exception occurred!"); + } + return 0; + } +} diff --git a/core-java-modules/core-java-8/src/main/resources/logback.xml b/core-java-modules/core-java-8/src/main/resources/logback.xml new file mode 100644 index 0000000000..11032b47f4 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/DateFormatUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/DateFormatUnitTest.java new file mode 100644 index 0000000000..2e7a140f5a --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/DateFormatUnitTest.java @@ -0,0 +1,110 @@ +package com.ossez.internationalization; + +import org.junit.Assert; +import org.junit.Test; + +import java.text.DateFormat; +import java.text.DateFormatSymbols; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Locale; +import java.util.TimeZone; + +public class DateFormatUnitTest { + + @Test + public void givenGregorianCalendar_whenLocaleSpecificDateInstance_givenLanguageSpecificMonths() { + GregorianCalendar gregorianCalendar = new GregorianCalendar(2018, 1, 1, 10, 15, 20); + Date date = gregorianCalendar.getTime(); + + DateFormat itInstance = DateFormat.getDateInstance(DateFormat.FULL, Locale.ITALY); + DateFormat usInstance = DateFormat.getDateInstance(DateFormat.FULL, Locale.US); + + Assert.assertEquals("giovedì 1 febbraio 2018", itInstance.format(date)); + Assert.assertEquals("Thursday, February 1, 2018", usInstance.format(date)); + } + + @Test + public void givenGregorianCalendar_whenDateInstanceWithDifferentFormats_givenSpecificDateFormatting() { + GregorianCalendar gregorianCalendar = new GregorianCalendar(2018, 1, 1, 10, 15, 20); + Date date = gregorianCalendar.getTime(); + + DateFormat fullInstance = DateFormat.getDateInstance(DateFormat.FULL, Locale.ITALY); + DateFormat mediumInstance = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.ITALY); + + Assert.assertEquals("giovedì 1 febbraio 2018", fullInstance.format(date)); + Assert.assertEquals("1-feb-2018", mediumInstance.format(date)); + } + + @Test + public void givenGregorianCalendar_whenTimeInstanceWithDifferentFormats_givenSpecificTimeFormatting() { + GregorianCalendar gregorianCalendar = new GregorianCalendar(2018, 1, 1, 10, 15, 20); + gregorianCalendar.setTimeZone(TimeZone.getTimeZone("CET")); + TimeZone.setDefault(TimeZone.getTimeZone("CET")); + Date date = gregorianCalendar.getTime(); + + DateFormat fullInstance = DateFormat.getTimeInstance(DateFormat.FULL, Locale.ITALY); + DateFormat mediumInstance = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.ITALY); + + Assert.assertEquals("10.15.20 CET", fullInstance.format(date)); + Assert.assertEquals("10.15.20" , mediumInstance.format(date)); + } + + @Test + public void givenGregorianCalendar_whenDateTimeInstanceWithDifferentFormats_givenSpecificDateTimeFormatting() { + GregorianCalendar gregorianCalendar = new GregorianCalendar(2018, 1, 1, 10, 15, 20); + gregorianCalendar.setTimeZone(TimeZone.getTimeZone("CET")); + TimeZone.setDefault(TimeZone.getTimeZone("CET")); + Date date = gregorianCalendar.getTime(); + + DateFormat ffInstance = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.ITALY); + DateFormat smInstance = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.ITALY); + + Assert.assertEquals("giovedì 1 febbraio 2018 10.15.20 CET", ffInstance.format(date)); + Assert.assertEquals("01/02/18 10.15.20", smInstance.format(date)); + } + + @Test + public void givenGregorianCalendar_whenLocaleSpecificDateTimeInstance_givenLocaleSpecificFormatting() { + GregorianCalendar gregorianCalendar = new GregorianCalendar(2018, 1, 1, 10, 15, 20); + gregorianCalendar.setTimeZone(TimeZone.getTimeZone("CET")); + TimeZone.setDefault(TimeZone.getTimeZone("CET")); + Date date = gregorianCalendar.getTime(); + + DateFormat itInstance = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.ITALY); + DateFormat jpInstance = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.JAPAN); + + Assert.assertEquals("giovedì 1 febbraio 2018 10.15.20 CET", itInstance.format(date)); + Assert.assertEquals("2018年2月1日 10時15分20秒 CET", jpInstance.format(date)); + } + + @Test + public void givenGregorianCalendar_whenCustomizedSimpleDateFormat_thenSpecificMonthRepresentations() { + GregorianCalendar gregorianCalendar = new GregorianCalendar(2018, 1, 1, 10, 15, 20); + Date date = gregorianCalendar.getTime(); + Locale.setDefault(new Locale("pl", "PL")); + + SimpleDateFormat fullMonthDateFormat = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss:SSS"); + SimpleDateFormat shortMonthsimpleDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss:SSS"); + + Assert.assertEquals("01-lutego-2018 10:15:20:000", fullMonthDateFormat.format(date)); + Assert.assertEquals("01-02-2018 10:15:20:000" , shortMonthsimpleDateFormat.format(date)); + } + + @Test + public void givenGregorianCalendar_whenCustomizedDateFormatSymbols_thenChangedDayNames() { + GregorianCalendar gregorianCalendar = new GregorianCalendar(2018, 1, 1, 10, 15, 20); + Date date = gregorianCalendar.getTime(); + Locale.setDefault(new Locale("pl", "PL")); + + DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(); + dateFormatSymbols.setWeekdays(new String[]{"A", "B", "C", "D", "E", "F", "G", "H"}); + SimpleDateFormat standardDateFormat = new SimpleDateFormat("EEEE-MMMM-yyyy HH:mm:ss:SSS"); + SimpleDateFormat newDaysDateFormat = new SimpleDateFormat("EEEE-MMMM-yyyy HH:mm:ss:SSS", dateFormatSymbols); + + Assert.assertEquals("czwartek-lutego-2018 10:15:20:000", standardDateFormat.format(date)); + Assert.assertEquals("F-lutego-2018 10:15:20:000", newDaysDateFormat.format(date)); + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/NumbersCurrenciesFormattingUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/NumbersCurrenciesFormattingUnitTest.java new file mode 100644 index 0000000000..db59219d7f --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/internationalization/NumbersCurrenciesFormattingUnitTest.java @@ -0,0 +1,76 @@ +package com.ossez.internationalization; + +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.util.Currency; +import java.util.Locale; + +public class NumbersCurrenciesFormattingUnitTest { + + @Test + public void givenDifferentLocalesAndDoubleNumber_whenNumberInstance_thenDifferentOutput() { + Locale usLocale = Locale.US; + Locale plLocale = new Locale("pl", "PL"); + Locale deLocale = Locale.GERMANY; + double number = 102_300.456d; + + NumberFormat usNumberFormat = NumberFormat.getInstance(usLocale); + NumberFormat plNumberFormat = NumberFormat.getInstance(plLocale); + NumberFormat deNumberFormat = NumberFormat.getInstance(deLocale); + + Assert.assertEquals(usNumberFormat.format(number), "102,300.456"); + Assert.assertEquals(plNumberFormat.format(number), "102 300,456"); + Assert.assertEquals(deNumberFormat.format(number), "102.300,456"); + } + + @Test + public void givenDifferentLocalesAndDoubleAmount_whenCurrencyInstance_thenDifferentOutput() { + Locale usLocale = Locale.US; + Locale plLocale = new Locale("pl", "PL"); + Locale deLocale = Locale.GERMANY; + BigDecimal number = new BigDecimal(102_300.456d); + + NumberFormat usNumberFormat = NumberFormat.getCurrencyInstance(usLocale); + NumberFormat plNumberFormat = NumberFormat.getCurrencyInstance(plLocale); + NumberFormat deNumberFormat = NumberFormat.getCurrencyInstance(deLocale); + + Assert.assertEquals(usNumberFormat.format(number), "$102,300.46"); + Assert.assertEquals(plNumberFormat.format(number), "102 300,46 zł"); + Assert.assertEquals(deNumberFormat.format(number), "102.300,46 €"); + } + + @Test + public void givenLocaleAndNumber_whenSpecificDecimalFormat_thenSpecificOutput() { + Locale.setDefault(Locale.FRANCE); + BigDecimal number = new BigDecimal(102_300.456d); + + DecimalFormat zeroDecimalFormat = new DecimalFormat("000000000.0000"); + DecimalFormat hashDecimalFormat = new DecimalFormat("###,###.#"); + DecimalFormat dollarDecimalFormat = new DecimalFormat("$###,###.##"); + + Assert.assertEquals(zeroDecimalFormat.format(number), "000102300,4560"); + Assert.assertEquals(hashDecimalFormat.format(number), "102 300,5"); + Assert.assertEquals(dollarDecimalFormat.format(number), "$102 300,46"); + } + + @Test + public void givenLocaleAndNumber_whenSpecificDecimalFormatSymbols_thenSpecificOutput() { + Locale.setDefault(Locale.FRANCE); + BigDecimal number = new BigDecimal(102_300.456d); + + DecimalFormatSymbols decimalFormatSymbols = DecimalFormatSymbols.getInstance(); + decimalFormatSymbols.setGroupingSeparator('^'); + decimalFormatSymbols.setDecimalSeparator('@'); + DecimalFormat separatorsDecimalFormat = new DecimalFormat("$###,###.##"); + separatorsDecimalFormat.setGroupingSize(4); + separatorsDecimalFormat.setCurrency(Currency.getInstance(Locale.JAPAN)); + separatorsDecimalFormat.setDecimalFormatSymbols(decimalFormatSymbols); + + Assert.assertEquals(separatorsDecimalFormat.format(number), "$10^2300@46"); + } +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java new file mode 100644 index 0000000000..8a1b0705f5 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java @@ -0,0 +1,27 @@ +package com.ossez.java8; + +import com.ossez.java_8_features.Vehicle; +import com.ossez.java_8_features.VehicleImpl; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class Java8DefaultStaticIntefaceMethodsUnitTest { + + @Test + public void callStaticInterfaceMethdosMethods_whenExpectedResults_thenCorrect() { + Vehicle vehicle = new VehicleImpl(); + String overview = vehicle.getOverview(); + long[] startPosition = vehicle.startPosition(); + + assertEquals(overview, "ATV made by N&F Vehicles"); + assertEquals(startPosition[0], 23); + assertEquals(startPosition[1], 15); + } + + @Test + public void callDefaultInterfaceMethods_whenExpectedResults_thenCorrect() { + String producer = Vehicle.producer(); + assertEquals(producer, "N&F Vehicles"); + } +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8MethodReferenceUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8MethodReferenceUnitTest.java new file mode 100644 index 0000000000..3f3fe24bbc --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8MethodReferenceUnitTest.java @@ -0,0 +1,67 @@ +package com.ossez.java8; + +import com.ossez.java_8_features.User; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class Java8MethodReferenceUnitTest { + + private List list; + + @Before + public void init() { + list = new ArrayList<>(); + list.add("One"); + list.add("OneAndOnly"); + list.add("Derek"); + list.add("Change"); + list.add("factory"); + list.add("justBefore"); + list.add("Italy"); + list.add("Italy"); + list.add("Thursday"); + list.add(""); + list.add(""); + } + + @Test + public void checkStaticMethodReferences_whenWork_thenCorrect() { + + List users = new ArrayList<>(); + users.add(new User()); + users.add(new User()); + boolean isReal = users.stream().anyMatch(u -> User.isRealUser(u)); + boolean isRealRef = users.stream().anyMatch(User::isRealUser); + assertTrue(isReal); + assertTrue(isRealRef); + } + + @Test + public void checkInstanceMethodReferences_whenWork_thenCorrect() { + User user = new User(); + boolean isLegalName = list.stream().anyMatch(user::isLegalName); + assertTrue(isLegalName); + } + + @Test + public void checkParticularTypeReferences_whenWork_thenCorrect() { + long count = list.stream().filter(String::isEmpty).count(); + assertEquals(count, 2); + } + + @Test + public void checkConstructorReferences_whenWork_thenCorrect() { + Stream stream = list.stream().map(User::new); + List userList = stream.collect(Collectors.toList()); + assertEquals(userList.size(), list.size()); + assertTrue(userList.get(0) instanceof User); + } +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8OptionalUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8OptionalUnitTest.java new file mode 100644 index 0000000000..9f408cf577 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/Java8OptionalUnitTest.java @@ -0,0 +1,116 @@ +package com.ossez.java8; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; + +import com.ossez.java_8_features.Address; +import com.ossez.java_8_features.CustomException; +import com.ossez.java_8_features.OptionalAddress; +import com.ossez.java_8_features.OptionalUser; +import com.ossez.java_8_features.User; + +public class Java8OptionalUnitTest { + + private List list; + + @Before + public void init() { + list = new ArrayList<>(); + list.add("One"); + list.add("OneAndOnly"); + list.add("Derek"); + list.add("Change"); + list.add("factory"); + list.add("justBefore"); + list.add("Italy"); + list.add("Italy"); + list.add("Thursday"); + list.add(""); + list.add(""); + } + + @Test + public void checkOptional_whenAsExpected_thenCorrect() { + Optional optionalEmpty = Optional.empty(); + assertFalse(optionalEmpty.isPresent()); + + String str = "value"; + Optional optional = Optional.of(str); + assertEquals(optional.get(), "value"); + + Optional optionalNullable = Optional.ofNullable(str); + Optional optionalNull = Optional.ofNullable(null); + assertEquals(optionalNullable.get(), "value"); + assertFalse(optionalNull.isPresent()); + + List listOpt = Optional.of(list).orElse(new ArrayList<>()); + List listNull = null; + List listOptNull = Optional.ofNullable(listNull).orElse(new ArrayList<>()); + assertTrue(listOpt == list); + assertTrue(listOptNull.isEmpty()); + + Optional user = Optional.ofNullable(getUser()); + String result = user.map(User::getAddress).map(Address::getStreet).orElse("not specified"); + assertEquals(result, "1st Avenue"); + + Optional optionalUser = Optional.ofNullable(getOptionalUser()); + String resultOpt = optionalUser.flatMap(OptionalUser::getAddress).flatMap(OptionalAddress::getStreet).orElse("not specified"); + assertEquals(resultOpt, "1st Avenue"); + + Optional userNull = Optional.ofNullable(getUserNull()); + String resultNull = userNull.map(User::getAddress).map(Address::getStreet).orElse("not specified"); + assertEquals(resultNull, "not specified"); + + Optional optionalUserNull = Optional.ofNullable(getOptionalUserNull()); + String resultOptNull = optionalUserNull.flatMap(OptionalUser::getAddress).flatMap(OptionalAddress::getStreet).orElse("not specified"); + assertEquals(resultOptNull, "not specified"); + + } + + @Test(expected = CustomException.class) + public void callMethod_whenCustomException_thenCorrect() { + User user = new User(); + String result = user.getOrThrow(); + } + + private User getUser() { + User user = new User(); + Address address = new Address(); + address.setStreet("1st Avenue"); + user.setAddress(address); + return user; + } + + private OptionalUser getOptionalUser() { + OptionalUser user = new OptionalUser(); + OptionalAddress address = new OptionalAddress(); + address.setStreet("1st Avenue"); + user.setAddress(address); + return user; + } + + private OptionalUser getOptionalUserNull() { + OptionalUser user = new OptionalUser(); + OptionalAddress address = new OptionalAddress(); + address.setStreet(null); + user.setAddress(address); + return user; + } + + private User getUserNull() { + User user = new User(); + Address address = new Address(); + address.setStreet(null); + user.setAddress(address); + return user; + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Employee.java b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Employee.java new file mode 100644 index 0000000000..7030f4c2a1 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Employee.java @@ -0,0 +1,22 @@ +package com.ossez.java8.comparator; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@AllArgsConstructor +@ToString +@EqualsAndHashCode +public class Employee implements Comparable{ + String name; + int age; + double salary; + long mobile; + + @Override + public int compareTo(Employee argEmployee) { + return name.compareTo(argEmployee.getName()); + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Java8ComparatorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Java8ComparatorUnitTest.java new file mode 100644 index 0000000000..252967fb04 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/java8/comparator/Java8ComparatorUnitTest.java @@ -0,0 +1,152 @@ +package com.ossez.java8.comparator; + +import java.util.Arrays; +import java.util.Comparator; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class Java8ComparatorUnitTest { + + private Employee[] employees; + private Employee[] employeesArrayWithNulls; + private Employee[] sortedEmployeesByName; + private Employee[] sortedEmployeesByNameDesc; + private Employee[] sortedEmployeesByAge; + private Employee[] sortedEmployeesByMobile; + private Employee[] sortedEmployeesBySalary; + private Employee[] sortedEmployeesArray_WithNullsFirst; + private Employee[] sortedEmployeesArray_WithNullsLast; + private Employee[] sortedEmployeesByNameAge; + private Employee[] someMoreEmployees; + private Employee[] sortedEmployeesByAgeName;; + + @Before + public void initData() { + employees = new Employee[] { new Employee("John", 25, 3000, 9922001), new Employee("Ace", 22, 2000, 5924001), new Employee("Keith", 35, 4000, 3924401) }; + employeesArrayWithNulls = new Employee[] { new Employee("John", 25, 3000, 9922001), null, new Employee("Ace", 22, 2000, 5924001), null, new Employee("Keith", 35, 4000, 3924401) }; + + sortedEmployeesByName = new Employee[] { new Employee("Ace", 22, 2000, 5924001), new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + sortedEmployeesByNameDesc = new Employee[] { new Employee("Keith", 35, 4000, 3924401), new Employee("John", 25, 3000, 9922001), new Employee("Ace", 22, 2000, 5924001) }; + + sortedEmployeesByAge = new Employee[] { new Employee("Ace", 22, 2000, 5924001), new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + + sortedEmployeesByMobile = new Employee[] { new Employee("Keith", 35, 4000, 3924401), new Employee("Ace", 22, 2000, 5924001), new Employee("John", 25, 3000, 9922001), }; + + sortedEmployeesBySalary = new Employee[] { new Employee("Ace", 22, 2000, 5924001), new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401), }; + + sortedEmployeesArray_WithNullsFirst = new Employee[] { null, null, new Employee("Ace", 22, 2000, 5924001), new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + sortedEmployeesArray_WithNullsLast = new Employee[] { new Employee("Ace", 22, 2000, 5924001), new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401), null, null }; + + someMoreEmployees = new Employee[] { new Employee("Jake", 25, 3000, 9922001), new Employee("Jake", 22, 2000, 5924001), new Employee("Ace", 22, 3000, 6423001), new Employee("Keith", 35, 4000, 3924401) }; + + sortedEmployeesByAgeName = new Employee[] { new Employee("Ace", 22, 3000, 6423001), new Employee("Jake", 22, 2000, 5924001), new Employee("Jake", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + sortedEmployeesByNameAge = new Employee[] { new Employee("Ace", 22, 3000, 6423001), new Employee("Jake", 22, 2000, 5924001), new Employee("Jake", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + } + + @Test + public void whenComparing_thenSortedByName() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName); + Arrays.sort(employees, employeeNameComparator); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByName)); + } + + @Test + public void whenComparingWithComparator_thenSortedByNameDesc() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName, (s1, s2) -> { + return s2.compareTo(s1); + }); + Arrays.sort(employees, employeeNameComparator); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByNameDesc)); + } + + @Test + public void whenReversed_thenSortedByNameDesc() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName); + Comparator employeeNameComparatorReversed = employeeNameComparator.reversed(); + Arrays.sort(employees, employeeNameComparatorReversed); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByNameDesc)); + } + + @Test + public void whenComparingInt_thenSortedByAge() { + Comparator employeeAgeComparator = Comparator.comparingInt(Employee::getAge); + Arrays.sort(employees, employeeAgeComparator); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByAge)); + } + + @Test + public void whenComparingLong_thenSortedByMobile() { + Comparator employeeMobileComparator = Comparator.comparingLong(Employee::getMobile); + Arrays.sort(employees, employeeMobileComparator); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByMobile)); + } + + @Test + public void whenComparingDouble_thenSortedBySalary() { + Comparator employeeSalaryComparator = Comparator.comparingDouble(Employee::getSalary); + Arrays.sort(employees, employeeSalaryComparator); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesBySalary)); + } + + @Test + public void whenNaturalOrder_thenSortedByName() { + Comparator employeeNameComparator = Comparator. naturalOrder(); + Arrays.sort(employees, employeeNameComparator); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByName)); + } + + @Test + public void whenReverseOrder_thenSortedByNameDesc() { + Comparator employeeNameComparator = Comparator. reverseOrder(); + Arrays.sort(employees, employeeNameComparator); + // System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByNameDesc)); + } + + @Test + public void whenNullsFirst_thenSortedByNameWithNullsFirst() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName); + Comparator employeeNameComparator_nullFirst = Comparator.nullsFirst(employeeNameComparator); + Arrays.sort(employeesArrayWithNulls, employeeNameComparator_nullFirst); + // System.out.println(Arrays.toString(employeesArrayWithNulls)); + assertTrue(Arrays.equals(employeesArrayWithNulls, sortedEmployeesArray_WithNullsFirst)); + } + + @Test + public void whenNullsLast_thenSortedByNameWithNullsLast() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName); + Comparator employeeNameComparator_nullLast = Comparator.nullsLast(employeeNameComparator); + Arrays.sort(employeesArrayWithNulls, employeeNameComparator_nullLast); + // System.out.println(Arrays.toString(employeesArrayWithNulls)); + assertTrue(Arrays.equals(employeesArrayWithNulls, sortedEmployeesArray_WithNullsLast)); + } + + @Test + public void whenThenComparing_thenSortedByAgeName() { + Comparator employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge).thenComparing(Employee::getName); + + Arrays.sort(someMoreEmployees, employee_Age_Name_Comparator); + // System.out.println(Arrays.toString(someMoreEmployees)); + assertTrue(Arrays.equals(someMoreEmployees, sortedEmployeesByAgeName)); + } + + @Test + public void whenThenComparing_thenSortedByNameAge() { + Comparator employee_Name_Age_Comparator = Comparator.comparing(Employee::getName).thenComparingInt(Employee::getAge); + + Arrays.sort(someMoreEmployees, employee_Name_Age_Comparator); + // System.out.println(Arrays.toString(someMoreEmployees)); + assertTrue(Arrays.equals(someMoreEmployees, sortedEmployeesByNameAge)); + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java new file mode 100644 index 0000000000..b4185e9156 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java @@ -0,0 +1,215 @@ +package com.ossez.java_8_features.groupingby; + +import static java.util.Comparator.comparingInt; +import static java.util.stream.Collectors.averagingInt; +import static java.util.stream.Collectors.counting; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.groupingByConcurrent; +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.mapping; +import static java.util.stream.Collectors.maxBy; +import static java.util.stream.Collectors.summarizingInt; +import static java.util.stream.Collectors.summingInt; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.EnumMap; +import java.util.IntSummaryStatistics; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; + +import org.junit.Test; + +public class Java8GroupingByCollectorUnitTest { + + private static final List posts = Arrays.asList(new BlogPost("News item 1", "Author 1", BlogPostType.NEWS, 15), new BlogPost("Tech review 1", "Author 2", BlogPostType.REVIEW, 5), + new BlogPost("Programming guide", "Author 1", BlogPostType.GUIDE, 20), new BlogPost("News item 2", "Author 2", BlogPostType.NEWS, 35), new BlogPost("Tech review 2", "Author 1", BlogPostType.REVIEW, 15)); + + @Test + public void givenAListOfPosts_whenGroupedByType_thenGetAMapBetweenTypeAndPosts() { + Map> postsPerType = posts.stream() + .collect(groupingBy(BlogPost::getType)); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW) + .size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndTheirTitlesAreJoinedInAString_thenGetAMapBetweenTypeAndCsvTitles() { + Map postsPerType = posts.stream() + .collect(groupingBy(BlogPost::getType, mapping(BlogPost::getTitle, joining(", ", "Post titles: [", "]")))); + + assertEquals("Post titles: [News item 1, News item 2]", postsPerType.get(BlogPostType.NEWS)); + assertEquals("Post titles: [Programming guide]", postsPerType.get(BlogPostType.GUIDE)); + assertEquals("Post titles: [Tech review 1, Tech review 2]", postsPerType.get(BlogPostType.REVIEW)); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndSumTheLikes_thenGetAMapBetweenTypeAndPostLikes() { + Map likesPerType = posts.stream() + .collect(groupingBy(BlogPost::getType, summingInt(BlogPost::getLikes))); + + assertEquals(50, likesPerType.get(BlogPostType.NEWS) + .intValue()); + assertEquals(20, likesPerType.get(BlogPostType.REVIEW) + .intValue()); + assertEquals(20, likesPerType.get(BlogPostType.GUIDE) + .intValue()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeInAnEnumMap_thenGetAnEnumMapBetweenTypeAndPosts() { + EnumMap> postsPerType = posts.stream() + .collect(groupingBy(BlogPost::getType, () -> new EnumMap<>(BlogPostType.class), toList())); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW) + .size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeInSets_thenGetAMapBetweenTypesAndSetsOfPosts() { + Map> postsPerType = posts.stream() + .collect(groupingBy(BlogPost::getType, toSet())); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW) + .size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeConcurrently_thenGetAMapBetweenTypeAndPosts() { + ConcurrentMap> postsPerType = posts.parallelStream() + .collect(groupingByConcurrent(BlogPost::getType)); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW) + .size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndAveragingLikes_thenGetAMapBetweenTypeAndAverageNumberOfLikes() { + Map averageLikesPerType = posts.stream() + .collect(groupingBy(BlogPost::getType, averagingInt(BlogPost::getLikes))); + + assertEquals(25, averageLikesPerType.get(BlogPostType.NEWS) + .intValue()); + assertEquals(20, averageLikesPerType.get(BlogPostType.GUIDE) + .intValue()); + assertEquals(10, averageLikesPerType.get(BlogPostType.REVIEW) + .intValue()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndCounted_thenGetAMapBetweenTypeAndNumberOfPosts() { + Map numberOfPostsPerType = posts.stream() + .collect(groupingBy(BlogPost::getType, counting())); + + assertEquals(2, numberOfPostsPerType.get(BlogPostType.NEWS) + .intValue()); + assertEquals(1, numberOfPostsPerType.get(BlogPostType.GUIDE) + .intValue()); + assertEquals(2, numberOfPostsPerType.get(BlogPostType.REVIEW) + .intValue()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndMaxingLikes_thenGetAMapBetweenTypeAndMaximumNumberOfLikes() { + Map> maxLikesPerPostType = posts.stream() + .collect(groupingBy(BlogPost::getType, maxBy(comparingInt(BlogPost::getLikes)))); + + assertTrue(maxLikesPerPostType.get(BlogPostType.NEWS) + .isPresent()); + assertEquals(35, maxLikesPerPostType.get(BlogPostType.NEWS) + .get() + .getLikes()); + + assertTrue(maxLikesPerPostType.get(BlogPostType.GUIDE) + .isPresent()); + assertEquals(20, maxLikesPerPostType.get(BlogPostType.GUIDE) + .get() + .getLikes()); + + assertTrue(maxLikesPerPostType.get(BlogPostType.REVIEW) + .isPresent()); + assertEquals(15, maxLikesPerPostType.get(BlogPostType.REVIEW) + .get() + .getLikes()); + } + + @Test + public void givenAListOfPosts_whenGroupedByAuthorAndThenByType_thenGetAMapBetweenAuthorAndMapsBetweenTypeAndBlogPosts() { + Map>> map = posts.stream() + .collect(groupingBy(BlogPost::getAuthor, groupingBy(BlogPost::getType))); + + assertEquals(1, map.get("Author 1") + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, map.get("Author 1") + .get(BlogPostType.GUIDE) + .size()); + assertEquals(1, map.get("Author 1") + .get(BlogPostType.REVIEW) + .size()); + + assertEquals(1, map.get("Author 2") + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, map.get("Author 2") + .get(BlogPostType.REVIEW) + .size()); + assertNull(map.get("Author 2") + .get(BlogPostType.GUIDE)); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndSummarizingLikes_thenGetAMapBetweenTypeAndSummary() { + Map likeStatisticsPerType = posts.stream() + .collect(groupingBy(BlogPost::getType, summarizingInt(BlogPost::getLikes))); + + IntSummaryStatistics newsLikeStatistics = likeStatisticsPerType.get(BlogPostType.NEWS); + + assertEquals(2, newsLikeStatistics.getCount()); + assertEquals(50, newsLikeStatistics.getSum()); + assertEquals(25.0, newsLikeStatistics.getAverage(), 0.001); + assertEquals(35, newsLikeStatistics.getMax()); + assertEquals(15, newsLikeStatistics.getMin()); + } + + @Test + public void givenAListOfPosts_whenGroupedByComplexMapKeyType_thenGetAMapBetweenTupleAndList() { + Map> postsPerTypeAndAuthor = posts.stream() + .collect(groupingBy(post -> new Tuple(post.getType(), post.getAuthor()))); + + List result = postsPerTypeAndAuthor.get(new Tuple(BlogPostType.GUIDE, "Author 1")); + + assertThat(result.size()).isEqualTo(1); + + BlogPost blogPost = result.get(0); + + assertThat(blogPost.getTitle()).isEqualTo("Programming guide"); + assertThat(blogPost.getType()).isEqualTo(BlogPostType.GUIDE); + assertThat(blogPost.getAuthor()).isEqualTo("Author 1"); + } +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java new file mode 100644 index 0000000000..12f9fcca48 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java @@ -0,0 +1,41 @@ +package com.ossez.nullsafecollectionstreams; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.stream.Stream; +import org.junit.Test; +import static org.junit.Assert.*; + + +public class NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest { + + private final NullSafeCollectionStreamsUsingCommonsEmptyIfNull instance = + new NullSafeCollectionStreamsUsingCommonsEmptyIfNull(); + + @Test + public void whenCollectionIsNull_thenExpectAnEmptyStream() { + Collection collection = null; + Stream expResult = Stream.empty(); + Stream result = instance.collectionAsStream(collection); + assertStreamEquals(expResult, result); + + } + + @Test + public void whenCollectionHasElements_thenExpectAStreamOfExactlyTheSameElements() { + + Collection collection = Arrays.asList("a", "b", "c"); + Stream expResult = Arrays.stream(new String[] { "a", "b", "c" }); + Stream result = instance.collectionAsStream(collection); + assertStreamEquals(expResult, result); + } + + private static void assertStreamEquals(Stream s1, Stream s2) { + Iterator iter1 = s1.iterator(), iter2 = s2.iterator(); + while (iter1.hasNext() && iter2.hasNext()) + assertEquals(iter1.next(), iter2.next()); + assert !iter1.hasNext() && !iter2.hasNext(); + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java new file mode 100644 index 0000000000..8497e63f80 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java @@ -0,0 +1,50 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ossez.nullsafecollectionstreams; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.stream.Stream; + +import org.junit.Test; + +/** + * + * @author Kwaje Anthony + */ +public class NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest { + + private final NullSafeCollectionStreamsUsingJava8OptionalContainer instance = new NullSafeCollectionStreamsUsingJava8OptionalContainer(); + + @Test + public void whenCollectionIsNull_thenExpectAnEmptyStream() { + Collection collection = null; + Stream expResult = Stream.empty(); + Stream result = instance.collectionAsStream(collection); + assertStreamEquals(expResult, result); + + } + + @Test + public void whenCollectionHasElements_thenExpectAStreamOfExactlyTheSameElements() { + + Collection collection = Arrays.asList("a", "b", "c"); + Stream expResult = Arrays.stream(new String[] { "a", "b", "c" }); + Stream result = instance.collectionAsStream(collection); + assertStreamEquals(expResult, result); + } + + private static void assertStreamEquals(Stream s1, Stream s2) { + Iterator iter1 = s1.iterator(), iter2 = s2.iterator(); + while (iter1.hasNext() && iter2.hasNext()) + assertEquals(iter1.next(), iter2.next()); + assert !iter1.hasNext() && !iter2.hasNext(); + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java new file mode 100644 index 0000000000..4cd3fc6539 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java @@ -0,0 +1,45 @@ + +package com.ossez.nullsafecollectionstreams; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.stream.Stream; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author Kwaje Anthony + */ +public class NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest { + + private final NullSafeCollectionStreamsUsingNullDereferenceCheck instance = + new NullSafeCollectionStreamsUsingNullDereferenceCheck(); + + @Test + public void whenCollectionIsNull_thenExpectAnEmptyStream() { + Collection collection = null; + Stream expResult = Stream.empty(); + Stream result = instance.collectionAsStream(collection); + assertStreamEquals(expResult, result); + + } + + @Test + public void whenCollectionHasElements_thenExpectAStreamOfExactlyTheSameElements() { + + Collection collection = Arrays.asList("a", "b", "c"); + Stream expResult = Arrays.stream(new String[] { "a", "b", "c" }); + Stream result = instance.collectionAsStream(collection); + assertStreamEquals(expResult, result); + } + + private static void assertStreamEquals(Stream s1, Stream s2) { + Iterator iter1 = s1.iterator(), iter2 = s2.iterator(); + while (iter1.hasNext() && iter2.hasNext()) + assertEquals(iter1.next(), iter2.next()); + assert !iter1.hasNext() && !iter2.hasNext(); + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/spliteratorAPI/ExecutorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/spliteratorAPI/ExecutorUnitTest.java new file mode 100644 index 0000000000..380aa1f729 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/spliteratorAPI/ExecutorUnitTest.java @@ -0,0 +1,44 @@ +package com.ossez.spliteratorAPI; + +import java.util.Arrays; +import java.util.Spliterator; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import static org.assertj.core.api.Assertions.*; +import org.junit.Before; +import org.junit.Test; + +public class ExecutorUnitTest { + Article article; + Stream stream; + Spliterator spliterator; + Spliterator
split1; + Spliterator
split2; + + @Before + public void init() { + article = new Article(Arrays.asList(new Author("Ahmad", 0), new Author("Eugen", 0), new Author("Alice", 1), + new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), + new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), + new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), + new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), + new Author("Mike", 0), new Author("Michał", 0), new Author("Loredana", 1)), 0); + stream = article.getListOfAuthors().stream(); + split1 = Executor.generateElements().spliterator(); + split2 = split1.trySplit(); + spliterator = new RelatedAuthorSpliterator(article.getListOfAuthors()); + } + + @Test + public void givenAstreamOfAuthors_whenProcessedInParallelWithCustomSpliterator_coubtProducessRightOutput() { + Stream stream2 = StreamSupport.stream(spliterator, true); + assertThat(Executor.countAutors(stream2.parallel())).isEqualTo(9); + } + + @Test + public void givenSpliterator_whenAppliedToAListOfArticle_thenSplittedInHalf() { + assertThat(new Task(split1).call()).containsSequence(Executor.generateElements().size() / 2 + ""); + assertThat(new Task(split2).call()).containsSequence(Executor.generateElements().size() / 2 + ""); + } +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/strategy/StrategyDesignPatternUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/strategy/StrategyDesignPatternUnitTest.java new file mode 100644 index 0000000000..d10e283568 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/strategy/StrategyDesignPatternUnitTest.java @@ -0,0 +1,72 @@ +package com.ossez.strategy; + +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StrategyDesignPatternUnitTest { + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounter() { + Discounter staffDiscounter = new EasterDiscounter(); + + final BigDecimal discountedValue = staffDiscounter + .apply(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithAnonyousTypes() { + Discounter staffDiscounter = new Discounter() { + @Override + public BigDecimal apply(BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.5)); + } + }; + + final BigDecimal discountedValue = staffDiscounter + .apply(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithLamda() { + Discounter staffDiscounter = amount -> amount.multiply(BigDecimal.valueOf(0.5)); + + final BigDecimal discountedValue = staffDiscounter + .apply(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldApplyAllDiscounts() { + List discounters = Arrays.asList(Discounter.christmas(), Discounter.newYear(), Discounter.easter()); + + BigDecimal amount = BigDecimal.valueOf(100); + + final Discounter combinedDiscounter = discounters + .stream() + .reduce(v -> v, Discounter::combine); + + combinedDiscounter.apply(amount); + } + + @Test + public void shouldChainDiscounters() { + final Function combinedDiscounters = Discounter + .christmas() + .andThen(Discounter.newYear()); + + combinedDiscounters.apply(BigDecimal.valueOf(100)); + } +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/streamreduce/tests/StreamReduceManualTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/streamreduce/tests/StreamReduceManualTest.java new file mode 100644 index 0000000000..28b184338d --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/streamreduce/tests/StreamReduceManualTest.java @@ -0,0 +1,153 @@ +package com.ossez.streamreduce.tests; + +import com.ossez.streamreduce.entities.Rating; +import com.ossez.streamreduce.entities.Review; +import com.ossez.streamreduce.entities.User; +import com.ossez.streamreduce.utilities.NumberUtils; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class StreamReduceManualTest { + + @Test + public void givenIntegerList_whenReduceWithSumAccumulatorLambda_thenCorrect() { + List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); + + int result = numbers.stream().reduce(0, (a, b) -> a + b); + + assertThat(result).isEqualTo(21); + } + + @Test + public void givenIntegerList_whenReduceWithSumAccumulatorMethodReference_thenCorrect() { + List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); + + int result = numbers.stream().reduce(0, Integer::sum); + + assertThat(result).isEqualTo(21); + } + + @Test + public void givenStringList_whenReduceWithConcatenatorAccumulatorLambda_thenCorrect() { + List letters = Arrays.asList("a", "b", "c", "d", "e"); + + String result = letters.stream().reduce("", (a, b) -> a + b); + + assertThat(result).isEqualTo("abcde"); + } + + @Test + public void givenStringList_whenReduceWithConcatenatorAccumulatorMethodReference_thenCorrect() { + List letters = Arrays.asList("a", "b", "c", "d", "e"); + + String result = letters.stream().reduce("", String::concat); + + assertThat(result).isEqualTo("abcde"); + } + + @Test + public void givenStringList_whenReduceWithUppercaseConcatenatorAccumulator_thenCorrect() { + List letters = Arrays.asList("a", "b", "c", "d", "e"); + + String result = letters.stream().reduce("", (a, b) -> a.toUpperCase() + b.toUpperCase()); + + assertThat(result).isEqualTo("ABCDE"); + } + + @Test + public void givenUserList_whenReduceWithAgeAccumulatorAndSumCombiner_thenCorrect() { + List users = Arrays.asList(new User("John", 30), new User("Julie", 35)); + + int result = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); + + assertThat(result).isEqualTo(65); + } + + @Test + public void givenUserList_whenReduceWithGreaterAgeAccumulator_thenFindsOldest() { + List users = Arrays.asList(new User("John", 30), new User("Alex", 40), new User("Julie", 35)); + + User oldest = users.stream().reduce(users.get(0), (user1, user2) -> user1.getAge() >= user2.getAge() ? user1 : user2); + + assertThat(oldest).isEqualTo(users.get(1)); + } + + @Test + public void givenUserListWithRatings_whenReduceWithGreaterAgeAccumulator_thenFindsOldest() { + User john = new User("John", 30); + john.getRating().add(new Review(5, "")); + john.getRating().add(new Review(3, "not bad")); + User julie = new User("Julie", 35); + john.getRating().add(new Review(4, "great!")); + john.getRating().add(new Review(2, "terrible experience")); + john.getRating().add(new Review(4, "")); + List users = Arrays.asList(john, julie); + + Rating averageRating = users.stream().reduce(new Rating(), (rating, user) -> Rating.average(rating, user.getRating()), Rating::average); + + assertThat(averageRating.getPoints()).isEqualTo(3.6); + } + + @Test + public void givenStringList_whenReduceWithParallelStream_thenCorrect() { + List letters = Arrays.asList("a", "b", "c", "d", "e"); + + String result = letters.parallelStream().reduce("", String::concat); + + assertThat(result).isEqualTo("abcde"); + } + + @Test + public void givenNumberUtilsClass_whenCalledDivideListElements_thenCorrect() { + List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); + + assertThat(NumberUtils.divideListElements(numbers, 1)).isEqualTo(21); + } + + @Test + public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlock_thenCorrect() { + List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); + + assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 1)).isEqualTo(21); + } + + @Test + public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlockAndListContainsZero_thenCorrect() { + List numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6); + + assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 1)).isEqualTo(21); + } + + @Test + public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlockAndDividerIsZero_thenCorrect() { + List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); + + assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 0)).isEqualTo(0); + } + + @Test + public void givenStream_whneCalleddivideListElementsWithApplyFunctionMethod_thenCorrect() { + List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); + + assertThat(NumberUtils.divideListElementsWithApplyFunctionMethod(numbers, 1)).isEqualTo(21); + } + + @Test + public void givenTwoStreams_whenCalledReduceOnParallelizedStream_thenFasterExecutionTime() { + List userList = new ArrayList<>(); + for (int i = 0; i <= 1000000; i++) { + userList.add(new User("John" + i, i)); + } + long currentTime1 = System.currentTimeMillis(); + userList.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); + long sequentialExecutionTime = System.currentTimeMillis() -currentTime1; + long currentTime2 = System.currentTimeMillis(); + userList.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); + long parallelizedExecutionTime = System.currentTimeMillis() - currentTime2; + + assertThat(parallelizedExecutionTime).isLessThan(sequentialExecutionTime); + } +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/typeinference/TypeInferenceUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/typeinference/TypeInferenceUnitTest.java new file mode 100644 index 0000000000..829a7c98a0 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/typeinference/TypeInferenceUnitTest.java @@ -0,0 +1,87 @@ +package com.ossez.typeinference; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; + +public class TypeInferenceUnitTest { + + @Test + public void givenNoTypeInference_whenInvokingGenericMethodsWithTypeParameters_ObjectsAreCreated() { + // Without type inference. code is verbose. + Map> mapOfMaps = new HashMap>(); + List strList = Collections. emptyList(); + List intList = Collections. emptyList(); + + assertTrue(mapOfMaps.isEmpty()); + assertTrue(strList.isEmpty()); + assertTrue(intList.isEmpty()); + } + + @Test + public void givenTypeInference_whenInvokingGenericMethodsWithoutTypeParameters_ObjectsAreCreated() { + // With type inference. code is concise. + List strListInferred = Collections.emptyList(); + List intListInferred = Collections.emptyList(); + + assertTrue(strListInferred.isEmpty()); + assertTrue(intListInferred.isEmpty()); + } + + @Test + public void givenJava7_whenInvokingCostructorWithoutTypeParameters_ObjectsAreCreated() { + // Type Inference for constructor using diamond operator. + Map> mapOfMapsInferred = new HashMap<>(); + + assertTrue(mapOfMapsInferred.isEmpty()); + assertEquals("public class java.util.HashMap", mapOfMapsInferred.getClass() + .toGenericString()); + } + + static List add(List list, T a, T b) { + list.add(a); + list.add(b); + return list; + } + + @Test + public void givenGenericMethod_WhenInvokedWithoutExplicitTypes_TypesAreInferred() { + // Generalized target-type inference + List strListGeneralized = add(new ArrayList<>(), "abc", "def"); + List intListGeneralized = add(new ArrayList<>(), 1, 2); + List numListGeneralized = add(new ArrayList<>(), 1, 2.0); + + assertEquals("public class java.util.ArrayList", strListGeneralized.getClass() + .toGenericString()); + assertFalse(intListGeneralized.isEmpty()); + assertEquals(2, numListGeneralized.size()); + } + + @Test + public void givenLambdaExpressions_whenParameterTypesNotSpecified_ParameterTypesAreInferred() { + // Type Inference and Lambda Expressions. + List intList = Arrays.asList(5, 3, 4, 2, 1); + Collections.sort(intList, (a, b) -> { + assertEquals("java.lang.Integer", a.getClass().getName()); + return a.compareTo(b); + }); + assertEquals("[1, 2, 3, 4, 5]", Arrays.toString(intList.toArray())); + + List strList = Arrays.asList("Red", "Blue", "Green"); + Collections.sort(strList, (a, b) -> { + assertEquals("java.lang.String", a.getClass().getName()); + return a.compareTo(b); + }); + assertEquals("[Blue, Green, Red]", Arrays.toString(strList.toArray())); + } + +} diff --git a/core-java-modules/core-java-8/src/test/java/com/ossez/util/CurrentDateTimeUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/ossez/util/CurrentDateTimeUnitTest.java new file mode 100644 index 0000000000..ce4e29aeb7 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/ossez/util/CurrentDateTimeUnitTest.java @@ -0,0 +1,42 @@ +package com.ossez.util; + +import static org.junit.Assert.assertEquals; + +import java.time.Clock; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.temporal.ChronoField; + +import org.junit.Test; + +public class CurrentDateTimeUnitTest { + + private static final Clock clock = Clock.fixed(Instant.parse("2016-10-09T15:10:30.00Z"), ZoneId.of("UTC")); + + @Test + public void shouldReturnCurrentDate() { + final LocalDate now = LocalDate.now(clock); + + assertEquals(9, now.get(ChronoField.DAY_OF_MONTH)); + assertEquals(10, now.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(2016, now.get(ChronoField.YEAR)); + } + + @Test + public void shouldReturnCurrentTime() { + final LocalTime now = LocalTime.now(clock); + + assertEquals(15, now.get(ChronoField.HOUR_OF_DAY)); + assertEquals(10, now.get(ChronoField.MINUTE_OF_HOUR)); + assertEquals(30, now.get(ChronoField.SECOND_OF_MINUTE)); + } + + @Test + public void shouldReturnCurrentTimestamp() { + final Instant now = Instant.now(clock); + + assertEquals(clock.instant().getEpochSecond(), now.getEpochSecond()); + } +} diff --git a/core-java-modules/core-java-8/src/test/resources/.gitignore b/core-java-modules/core-java-8/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file From f3702780af9dc9d6cb35f00630d6d61f7b7b2035 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 23 Sep 2021 15:04:07 -0400 Subject: [PATCH 13/30] Init commit all code --- jackson-modules/jackson-annotations/README.md | 9 + jackson-modules/jackson-annotations/pom.xml | 50 +++++ .../bidirection/CustomListDeserializer.java | 29 +++ .../bidirection/CustomListSerializer.java | 32 +++ .../com/ossez/jackson/bidirection/Item.java | 17 ++ .../jackson/bidirection/ItemWithIdentity.java | 21 ++ .../jackson/bidirection/ItemWithIgnore.java | 17 ++ .../jackson/bidirection/ItemWithRef.java | 21 ++ .../bidirection/ItemWithSerializer.java | 17 ++ .../jackson/bidirection/ItemWithView.java | 26 +++ .../com/ossez/jackson/bidirection/User.java | 24 ++ .../jackson/bidirection/UserWithIdentity.java | 28 +++ .../jackson/bidirection/UserWithIgnore.java | 28 +++ .../jackson/bidirection/UserWithRef.java | 28 +++ .../bidirection/UserWithSerializer.java | 30 +++ .../jackson/bidirection/UserWithView.java | 33 +++ .../jackson/bidirection/jsonview/Views.java | 9 + .../java/com/ossez/jackson/domain/Person.java | 30 +++ .../java/com/ossez/jackson/format/User.java | 37 +++ .../java/com/ossez/jackson/jsonview/Item.java | 36 +++ .../jsonview/MyBeanSerializerModifier.java | 22 ++ .../jackson/jsonview/UpperCasingWriter.java | 21 ++ .../java/com/ossez/jackson/jsonview/User.java | 27 +++ .../com/ossez/jackson/jsonview/Views.java | 9 + .../AdvancedAnnotationsUnitTest.java | 133 +++++++++++ .../advancedannotations/AppendBeans.java | 58 +++++ .../IdentityReferenceBeans.java | 62 +++++ .../advancedannotations/NamingBean.java | 31 +++ .../advancedannotations/POJOBuilderBean.java | 51 +++++ .../PropertyDescriptionBean.java | 25 +++ .../advancedannotations/TypeIdBean.java | 30 +++ .../TypeIdResolverStructure.java | 130 +++++++++++ .../JacksonBidirectionRelationUnitTest.java | 152 +++++++++++++ .../jackson/format/JsonFormatUnitTest.java | 37 +++ .../jsonview/JacksonJsonViewUnitTest.java | 88 ++++++++ .../jackson-conversions-2/README.md | 13 ++ jackson-modules/jackson-conversions-2/pom.xml | 57 +++++ .../ossez/jackson/csv/JsonCsvConverter.java | 57 +++++ .../java/com/ossez/jackson/csv/OrderLine.java | 49 ++++ .../ossez/jackson/csv/OrderLineForCsv.java | 25 +++ .../ossez/jackson/dynamicobject/Product.java | 39 ++++ .../dynamicobject/ProductJsonNode.java | 35 +++ .../jackson/dynamicobject/ProductMap.java | 35 +++ .../ossez/jackson/multiplefields/Weather.java | 44 ++++ .../com/ossez/jackson/tocollection/Book.java | 70 ++++++ .../tocollection/JsonToCollectionUtil.java | 24 ++ .../com/ossez/jackson/xmlToJson/Color.java | 5 + .../com/ossez/jackson/xmlToJson/Flower.java | 42 ++++ .../java/com/ossez/jackson/yaml/Order.java | 68 ++++++ .../com/ossez/jackson/yaml/OrderLine.java | 49 ++++ .../src/main/resources/csv/orderLines.csv | 3 + .../src/main/resources/csv/orderLines.json | 9 + .../resources/to-java-collection/books.xml | 17 ++ .../com/ossez/jackson/csv/CsvUnitTest.java | 65 ++++++ .../DynamicObjectDeserializationUnitTest.java | 69 ++++++ ...apMultipleFieldsToSingleFieldUnitTest.java | 37 +++ .../streaming/StreamingAPIUnitTest.java | 118 ++++++++++ .../DeserializeToJavaCollectionUnitTest.java | 130 +++++++++++ .../JsonToCollectionUtilUnitTest.java | 51 +++++ .../jackson/xmlToJson/XmlToJsonUnitTest.java | 43 ++++ .../com/ossez/jackson/yaml/YamlUnitTest.java | 69 ++++++ .../resources/csv/expectedCsvFromJson.csv | 3 + .../csv/expectedFormattedCsvFromJson.csv | 3 + .../resources/csv/expectedJsonFromCsv.json | 9 + .../deserialize-dynamic-object/embedded.json | 8 + .../deserialize-dynamic-object/flat.json | 6 + .../src/test/resources/yaml/orderInput.yaml | 11 + jackson-modules/jackson-conversions/README.md | 16 ++ jackson-modules/jackson-conversions/pom.xml | 39 ++++ .../jackson/date/CustomDateDeserializer.java | 36 +++ .../jackson/date/CustomDateSerializer.java | 29 +++ .../date/CustomDateTimeSerializer.java | 32 +++ .../date/CustomLocalDateTimeSerializer.java | 29 +++ .../java/com/ossez/jackson/date/Event.java | 25 +++ .../ossez/jackson/date/EventWithFormat.java | 29 +++ .../ossez/jackson/date/EventWithJodaTime.java | 29 +++ .../jackson/date/EventWithLocalDate.java | 33 +++ .../jackson/date/EventWithLocalDateTime.java | 29 +++ .../jackson/date/EventWithSerializer.java | 31 +++ .../jackson/enums/deserialization/City.java | 15 ++ .../enums/deserialization/Distance.java | 31 +++ .../customdeserializer/City.java | 15 ++ .../CustomEnumDeserializer.java | 42 ++++ .../customdeserializer/Distance.java | 33 +++ .../deserialization/jsoncreator/City.java | 15 ++ .../deserialization/jsoncreator/Distance.java | 48 ++++ .../deserialization/jsonproperty/City.java | 15 ++ .../jsonproperty/Distance.java | 51 +++++ .../enums/deserialization/jsonvalue/City.java | 15 ++ .../deserialization/jsonvalue/Distance.java | 35 +++ .../jackson/enums/serialization/Distance.java | 53 +++++ .../serialization/DistanceSerializer.java | 32 +++ .../enums/withEnum/DistanceEnumSimple.java | 26 +++ .../withEnum/DistanceEnumWithJsonFormat.java | 29 +++ .../enums/withEnum/DistanceEnumWithValue.java | 29 +++ .../enums/withEnum/MyDtoWithEnumCustom.java | 59 +++++ .../withEnum/MyDtoWithEnumJsonFormat.java | 57 +++++ .../java/com/ossez/jackson/field/MyDto.java | 47 ++++ .../ossez/jackson/field/MyDtoAccessLevel.java | 23 ++ .../ossez/jackson/field/MyDtoWithGetter.java | 25 +++ .../ossez/jackson/field/MyDtoWithSetter.java | 29 +++ .../com/ossez/jackson/immutable/Employee.java | 24 ++ .../com/ossez/jackson/immutable/Person.java | 44 ++++ .../com/ossez/jackson/map/ClassWithAMap.java | 23 ++ .../java/com/ossez/jackson/map/MyPair.java | 80 +++++++ .../ossez/jackson/map/MyPairDeserializer.java | 16 ++ .../ossez/jackson/map/MyPairSerializer.java | 22 ++ .../java/com/ossez/jackson/mapnull/MyDto.java | 54 +++++ .../mapnull/MyDtoNullKeySerializer.java | 27 +++ .../com/ossez/jackson/tocollection/MyDto.java | 54 +++++ .../java/com/ossez/jackson/xml/Address.java | 33 +++ .../java/com/ossez/jackson/xml/Person.java | 47 ++++ .../jackson/date/JacksonDateUnitTest.java | 212 ++++++++++++++++++ .../DefaultEnumDeserializationUnitTest.java | 20 ++ .../EnumCustomDeserializationUnitTest.java | 19 ++ ...serializationUsingJsonCreatorUnitTest.java | 20 ++ ...erializationUsingJsonPropertyUnitTest.java | 21 ++ ...DeserializationUsingJsonValueUnitTest.java | 20 ++ .../JacksonEnumSerializationUnitTest.java | 20 ++ .../JacksonSerializationEnumsUnitTest.java | 77 +++++++ .../jackson/field/JacksonFieldUnitTest.java | 92 ++++++++ ...mmutableObjectDeserializationUnitTest.java | 38 ++++ .../map/JacksonMapDeserializeUnitTest.java | 62 +++++ .../map/JacksonMapSerializeUnitTest.java | 65 ++++++ .../mapnull/JacksonMapNullUnitTest.java | 99 ++++++++ ...serializeWithNestedPropertiesUnitTest.java | 70 ++++++ .../com/ossez/jackson/nested/Product.java | 55 +++++ .../jackson/nested/ProductDeserializer.java | 40 ++++ ...ksonCollectionDeserializationUnitTest.java | 75 +++++++ .../tojsonnode/StringToJsonNodeUnitTest.java | 51 +++++ .../xml/XMLSerializeDeserializeUnitTest.java | 182 +++++++++++++++ .../src/test/resources/simple_bean.xml | 4 + .../jackson-custom-conversions/README.md | 9 + .../jackson-custom-conversions/pom.xml | 44 ++++ .../File.java | 25 +++ .../Folder.java | 82 +++++++ .../FolderBeanSerializerModifier.java | 20 ++ .../FolderSerializer.java | 34 +++ ...derSerializerWithCallingOwnSerializer.java | 29 +++ ...SerializerWithDefaultSerializerStored.java | 34 +++ ...derSerializerWithInternalObjectMapper.java | 33 +++ ...olderSerializerWithSerializerProvider.java | 28 +++ .../deserialization/ActorJackson.java | 61 +++++ .../com/baeldung/deserialization/Item.java | 32 +++ .../deserialization/ItemDeserializer.java | 39 ++++ .../ItemDeserializerOnClass.java | 39 ++++ .../deserialization/ItemWithDeserializer.java | 31 +++ .../com/baeldung/deserialization/Movie.java | 50 +++++ .../com/baeldung/deserialization/User.java | 26 +++ .../java/com/baeldung/serialization/Item.java | 32 +++ .../serialization/ItemSerializer.java | 31 +++ .../serialization/ItemSerializerOnClass.java | 31 +++ .../serialization/ItemWithSerializer.java | 32 +++ .../java/com/baeldung/serialization/User.java | 26 +++ .../java/com/baeldung/skipfields/Address.java | 40 ++++ .../java/com/baeldung/skipfields/Hidable.java | 8 + .../skipfields/HidableSerializer.java | 29 +++ .../baeldung/skipfields/MyDtoWithFilter.java | 50 +++++ .../java/com/baeldung/skipfields/Person.java | 40 ++++ .../CallingDefaultSerializerUnitTest.java | 164 ++++++++++++++ .../CustomDeserializationUnitTest.java | 81 +++++++ .../CustomSerializationUnitTest.java | 49 ++++ .../IgnoreFieldsWithFilterUnitTest.java | 87 +++++++ .../JacksonDynamicIgnoreUnitTest.java | 88 ++++++++ jackson-modules/jackson-exceptions/README.md | 7 + jackson-modules/jackson-exceptions/pom.xml | 26 +++ .../java/com/baeldung/exceptions/User.java | 26 +++ .../baeldung/exceptions/UserWithConflict.java | 25 +++ .../UserWithNoDefaultConstructor.java | 21 ++ .../exceptions/UserWithPrivateFields.java | 16 ++ .../com/baeldung/exceptions/UserWithRoot.java | 18 ++ .../java/com/baeldung/exceptions/Zoo.java | 22 ++ .../baeldung/exceptions/ZooConfigured.java | 25 +++ .../mappingexception/MyDtoNoAccessors.java | 21 ++ .../MyDtoNoAccessorsAndFieldVisibility.java | 25 +++ .../exceptions/JacksonExceptionsUnitTest.java | 195 ++++++++++++++++ .../JacksonMappingExceptionUnitTest.java | 51 +++++ jackson-modules/jackson/README.md | 14 ++ jackson-modules/jackson/pom.xml | 73 ++++++ .../deserialization/jacksoninject/Person.java | 43 ++++ .../jsonanysetter/Inventory.java | 20 ++ .../deserialization/jsondeserialize/Book.java | 75 +++++++ .../CustomDateDeserializer.java | 33 +++ .../java/com/ossez/jackson/domain/Person.java | 30 +++ .../com/ossez/jackson/inheritance/Event.java | 25 +++ .../IgnoranceAnnotationStructure.java | 96 ++++++++ .../IgnoranceMixinOrIntrospection.java | 91 ++++++++ .../inheritance/ItemIdAddedToUser.java | 28 +++ .../inheritance/ItemIdRemovedFromUser.java | 26 +++ .../SubTypeConstructorStructure.java | 92 ++++++++ .../SubTypeConversionStructure.java | 87 +++++++ .../TypeInfoAnnotatedStructure.java | 102 +++++++++ .../inheritance/TypeInfoStructure.java | 96 ++++++++ .../jackson/jacksonvsgson/ActorJackson.java | 61 +++++ .../jacksonvsgson/ActorJacksonSerializer.java | 32 +++ .../ossez/jackson/jacksonvsgson/Movie.java | 50 +++++ .../jacksonvsgson/MovieWithNullValue.java | 46 ++++ .../ossez/jackson/node/JsonNodeIterator.java | 62 +++++ .../jackson/optionalwithjackson/Book.java | 25 +++ .../jackson/src/main/resources/example1.json | 12 + .../jackson/src/main/resources/example2.json | 10 + .../jackson/src/main/resources/logback.xml | 19 ++ .../java/com/ossez/jackson/dtos/Address.java | 33 +++ .../java/com/ossez/jackson/dtos/MyDto.java | 54 +++++ .../java/com/ossez/jackson/dtos/Person.java | 47 ++++ .../java/com/ossez/jackson/dtos/User.java | 26 +++ .../inheritance/IgnoranceUnitTest.java | 92 ++++++++ .../ItemIdRemovedFromUserUnitTest.java | 41 ++++ .../inheritance/SubTypeHandlingUnitTest.java | 43 ++++ .../TypeInfoInclusionUnitTest.java | 61 +++++ .../JacksonDeserializeUnitTest.java | 38 ++++ .../JacksonSerializeUnitTest.java | 58 +++++ .../jsoncompare/JsonCompareUnitTest.java | 126 +++++++++++ .../ossez/jackson/node/ExampleStructure.java | 18 ++ .../node/JsonNodeIteratorUnitTest.java | 37 +++ .../java/com/ossez/jackson/node/NodeBean.java | 30 +++ .../jackson/node/NodeOperationUnitTest.java | 119 ++++++++++ .../OptionalTypeUnitTest.java | 61 +++++ .../sandbox/JacksonPrettyPrintUnitTest.java | 50 +++++ .../jackson/sandbox/SandboxUnitTest.java | 29 +++ .../ossez/jackson/sandbox/TestElement.java | 25 +++ .../com/ossez/jackson/test/UnitTestSuite.java | 14 ++ .../java/com/ossez/jackson/try1/IEntity.java | 5 + .../ossez/jackson/try1/RestLoaderRequest.java | 38 ++++ .../try1/RestLoaderRequestDeserializer.java | 48 ++++ .../author-jsonpropertyorder-schema.json | 29 +++ .../src/test/resources/node_example-1.json | 65 ++++++ .../src/test/resources/node_example.json | 18 ++ jackson-modules/pom.xml | 56 +++++ 229 files changed, 9799 insertions(+) create mode 100644 jackson-modules/jackson-annotations/README.md create mode 100644 jackson-modules/jackson-annotations/pom.xml create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListDeserializer.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListSerializer.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/Item.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIdentity.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIgnore.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithRef.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithSerializer.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithView.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/User.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIdentity.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIgnore.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithRef.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithSerializer.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithView.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/jsonview/Views.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/domain/Person.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/format/User.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Item.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/MyBeanSerializerModifier.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/UpperCasingWriter.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/User.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Views.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AdvancedAnnotationsUnitTest.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AppendBeans.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/IdentityReferenceBeans.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/NamingBean.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/POJOBuilderBean.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/PropertyDescriptionBean.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdBean.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdResolverStructure.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/bidirection/JacksonBidirectionRelationUnitTest.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/format/JsonFormatUnitTest.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/jsonview/JacksonJsonViewUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/README.md create mode 100644 jackson-modules/jackson-conversions-2/pom.xml create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/JsonCsvConverter.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLine.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLineForCsv.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/Product.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductJsonNode.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductMap.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/multiplefields/Weather.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/Book.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/JsonToCollectionUtil.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Color.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Flower.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/Order.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/OrderLine.java create mode 100644 jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.csv create mode 100644 jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.json create mode 100644 jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.xml create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/csv/CsvUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/dynamicobject/DynamicObjectDeserializationUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/multiplefields/MapMultipleFieldsToSingleFieldUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/streaming/StreamingAPIUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/DeserializeToJavaCollectionUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/JsonToCollectionUtilUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/xmlToJson/XmlToJsonUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/yaml/YamlUnitTest.java create mode 100644 jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedCsvFromJson.csv create mode 100644 jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedFormattedCsvFromJson.csv create mode 100644 jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedJsonFromCsv.json create mode 100644 jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/embedded.json create mode 100644 jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/flat.json create mode 100644 jackson-modules/jackson-conversions-2/src/test/resources/yaml/orderInput.yaml create mode 100644 jackson-modules/jackson-conversions/README.md create mode 100644 jackson-modules/jackson-conversions/pom.xml create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateDeserializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateSerializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateTimeSerializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomLocalDateTimeSerializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/Event.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithFormat.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithJodaTime.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDate.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDateTime.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithSerializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/City.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/Distance.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/City.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/CustomEnumDeserializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/Distance.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/City.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/Distance.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/City.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/Distance.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/City.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/Distance.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/Distance.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/DistanceSerializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumSimple.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithJsonFormat.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithValue.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumCustom.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumJsonFormat.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDto.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoAccessLevel.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithGetter.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithSetter.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Employee.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Person.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/ClassWithAMap.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPair.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairDeserializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairSerializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDto.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDtoNullKeySerializer.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/tocollection/MyDto.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Address.java create mode 100644 jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Person.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/date/JacksonDateUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/customdeserializer/EnumCustomDeserializationUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonEnumSerializationUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonSerializationEnumsUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/field/JacksonFieldUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/immutable/ImmutableObjectDeserializationUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapDeserializeUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapSerializeUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/mapnull/JacksonMapNullUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/DeserializeWithNestedPropertiesUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/Product.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/ProductDeserializer.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tocollection/JacksonCollectionDeserializationUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tojsonnode/StringToJsonNodeUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/xml/XMLSerializeDeserializeUnitTest.java create mode 100644 jackson-modules/jackson-conversions/src/test/resources/simple_bean.xml create mode 100644 jackson-modules/jackson-custom-conversions/README.md create mode 100644 jackson-modules/jackson-custom-conversions/pom.xml create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/File.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/Folder.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderBeanSerializerModifier.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializer.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithCallingOwnSerializer.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithDefaultSerializerStored.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithInternalObjectMapper.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithSerializerProvider.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ActorJackson.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Item.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializer.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializerOnClass.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithDeserializer.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Movie.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/User.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/Item.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializer.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializerOnClass.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemWithSerializer.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/User.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Address.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Hidable.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/HidableSerializer.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/MyDtoWithFilter.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Person.java create mode 100644 jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/defaultserializercustomserializer/CallingDefaultSerializerUnitTest.java create mode 100644 jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java create mode 100644 jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/serialization/CustomSerializationUnitTest.java create mode 100644 jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/IgnoreFieldsWithFilterUnitTest.java create mode 100644 jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/JacksonDynamicIgnoreUnitTest.java create mode 100644 jackson-modules/jackson-exceptions/README.md create mode 100644 jackson-modules/jackson-exceptions/pom.xml create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/User.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithConflict.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithNoDefaultConstructor.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithPrivateFields.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithRoot.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Zoo.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/ZooConfigured.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessors.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessorsAndFieldVisibility.java create mode 100644 jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java create mode 100644 jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java create mode 100644 jackson-modules/jackson/README.md create mode 100644 jackson-modules/jackson/pom.xml create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jacksoninject/Person.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsonanysetter/Inventory.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/Book.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/CustomDateDeserializer.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/domain/Person.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/Event.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceAnnotationStructure.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceMixinOrIntrospection.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdAddedToUser.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUser.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConstructorStructure.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConversionStructure.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoAnnotatedStructure.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoStructure.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJackson.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJacksonSerializer.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/Movie.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/MovieWithNullValue.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/node/JsonNodeIterator.java create mode 100644 jackson-modules/jackson/src/main/java/com/ossez/jackson/optionalwithjackson/Book.java create mode 100644 jackson-modules/jackson/src/main/resources/example1.json create mode 100644 jackson-modules/jackson/src/main/resources/example2.json create mode 100644 jackson-modules/jackson/src/main/resources/logback.xml create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Address.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/MyDto.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Person.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/User.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/IgnoranceUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUserUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/SubTypeHandlingUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/TypeInfoInclusionUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonDeserializeUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonSerializeUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/jsoncompare/JsonCompareUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/node/ExampleStructure.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/node/JsonNodeIteratorUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeBean.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeOperationUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/optionalwithjackson/OptionalTypeUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/JacksonPrettyPrintUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/SandboxUnitTest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/TestElement.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/test/UnitTestSuite.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/IEntity.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequest.java create mode 100644 jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequestDeserializer.java create mode 100644 jackson-modules/jackson/src/test/resources/author-jsonpropertyorder-schema.json create mode 100644 jackson-modules/jackson/src/test/resources/node_example-1.json create mode 100644 jackson-modules/jackson/src/test/resources/node_example.json create mode 100644 jackson-modules/pom.xml diff --git a/jackson-modules/jackson-annotations/README.md b/jackson-modules/jackson-annotations/README.md new file mode 100644 index 0000000000..783a06605b --- /dev/null +++ b/jackson-modules/jackson-annotations/README.md @@ -0,0 +1,9 @@ +## Jackson Annotations + +This module contains articles about Jackson annotations. + +### Relevant Articles: +- [Guide to @JsonFormat in Jackson](https://www.baeldung.com/jackson-jsonformat) +- [More Jackson Annotations](https://www.baeldung.com/jackson-advanced-annotations) +- [Jackson – Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion) +- [Jackson JSON Views](https://www.baeldung.com/jackson-json-view-annotation) diff --git a/jackson-modules/jackson-annotations/pom.xml b/jackson-modules/jackson-annotations/pom.xml new file mode 100644 index 0000000000..0da73e5791 --- /dev/null +++ b/jackson-modules/jackson-annotations/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + jackson-annotations + 0.0.1-SNAPSHOT + jackson-annotations + + + com.ossez + jackson-modules + 0.0.2-SNAPSHOT + + + + + com.fasterxml.jackson.module + jackson-module-jsonSchema + ${jackson.version} + + + io.rest-assured + json-path + ${rest-assured.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + jackson-annotations + + + src/main/resources + true + + + + + + 3.1.1 + + + \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListDeserializer.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListDeserializer.java new file mode 100644 index 0000000000..5e46c0abd5 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListDeserializer.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.bidirection; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +public class CustomListDeserializer extends StdDeserializer> { + + private static final long serialVersionUID = 1095767961632979804L; + + public CustomListDeserializer() { + this(null); + } + + public CustomListDeserializer(final Class vc) { + super(vc); + } + + @Override + public List deserialize(final JsonParser jsonparser, final DeserializationContext context) throws IOException, JsonProcessingException { + return new ArrayList(); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListSerializer.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListSerializer.java new file mode 100644 index 0000000000..376aba09e3 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/CustomListSerializer.java @@ -0,0 +1,32 @@ +package com.ossez.jackson.bidirection; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class CustomListSerializer extends StdSerializer> { + + private static final long serialVersionUID = 3698763098000900856L; + + public CustomListSerializer() { + this(null); + } + + public CustomListSerializer(final Class> t) { + super(t); + } + + @Override + public void serialize(final List items, final JsonGenerator generator, final SerializerProvider provider) throws IOException, JsonProcessingException { + final List ids = new ArrayList(); + for (final ItemWithSerializer item : items) { + ids.add(item.id); + } + generator.writeObject(ids); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/Item.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/Item.java new file mode 100644 index 0000000000..a3bc3af89d --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/Item.java @@ -0,0 +1,17 @@ +package com.ossez.jackson.bidirection; + +public class Item { + public int id; + public String itemName; + public User owner; + + public Item() { + super(); + } + + public Item(final int id, final String itemName, final User owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIdentity.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIdentity.java new file mode 100644 index 0000000000..d2ca1392ed --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIdentity.java @@ -0,0 +1,21 @@ +package com.ossez.jackson.bidirection; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") +public class ItemWithIdentity { + public int id; + public String itemName; + public UserWithIdentity owner; + + public ItemWithIdentity() { + super(); + } + + public ItemWithIdentity(final int id, final String itemName, final UserWithIdentity owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIgnore.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIgnore.java new file mode 100644 index 0000000000..9cfa9e6056 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithIgnore.java @@ -0,0 +1,17 @@ +package com.ossez.jackson.bidirection; + +public class ItemWithIgnore { + public int id; + public String itemName; + public UserWithIgnore owner; + + public ItemWithIgnore() { + super(); + } + + public ItemWithIgnore(final int id, final String itemName, final UserWithIgnore owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithRef.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithRef.java new file mode 100644 index 0000000000..5db219f428 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithRef.java @@ -0,0 +1,21 @@ +package com.ossez.jackson.bidirection; + +import com.fasterxml.jackson.annotation.JsonBackReference; + +public class ItemWithRef { + public int id; + public String itemName; + + @JsonBackReference + public UserWithRef owner; + + public ItemWithRef() { + super(); + } + + public ItemWithRef(final int id, final String itemName, final UserWithRef owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithSerializer.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithSerializer.java new file mode 100644 index 0000000000..dc889d49e8 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithSerializer.java @@ -0,0 +1,17 @@ +package com.ossez.jackson.bidirection; + +public class ItemWithSerializer { + public int id; + public String itemName; + public UserWithSerializer owner; + + public ItemWithSerializer() { + super(); + } + + public ItemWithSerializer(final int id, final String itemName, final UserWithSerializer owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithView.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithView.java new file mode 100644 index 0000000000..c22a765b7c --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/ItemWithView.java @@ -0,0 +1,26 @@ +package com.ossez.jackson.bidirection; + +import com.ossez.jackson.bidirection.jsonview.Views; + +import com.fasterxml.jackson.annotation.JsonView; + +public class ItemWithView { + @JsonView(Views.Public.class) + public int id; + + @JsonView(Views.Public.class) + public String itemName; + + @JsonView(Views.Public.class) + public UserWithView owner; + + public ItemWithView() { + super(); + } + + public ItemWithView(final int id, final String itemName, final UserWithView owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/User.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/User.java new file mode 100644 index 0000000000..4f7cfadc05 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/User.java @@ -0,0 +1,24 @@ +package com.ossez.jackson.bidirection; + +import java.util.ArrayList; +import java.util.List; + +public class User { + public int id; + public String name; + public List userItems; + + public User() { + super(); + } + + public User(final int id, final String name) { + this.id = id; + this.name = name; + userItems = new ArrayList(); + } + + public void addItem(final Item item) { + userItems.add(item); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIdentity.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIdentity.java new file mode 100644 index 0000000000..90baaca4db --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIdentity.java @@ -0,0 +1,28 @@ +package com.ossez.jackson.bidirection; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") +public class UserWithIdentity { + public int id; + public String name; + public List userItems; + + public UserWithIdentity() { + super(); + } + + public UserWithIdentity(final int id, final String name) { + this.id = id; + this.name = name; + userItems = new ArrayList(); + } + + public void addItem(final ItemWithIdentity item) { + userItems.add(item); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIgnore.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIgnore.java new file mode 100644 index 0000000000..19fb6b63fe --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithIgnore.java @@ -0,0 +1,28 @@ +package com.ossez.jackson.bidirection; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class UserWithIgnore { + public int id; + public String name; + + @JsonIgnore + public List userItems; + + public UserWithIgnore() { + super(); + } + + public UserWithIgnore(final int id, final String name) { + this.id = id; + this.name = name; + userItems = new ArrayList(); + } + + public void addItem(final ItemWithIgnore item) { + userItems.add(item); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithRef.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithRef.java new file mode 100644 index 0000000000..8236103627 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithRef.java @@ -0,0 +1,28 @@ +package com.ossez.jackson.bidirection; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonManagedReference; + +public class UserWithRef { + public int id; + public String name; + + @JsonManagedReference + public List userItems; + + public UserWithRef() { + super(); + } + + public UserWithRef(final int id, final String name) { + this.id = id; + this.name = name; + userItems = new ArrayList<>(); + } + + public void addItem(final ItemWithRef item) { + userItems.add(item); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithSerializer.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithSerializer.java new file mode 100644 index 0000000000..7b4f2d01d3 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithSerializer.java @@ -0,0 +1,30 @@ +package com.ossez.jackson.bidirection; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +public class UserWithSerializer { + public int id; + public String name; + + @JsonSerialize(using = CustomListSerializer.class) + @JsonDeserialize(using = CustomListDeserializer.class) + public List userItems; + + public UserWithSerializer() { + super(); + } + + public UserWithSerializer(final int id, final String name) { + this.id = id; + this.name = name; + userItems = new ArrayList(); + } + + public void addItem(final ItemWithSerializer item) { + userItems.add(item); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithView.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithView.java new file mode 100644 index 0000000000..d1835e6a4e --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/UserWithView.java @@ -0,0 +1,33 @@ +package com.ossez.jackson.bidirection; + +import java.util.ArrayList; +import java.util.List; + +import com.ossez.jackson.bidirection.jsonview.Views; + +import com.fasterxml.jackson.annotation.JsonView; + +public class UserWithView { + @JsonView(Views.Public.class) + public int id; + + @JsonView(Views.Public.class) + public String name; + + @JsonView(Views.Internal.class) + public List userItems; + + public UserWithView() { + super(); + } + + public UserWithView(final int id, final String name) { + this.id = id; + this.name = name; + userItems = new ArrayList(); + } + + public void addItem(final ItemWithView item) { + userItems.add(item); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/jsonview/Views.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/jsonview/Views.java new file mode 100644 index 0000000000..5f1dea2908 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/bidirection/jsonview/Views.java @@ -0,0 +1,9 @@ +package com.ossez.jackson.bidirection.jsonview; + +public class Views { + public static class Public { + } + + public static class Internal extends Public { + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/domain/Person.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/domain/Person.java new file mode 100644 index 0000000000..026d52cfaa --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/domain/Person.java @@ -0,0 +1,30 @@ +package com.ossez.jackson.domain; + +public class Person { + + private String firstName; + private String lastName; + + public Person(String firstName, String lastName) { + super(); + this.firstName = firstName; + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} + diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/format/User.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/format/User.java new file mode 100644 index 0000000000..6a18331273 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/format/User.java @@ -0,0 +1,37 @@ +package com.ossez.jackson.format; + +import java.util.Date; + +import com.ossez.jackson.domain.Person; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * @author Jay Sridhar + * @version 1.0 + */ +public class User extends Person { + private String firstName; + private String lastName; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ") + private Date createdDate; + + public User(String firstName, String lastName) { + super(firstName, lastName); + this.createdDate = new Date(); + } + + public Date getCreatedDate() { + return createdDate; + } + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ", locale = "en_GB") + public Date getCurrentDate() { + return new Date(); + } + + @JsonFormat(shape = JsonFormat.Shape.NUMBER) + public Date getDateNum() { + return new Date(); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Item.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Item.java new file mode 100644 index 0000000000..2d9fe2c1c6 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Item.java @@ -0,0 +1,36 @@ +package com.ossez.jackson.jsonview; + +import com.fasterxml.jackson.annotation.JsonView; + +public class Item { + @JsonView(Views.Public.class) + public int id; + + @JsonView(Views.Public.class) + public String itemName; + + @JsonView(Views.Internal.class) + public String ownerName; + + public Item() { + super(); + } + + public Item(final int id, final String itemName, final String ownerName) { + this.id = id; + this.itemName = itemName; + this.ownerName = ownerName; + } + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public String getOwnerName() { + return ownerName; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/MyBeanSerializerModifier.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/MyBeanSerializerModifier.java new file mode 100644 index 0000000000..5dd24a7790 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/MyBeanSerializerModifier.java @@ -0,0 +1,22 @@ +package com.ossez.jackson.jsonview; + +import java.util.List; + +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.SerializationConfig; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; + +public class MyBeanSerializerModifier extends BeanSerializerModifier { + + @Override + public List changeProperties(final SerializationConfig config, final BeanDescription beanDesc, final List beanProperties) { + for (int i = 0; i < beanProperties.size(); i++) { + final BeanPropertyWriter beanPropertyWriter = beanProperties.get(i); + if (beanPropertyWriter.getName() == "name") { + beanProperties.set(i, new UpperCasingWriter(beanPropertyWriter)); + } + } + return beanProperties; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/UpperCasingWriter.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/UpperCasingWriter.java new file mode 100644 index 0000000000..95dc39bc46 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/UpperCasingWriter.java @@ -0,0 +1,21 @@ +package com.ossez.jackson.jsonview; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; + +public class UpperCasingWriter extends BeanPropertyWriter { + final BeanPropertyWriter _writer; + + public UpperCasingWriter(final BeanPropertyWriter w) { + super(w); + _writer = w; + } + + @Override + public void serializeAsField(final Object bean, final JsonGenerator gen, final SerializerProvider prov) throws Exception { + String value = ((User) bean).name; + value = (value == null) ? "" : value.toUpperCase(); + gen.writeStringField("name", value); + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/User.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/User.java new file mode 100644 index 0000000000..2f602c8e1b --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/User.java @@ -0,0 +1,27 @@ +package com.ossez.jackson.jsonview; + +import com.fasterxml.jackson.annotation.JsonView; + +public class User { + public int id; + + @JsonView(Views.Public.class) + public String name; + + public User() { + super(); + } + + public User(final int id, final String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Views.java b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Views.java new file mode 100644 index 0000000000..26e3c91a66 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/ossez/jackson/jsonview/Views.java @@ -0,0 +1,9 @@ +package com.ossez.jackson.jsonview; + +public class Views { + public static class Public { + } + + public static class Internal extends Public { + } +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AdvancedAnnotationsUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AdvancedAnnotationsUnitTest.java new file mode 100644 index 0000000000..f610d69724 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AdvancedAnnotationsUnitTest.java @@ -0,0 +1,133 @@ +package com.ossez.jackson.advancedannotations; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.ossez.jackson.advancedannotations.AppendBeans.BeanWithAppend; +import com.ossez.jackson.advancedannotations.AppendBeans.BeanWithoutAppend; +import com.ossez.jackson.advancedannotations.IdentityReferenceBeans.BeanWithIdentityReference; +import com.ossez.jackson.advancedannotations.IdentityReferenceBeans.BeanWithoutIdentityReference; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; +import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.module.jsonSchema.JsonSchema; +import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper; + +public class AdvancedAnnotationsUnitTest { + @Test + public void whenNotUsingJsonIdentityReferenceAnnotation_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + BeanWithoutIdentityReference bean = new BeanWithoutIdentityReference(1, "Bean Without Identity Reference Annotation"); + String jsonString = mapper.writeValueAsString(bean); + + assertThat(jsonString, containsString("Bean Without Identity Reference Annotation")); + } + + @Test + public void whenUsingJsonIdentityReferenceAnnotation_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + BeanWithIdentityReference bean = new BeanWithIdentityReference(1, "Bean With Identity Reference Annotation"); + String jsonString = mapper.writeValueAsString(bean); + + assertEquals("1", jsonString); + } + + @Test + public void whenNotUsingJsonAppendAnnotation_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + + BeanWithoutAppend bean = new BeanWithoutAppend(2, "Bean Without Append Annotation"); + ObjectWriter writer = mapper.writerFor(BeanWithoutAppend.class) + .withAttribute("version", "1.0"); + String jsonString = writer.writeValueAsString(bean); + + assertThat(jsonString, not(containsString("version"))); + assertThat(jsonString, not(containsString("1.0"))); + } + + @Test + public void whenUsingJsonAppendAnnotation_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + + BeanWithAppend bean = new BeanWithAppend(2, "Bean With Append Annotation"); + ObjectWriter writer = mapper.writerFor(BeanWithAppend.class) + .withAttribute("version", "1.0"); + String jsonString = writer.writeValueAsString(bean); + + assertThat(jsonString, containsString("version")); + assertThat(jsonString, containsString("1.0")); + } + + @Test + public void whenUsingJsonNamingAnnotation_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + NamingBean bean = new NamingBean(3, "Naming Bean"); + String jsonString = mapper.writeValueAsString(bean); + + assertThat(jsonString, containsString("bean_name")); + } + + @Test + public void whenUsingJsonPropertyDescriptionAnnotation_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + SchemaFactoryWrapper wrapper = new SchemaFactoryWrapper(); + mapper.acceptJsonFormatVisitor(PropertyDescriptionBean.class, wrapper); + JsonSchema jsonSchema = wrapper.finalSchema(); + String jsonString = mapper.writeValueAsString(jsonSchema); + System.out.println(jsonString); + assertThat(jsonString, containsString("This is a description of the name property")); + } + + @Test + public void whenUsingJsonPOJOBuilderAnnotation_thenCorrect() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + String jsonString = "{\"id\":5,\"name\":\"POJO Builder Bean\"}"; + POJOBuilderBean bean = mapper.readValue(jsonString, POJOBuilderBean.class); + + assertEquals(5, bean.getIdentity()); + assertEquals("POJO Builder Bean", bean.getBeanName()); + } + + @Test + public void whenUsingJsonTypeIdAnnotation_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.enableDefaultTyping(DefaultTyping.NON_FINAL); + TypeIdBean bean = new TypeIdBean(6, "Type Id Bean"); + String jsonString = mapper.writeValueAsString(bean); + + assertThat(jsonString, containsString("Type Id Bean")); + } + + @Test + public void whenUsingJsonTypeIdResolverAnnotation_thenCorrect() throws IOException { + TypeIdResolverStructure.FirstBean bean1 = new TypeIdResolverStructure.FirstBean(1, "Bean 1"); + TypeIdResolverStructure.LastBean bean2 = new TypeIdResolverStructure.LastBean(2, "Bean 2"); + + List beans = new ArrayList<>(); + beans.add(bean1); + beans.add(bean2); + + TypeIdResolverStructure.BeanContainer serializedContainer = new TypeIdResolverStructure.BeanContainer(); + serializedContainer.setBeans(beans); + + ObjectMapper mapper = new ObjectMapper(); + String jsonString = mapper.writeValueAsString(serializedContainer); + assertThat(jsonString, containsString("bean1")); + assertThat(jsonString, containsString("bean2")); + + TypeIdResolverStructure.BeanContainer deserializedContainer = mapper.readValue(jsonString, TypeIdResolverStructure.BeanContainer.class); + List beanList = deserializedContainer.getBeans(); + assertThat(beanList.get(0), instanceOf(TypeIdResolverStructure.FirstBean.class)); + assertThat(beanList.get(1), instanceOf(TypeIdResolverStructure.LastBean.class)); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AppendBeans.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AppendBeans.java new file mode 100644 index 0000000000..6f28dbe42b --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/AppendBeans.java @@ -0,0 +1,58 @@ +package com.ossez.jackson.advancedannotations; + +import com.fasterxml.jackson.databind.annotation.JsonAppend; + +public class AppendBeans { + public static class BeanWithoutAppend { + private int id; + private String name; + + public BeanWithoutAppend(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + @JsonAppend(attrs = { @JsonAppend.Attr(value = "version") }) + public static class BeanWithAppend { + private int id; + private String name; + + public BeanWithAppend(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/IdentityReferenceBeans.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/IdentityReferenceBeans.java new file mode 100644 index 0000000000..a825b7c19c --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/IdentityReferenceBeans.java @@ -0,0 +1,62 @@ +package com.ossez.jackson.advancedannotations; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +public class IdentityReferenceBeans { + @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") + public static class BeanWithoutIdentityReference { + private int id; + private String name; + + public BeanWithoutIdentityReference(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") + @JsonIdentityReference(alwaysAsId = true) + public static class BeanWithIdentityReference { + private int id; + private String name; + + public BeanWithIdentityReference(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/NamingBean.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/NamingBean.java new file mode 100644 index 0000000000..93b84b1c2a --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/NamingBean.java @@ -0,0 +1,31 @@ +package com.ossez.jackson.advancedannotations; + +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; + +@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) +public class NamingBean { + private int id; + private String beanName; + + public NamingBean(int id, String beanName) { + this.id = id; + this.beanName = beanName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getBeanName() { + return beanName; + } + + public void setBeanName(String beanName) { + this.beanName = beanName; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/POJOBuilderBean.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/POJOBuilderBean.java new file mode 100644 index 0000000000..682917edc5 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/POJOBuilderBean.java @@ -0,0 +1,51 @@ +package com.ossez.jackson.advancedannotations; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + +@JsonDeserialize(builder = POJOBuilderBean.BeanBuilder.class) +public class POJOBuilderBean { + private int identity; + private String beanName; + + @JsonPOJOBuilder(buildMethodName = "createBean", withPrefix = "construct") + public static class BeanBuilder { + private int idValue; + private String nameValue; + + public BeanBuilder constructId(int id) { + idValue = id; + return this; + } + + public BeanBuilder constructName(String name) { + nameValue = name; + return this; + } + + public POJOBuilderBean createBean() { + return new POJOBuilderBean(idValue, nameValue); + } + } + + public POJOBuilderBean(int identity, String beanName) { + this.identity = identity; + this.beanName = beanName; + } + + public int getIdentity() { + return identity; + } + + public void setIdentity(int identity) { + this.identity = identity; + } + + public String getBeanName() { + return beanName; + } + + public void setBeanName(String beanName) { + this.beanName = beanName; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/PropertyDescriptionBean.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/PropertyDescriptionBean.java new file mode 100644 index 0000000000..b9178a2777 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/PropertyDescriptionBean.java @@ -0,0 +1,25 @@ +package com.ossez.jackson.advancedannotations; + +import com.fasterxml.jackson.annotation.JsonPropertyDescription; + +public class PropertyDescriptionBean { + private int id; + @JsonPropertyDescription("This is a description of the name property") + private String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdBean.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdBean.java new file mode 100644 index 0000000000..532941c551 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdBean.java @@ -0,0 +1,30 @@ +package com.ossez.jackson.advancedannotations; + +import com.fasterxml.jackson.annotation.JsonTypeId; + +public class TypeIdBean { + private int id; + @JsonTypeId + private String name; + + public TypeIdBean(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdResolverStructure.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdResolverStructure.java new file mode 100644 index 0000000000..eb65f1df70 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/advancedannotations/TypeIdResolverStructure.java @@ -0,0 +1,130 @@ +package com.ossez.jackson.advancedannotations; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; +import com.fasterxml.jackson.databind.DatabindContext; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver; +import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase; + +public class TypeIdResolverStructure { + public static class BeanContainer { + private List beans; + + public List getBeans() { + return beans; + } + + public void setBeans(List beans) { + this.beans = beans; + } + } + + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@type") + @JsonTypeIdResolver(BeanIdResolver.class) + public static class AbstractBean { + private int id; + + protected AbstractBean() { + } + + protected AbstractBean(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + } + + public static class FirstBean extends AbstractBean { + String firstName; + + public FirstBean() { + } + + public FirstBean(int id, String name) { + super(id); + setFirstName(name); + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String name) { + firstName = name; + } + } + + public static class LastBean extends AbstractBean { + String lastName; + + public LastBean() { + } + + public LastBean(int id, String name) { + super(id); + setLastName(name); + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String name) { + lastName = name; + } + } + + public static class BeanIdResolver extends TypeIdResolverBase { + private JavaType superType; + + @Override + public void init(JavaType baseType) { + superType = baseType; + } + + @Override + public Id getMechanism() { + return Id.NAME; + } + + @Override + public String idFromValue(Object obj) { + return idFromValueAndType(obj, obj.getClass()); + } + + @Override + public String idFromValueAndType(Object obj, Class subType) { + String typeId = null; + switch (subType.getSimpleName()) { + case "FirstBean": + typeId = "bean1"; + break; + case "LastBean": + typeId = "bean2"; + } + return typeId; + } + + @Override + public JavaType typeFromId(DatabindContext context, String id) { + Class subType = null; + switch (id) { + case "bean1": + subType = FirstBean.class; + break; + case "bean2": + subType = LastBean.class; + } + return context.constructSpecializedType(superType, subType); + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/bidirection/JacksonBidirectionRelationUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/bidirection/JacksonBidirectionRelationUnitTest.java new file mode 100644 index 0000000000..b04ac4da9d --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/bidirection/JacksonBidirectionRelationUnitTest.java @@ -0,0 +1,152 @@ +package com.ossez.jackson.bidirection; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; + +import com.ossez.jackson.bidirection.jsonview.Views; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonBidirectionRelationUnitTest { + + @Test (expected = JsonMappingException.class) + public void givenBidirectionRelation_whenSerializing_thenException() throws JsonProcessingException { + final User user = new User(1, "John"); + final Item item = new Item(2, "book", user); + user.addItem(item); + + new ObjectMapper().writeValueAsString(item); + } + + @Test + public void givenBidirectionRelation_whenUsingJacksonReferenceAnnotationWithSerialization_thenCorrect() throws JsonProcessingException { + final UserWithRef user = new UserWithRef(1, "John"); + final ItemWithRef item = new ItemWithRef(2, "book", user); + user.addItem(item); + + final String itemJson = new ObjectMapper().writeValueAsString(item); + final String userJson = new ObjectMapper().writeValueAsString(user); + + assertThat(itemJson, containsString("book")); + assertThat(itemJson, not(containsString("John"))); + + assertThat(userJson, containsString("John")); + assertThat(userJson, containsString("userItems")); + assertThat(userJson, containsString("book")); + } + + @Test + public void givenBidirectionRelation_whenUsingJacksonReferenceAnnotationWithDeserialization_thenCorrect() throws JsonProcessingException { + final UserWithRef user = new UserWithRef(1, "John"); + final ItemWithRef item = new ItemWithRef(2, "book", user); + user.addItem(item); + + final String itemJson = new ObjectMapper().writeValueAsString(item); + final String userJson = new ObjectMapper().writeValueAsString(user); + + final ItemWithRef itemRead = new ObjectMapper().readValue(itemJson, ItemWithRef.class); + final UserWithRef userRead = new ObjectMapper().readValue(userJson, UserWithRef.class); + + assertThat(itemRead.itemName, is("book")); + assertThat(itemRead.owner, nullValue()); + + assertThat(userRead.name, is("John")); + assertThat(userRead.userItems.get(0).itemName, is("book")); + } + + @Test + public void givenBidirectionRelation_whenUsingJsonIdentityInfo_thenCorrect() throws JsonProcessingException { + final UserWithIdentity user = new UserWithIdentity(1, "John"); + final ItemWithIdentity item = new ItemWithIdentity(2, "book", user); + user.addItem(item); + + final String result = new ObjectMapper().writeValueAsString(item); + + assertThat(result, containsString("book")); + assertThat(result, containsString("John")); + assertThat(result, containsString("userItems")); + } + + @Test + public void givenBidirectionRelation_whenUsingJsonIgnore_thenCorrect() throws JsonProcessingException { + final UserWithIgnore user = new UserWithIgnore(1, "John"); + final ItemWithIgnore item = new ItemWithIgnore(2, "book", user); + user.addItem(item); + + final String result = new ObjectMapper().writeValueAsString(item); + + assertThat(result, containsString("book")); + assertThat(result, containsString("John")); + assertThat(result, not(containsString("userItems"))); + } + + @Test + public void givenBidirectionRelation_whenUsingCustomSerializer_thenCorrect() throws JsonProcessingException { + final UserWithSerializer user = new UserWithSerializer(1, "John"); + final ItemWithSerializer item = new ItemWithSerializer(2, "book", user); + user.addItem(item); + + final String result = new ObjectMapper().writeValueAsString(item); + + assertThat(result, containsString("book")); + assertThat(result, containsString("John")); + assertThat(result, containsString("userItems")); + } + + @Test + public void givenBidirectionRelation_whenDeserializingUsingIdentity_thenCorrect() throws JsonProcessingException, IOException { + final String json = "{\"id\":2,\"itemName\":\"book\",\"owner\":{\"id\":1,\"name\":\"John\",\"userItems\":[2]}}"; + + final ItemWithIdentity item = new ObjectMapper().readerFor(ItemWithIdentity.class) + .readValue(json); + + assertEquals(2, item.id); + assertEquals("book", item.itemName); + assertEquals("John", item.owner.name); + } + + @Test + public void givenBidirectionRelation_whenUsingCustomDeserializer_thenCorrect() throws JsonProcessingException, IOException { + final String json = "{\"id\":2,\"itemName\":\"book\",\"owner\":{\"id\":1,\"name\":\"John\",\"userItems\":[2]}}"; + + final ItemWithSerializer item = new ObjectMapper().readerFor(ItemWithSerializer.class) + .readValue(json); + assertEquals(2, item.id); + assertEquals("book", item.itemName); + assertEquals("John", item.owner.name); + } + + @Test + public void givenBidirectionRelation_whenUsingPublicJsonView_thenCorrect() throws JsonProcessingException { + final UserWithView user = new UserWithView(1, "John"); + final ItemWithView item = new ItemWithView(2, "book", user); + user.addItem(item); + + final String result = new ObjectMapper().writerWithView(Views.Public.class) + .writeValueAsString(item); + + assertThat(result, containsString("book")); + assertThat(result, containsString("John")); + assertThat(result, not(containsString("userItems"))); + } + + @Test(expected = JsonMappingException.class) + public void givenBidirectionRelation_whenUsingInternalJsonView_thenException() throws JsonProcessingException { + final UserWithView user = new UserWithView(1, "John"); + final ItemWithView item = new ItemWithView(2, "book", user); + user.addItem(item); + + new ObjectMapper().writerWithView(Views.Internal.class) + .writeValueAsString(item); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/format/JsonFormatUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/format/JsonFormatUnitTest.java new file mode 100644 index 0000000000..5771df25f7 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/format/JsonFormatUnitTest.java @@ -0,0 +1,37 @@ +package com.ossez.jackson.format; + +import java.util.Date; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.junit.Test; + +import static io.restassured.path.json.JsonPath.from; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.data.Percentage.withPercentage; + +/** + * @author Jay Sridhar + * @version 1.0 + */ +public class JsonFormatUnitTest { + + @Test + public void whenSerializedDateFormat_thenCorrect() throws JsonProcessingException { + + User user = new User("Jay", "Sridhar"); + + String result = new ObjectMapper().writeValueAsString(user); + + // Expected to match: "2016-12-19@09:34:42.628+0000" + assertThat(from(result).getString("createdDate")).matches("\\d{4}\\-\\d{2}\\-\\d{2}@\\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\+\\d{4}"); + + // Expected to be close to current time + long now = new Date().getTime(); + assertThat(from(result).getLong("dateNum")).isCloseTo(now, withPercentage(10.0)); + + } +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/jsonview/JacksonJsonViewUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/jsonview/JacksonJsonViewUnitTest.java new file mode 100644 index 0000000000..e658982009 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/ossez/jackson/jsonview/JacksonJsonViewUnitTest.java @@ -0,0 +1,88 @@ +package com.ossez.jackson.jsonview; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.BeanSerializerFactory; +import com.fasterxml.jackson.databind.ser.SerializerFactory; + +public class JacksonJsonViewUnitTest { + + @Test + public void whenUseJsonViewToSerialize_thenCorrect() throws JsonProcessingException { + final User user = new User(1, "John"); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); + + final String result = mapper.writerWithView(Views.Public.class) + .writeValueAsString(user); + + assertThat(result, containsString("John")); + assertThat(result, not(containsString("1"))); + } + + @Test + public void whenUsePublicView_thenOnlyPublicSerialized() throws JsonProcessingException { + final Item item = new Item(2, "book", "John"); + + final ObjectMapper mapper = new ObjectMapper(); + final String result = mapper.writerWithView(Views.Public.class) + .writeValueAsString(item); + + assertThat(result, containsString("book")); + assertThat(result, containsString("2")); + + assertThat(result, not(containsString("John"))); + } + + @Test + public void whenUseInternalView_thenAllSerialized() throws JsonProcessingException { + final Item item = new Item(2, "book", "John"); + + final ObjectMapper mapper = new ObjectMapper(); + final String result = mapper.writerWithView(Views.Internal.class) + .writeValueAsString(item); + + assertThat(result, containsString("book")); + assertThat(result, containsString("2")); + + assertThat(result, containsString("John")); + } + + @Test + public void whenUseJsonViewToDeserialize_thenCorrect() throws IOException { + final String json = "{\"id\":1,\"name\":\"John\"}"; + + final ObjectMapper mapper = new ObjectMapper(); + + final User user = mapper.readerWithView(Views.Public.class) + .forType(User.class) + .readValue(json); + assertEquals(1, user.getId()); + assertEquals("John", user.getName()); + } + + @Test + public void whenUseCustomJsonViewToSerialize_thenCorrect() throws JsonProcessingException { + final User user = new User(1, "John"); + final SerializerFactory serializerFactory = BeanSerializerFactory.instance.withSerializerModifier(new MyBeanSerializerModifier()); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializerFactory(serializerFactory); + + final String result = mapper.writerWithView(Views.Public.class) + .writeValueAsString(user); + assertThat(result, containsString("JOHN")); + assertThat(result, containsString("1")); + } +} diff --git a/jackson-modules/jackson-conversions-2/README.md b/jackson-modules/jackson-conversions-2/README.md new file mode 100644 index 0000000000..ca81512fa3 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/README.md @@ -0,0 +1,13 @@ +## Jackson 转换 + +本模块中包含有关 Jackson 转换(Jackson conversions)有关的文章。 + +### 相关文章: +- [Mapping a Dynamic JSON Object with Jackson](https://www.baeldung.com/jackson-mapping-dynamic-object) +- [Mapping Multiple JSON Fields to a Single Java Field](https://www.baeldung.com/json-multiple-fields-single-java-field) +- [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json) +- [Converting JSON to CSV in Java](https://www.baeldung.com/java-converting-json-to-csv) +- [How to Process YAML with Jackson](https://www.baeldung.com/jackson-yaml) +- [Jackson Streaming API](https://www.baeldung.com/jackson-streaming-api) +- [Jackson: java.util.LinkedHashMap cannot be cast to X](https://www.baeldung.com/jackson-linkedhashmap-cannot-be-cast) +- More articles: [[<-- prev]](../jackson-conversions) diff --git a/jackson-modules/jackson-conversions-2/pom.xml b/jackson-modules/jackson-conversions-2/pom.xml new file mode 100644 index 0000000000..58de10fbd9 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + jackson-conversions-2 + 0.0.1-SNAPSHOT + jackson-conversions-2 + + + com.ossez + jackson-modules + 0.0.2-SNAPSHOT + + + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson.version} + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson-datatype.version} + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-csv + ${jackson.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + jackson-conversions-2 + + + src/main/resources + true + + + + + + 2.9.8 + + + \ No newline at end of file diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/JsonCsvConverter.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/JsonCsvConverter.java new file mode 100644 index 0000000000..b907b9301f --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/JsonCsvConverter.java @@ -0,0 +1,57 @@ +package com.ossez.jackson.csv; + +import java.io.File; +import java.io.IOException; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.MappingIterator; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.dataformat.csv.CsvMapper; +import com.fasterxml.jackson.dataformat.csv.CsvSchema; +import com.fasterxml.jackson.dataformat.csv.CsvSchema.Builder; + +public class JsonCsvConverter { + + public static void JsonToCsv(File jsonFile, File csvFile) throws IOException { + JsonNode jsonTree = new ObjectMapper().readTree(jsonFile); + + Builder csvSchemaBuilder = CsvSchema.builder(); + JsonNode firstObject = jsonTree.elements().next(); + firstObject.fieldNames().forEachRemaining(fieldName -> {csvSchemaBuilder.addColumn(fieldName);} ); + CsvSchema csvSchema = csvSchemaBuilder + .build() + .withHeader(); + + CsvMapper csvMapper = new CsvMapper(); + csvMapper.writerFor(JsonNode.class) + .with(csvSchema) + .writeValue(csvFile, jsonTree); + } + + public static void csvToJson(File csvFile, File jsonFile) throws IOException { + CsvSchema orderLineSchema = CsvSchema.emptySchema().withHeader(); + CsvMapper csvMapper = new CsvMapper(); + MappingIterator orderLines = csvMapper.readerFor(OrderLine.class) + .with(orderLineSchema) + .readValues(csvFile); + + new ObjectMapper() + .configure(SerializationFeature.INDENT_OUTPUT, true) + .writeValue(jsonFile, orderLines.readAll()); + } + + public static void JsonToFormattedCsv(File jsonFile, File csvFile) throws IOException { + CsvMapper csvMapper = new CsvMapper(); + CsvSchema csvSchema = csvMapper + .schemaFor(OrderLineForCsv.class) + .withHeader(); + csvMapper.addMixIn(OrderLine.class, OrderLineForCsv.class); + + OrderLine[] orderLines = new ObjectMapper() + .readValue(jsonFile, OrderLine[].class); + csvMapper.writerFor(OrderLine[].class) + .with(csvSchema) + .writeValue(csvFile, orderLines); + } +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLine.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLine.java new file mode 100644 index 0000000000..7c028aa70c --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLine.java @@ -0,0 +1,49 @@ +package com.ossez.jackson.csv; + +import java.math.BigDecimal; + +public class OrderLine { + private String item; + private int quantity; + private BigDecimal unitPrice; + + public OrderLine() { + + } + + public OrderLine(String item, int quantity, BigDecimal unitPrice) { + super(); + this.item = item; + this.quantity = quantity; + this.unitPrice = unitPrice; + } + + public String getItem() { + return item; + } + + public void setItem(String item) { + this.item = item; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public BigDecimal getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(BigDecimal unitPrice) { + this.unitPrice = unitPrice; + } + + @Override + public String toString() { + return "OrderLine [item=" + item + ", quantity=" + quantity + ", unitPrice=" + unitPrice + "]"; + } +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLineForCsv.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLineForCsv.java new file mode 100644 index 0000000000..7e89d12a1c --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/csv/OrderLineForCsv.java @@ -0,0 +1,25 @@ +package com.ossez.jackson.csv; + +import java.math.BigDecimal; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonPropertyOrder({ + "count", + "name" +}) +public abstract class OrderLineForCsv { + + @JsonProperty("name") + private String item; + + @JsonProperty("count") + private int quantity; + + @JsonIgnore + private BigDecimal unitPrice; + + +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/Product.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/Product.java new file mode 100644 index 0000000000..2b1b5b995e --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/Product.java @@ -0,0 +1,39 @@ +package com.ossez.jackson.dynamicobject; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonAnySetter; + +public class Product { + + private String name; + private String category; + private Map details = new LinkedHashMap<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Map getDetails() { + return details; + } + + @JsonAnySetter + public void setDetail(String key, Object value) { + details.put(key, value); + } + +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductJsonNode.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductJsonNode.java new file mode 100644 index 0000000000..5c399a8411 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductJsonNode.java @@ -0,0 +1,35 @@ +package com.ossez.jackson.dynamicobject; + +import com.fasterxml.jackson.databind.JsonNode; + +public class ProductJsonNode { + + private String name; + private String category; + private JsonNode details; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public JsonNode getDetails() { + return details; + } + + public void setDetails(JsonNode details) { + this.details = details; + } + +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductMap.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductMap.java new file mode 100644 index 0000000000..290bb50ef6 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/dynamicobject/ProductMap.java @@ -0,0 +1,35 @@ +package com.ossez.jackson.dynamicobject; + +import java.util.Map; + +public class ProductMap { + + private String name; + private String category; + private Map details; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Map getDetails() { + return details; + } + + public void setDetails(Map details) { + this.details = details; + } + +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/multiplefields/Weather.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/multiplefields/Weather.java new file mode 100644 index 0000000000..45d0322bfa --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/multiplefields/Weather.java @@ -0,0 +1,44 @@ +package com.ossez.jackson.multiplefields; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Weather { + + @JsonProperty("location") + @JsonAlias("place") + private String location; + + @JsonProperty("temp") + @JsonAlias("temperature") + private int temp; + + @JsonProperty("outlook") + @JsonAlias("weather") + private String outlook; + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public int getTemp() { + return temp; + } + + public void setTemp(int temp) { + this.temp = temp; + } + + public String getOutlook() { + return outlook; + } + + public void setOutlook(String outlook) { + this.outlook = outlook; + } + +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/Book.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/Book.java new file mode 100644 index 0000000000..9f0dd4db28 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/Book.java @@ -0,0 +1,70 @@ +package com.ossez.jackson.tocollection; + + +import java.util.Objects; + +public class Book { + private Integer bookId; + private String title; + private String author; + + public Book() {} + + public Book(Integer bookId, String title, String author) { + this.bookId = bookId; + this.title = title; + this.author = author; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Book)) { + return false; + } + + Book book = (Book) o; + + if (!Objects.equals(bookId, book.bookId)) { + return false; + } + if (!Objects.equals(title, book.title)) { + return false; + } + return Objects.equals(author, book.author); + } + + @Override + public int hashCode() { + int result = bookId != null ? bookId.hashCode() : 0; + result = 31 * result + (title != null ? title.hashCode() : 0); + result = 31 * result + (author != null ? author.hashCode() : 0); + return result; + } + + public Integer getBookId() { + return bookId; + } + + public void setBookId(Integer bookId) { + this.bookId = bookId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/JsonToCollectionUtil.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/JsonToCollectionUtil.java new file mode 100644 index 0000000000..f60a3cde5a --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/tocollection/JsonToCollectionUtil.java @@ -0,0 +1,24 @@ +package com.ossez.jackson.tocollection; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.CollectionType; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class JsonToCollectionUtil { + + private JsonToCollectionUtil(){} + + public static List jsonArrayToList(String json, Class elementClass) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, elementClass); + return objectMapper.readValue(json, listType); + } + + public static List jsonArrayToList2(String json, Class elementClass) throws IOException { + return new ObjectMapper().readValue(json, new TypeReference>() {}); + } +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Color.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Color.java new file mode 100644 index 0000000000..da3c3fa590 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Color.java @@ -0,0 +1,5 @@ +package com.ossez.jackson.xmlToJson; + +public enum Color { + PINK, BLUE, YELLOW, RED; +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Flower.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Flower.java new file mode 100644 index 0000000000..8963c52c27 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/xmlToJson/Flower.java @@ -0,0 +1,42 @@ +package com.ossez.jackson.xmlToJson; + +public class Flower { + + private String name; + + private Color color; + + private Integer petals; + + public Flower() { } + + public Flower(String name, Color color, Integer petals) { + this.name = name; + this.color = color; + this.petals = petals; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } + + public Integer getPetals() { + return petals; + } + + public void setPetals(Integer petals) { + this.petals = petals; + } +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/Order.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/Order.java new file mode 100644 index 0000000000..b9739544e9 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/Order.java @@ -0,0 +1,68 @@ +package com.ossez.jackson.yaml; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class Order { + private String orderNo; + private LocalDate date; + private String customerName; + private List orderLines; + + public Order() { + + } + + public Order(String orderNo, LocalDate date, String customerName, List orderLines) { + super(); + this.orderNo = orderNo; + this.date = date; + this.customerName = customerName; + this.orderLines = orderLines; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public List getOrderLines() { + if (orderLines == null) { + orderLines = new ArrayList<>(); + } + return orderLines; + } + + public void setOrderLines(List orderLines) { + if (orderLines == null) { + orderLines = new ArrayList<>(); + } + this.orderLines = orderLines; + } + + @Override + public String toString() { + return "Order [orderNo=" + orderNo + ", date=" + date + ", customerName=" + customerName + ", orderLines=" + orderLines + "]"; + } + +} diff --git a/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/OrderLine.java b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/OrderLine.java new file mode 100644 index 0000000000..c30a5fd120 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/java/com/ossez/jackson/yaml/OrderLine.java @@ -0,0 +1,49 @@ +package com.ossez.jackson.yaml; + +import java.math.BigDecimal; + +public class OrderLine { + private String item; + private int quantity; + private BigDecimal unitPrice; + + public OrderLine() { + + } + + public OrderLine(String item, int quantity, BigDecimal unitPrice) { + super(); + this.item = item; + this.quantity = quantity; + this.unitPrice = unitPrice; + } + + public String getItem() { + return item; + } + + public void setItem(String item) { + this.item = item; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public BigDecimal getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(BigDecimal unitPrice) { + this.unitPrice = unitPrice; + } + + @Override + public String toString() { + return "OrderLine [item=" + item + ", quantity=" + quantity + ", unitPrice=" + unitPrice + "]"; + } +} diff --git a/jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.csv b/jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.csv new file mode 100644 index 0000000000..e15e12f2bf --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.csv @@ -0,0 +1,3 @@ +item,quantity,unitPrice +"No. 9 Sprockets",12,1.23 +"Widget (10mm)",4,3.45 diff --git a/jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.json b/jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.json new file mode 100644 index 0000000000..64f18e1673 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/resources/csv/orderLines.json @@ -0,0 +1,9 @@ +[ { + "item" : "No. 9 Sprockets", + "quantity" : 12, + "unitPrice" : 1.23 +}, { + "item" : "Widget (10mm)", + "quantity" : 4, + "unitPrice" : 3.45 +} ] \ No newline at end of file diff --git a/jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.xml b/jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.xml new file mode 100644 index 0000000000..b2f951315b --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/main/resources/to-java-collection/books.xml @@ -0,0 +1,17 @@ + + + 1 + A Song of Ice and Fire + George R. R. Martin + + + 2 + The Hitchhiker's Guide to the Galaxy + Douglas Adams + + + 3 + Hackers And Painters + Paul Graham + + diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/csv/CsvUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/csv/CsvUnitTest.java new file mode 100644 index 0000000000..31f49da723 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/csv/CsvUnitTest.java @@ -0,0 +1,65 @@ +package com.ossez.jackson.csv; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.google.common.io.Files; + +public class CsvUnitTest { + + private File csvFromJson; + private File jsonFromCsv; + private File formattedCsvFromJson; + + @Before + public void setup() { + csvFromJson = new File("src/main/resources/csv/csvFromJson.csv"); + jsonFromCsv = new File("src/main/resources/csv/jsonFromCsv.json"); + formattedCsvFromJson = new File("src/main/resources/csv/formattedCsvFromJson.csv"); + } + + @After + public void cleanup() { + csvFromJson.deleteOnExit(); + jsonFromCsv.deleteOnExit(); + formattedCsvFromJson.deleteOnExit(); + } + + @Test + public void givenJsonInput_thenWriteCsv() throws JsonParseException, JsonMappingException, IOException { + JsonCsvConverter.JsonToCsv(new File("src/main/resources/csv/orderLines.json"), csvFromJson); + + assertEquals(readFile(csvFromJson.getAbsolutePath()), readFile("src/test/resources/csv/expectedCsvFromJson.csv")); + } + + @Test + public void givenCsvInput_thenWritesJson() throws JsonParseException, JsonMappingException, IOException { + JsonCsvConverter.csvToJson(new File("src/main/resources/csv/orderLines.csv"), jsonFromCsv); + + assertEquals(readFile(jsonFromCsv.getAbsolutePath()), readFile("src/test/resources/csv/expectedJsonFromCsv.json")); + + } + + @Test + public void givenJsonInput_thenWriteFormattedCsvOutput() throws JsonParseException, JsonMappingException, IOException { + JsonCsvConverter.JsonToFormattedCsv(new File("src/main/resources/csv/orderLines.json"), formattedCsvFromJson); + + assertEquals(readFile(formattedCsvFromJson.getAbsolutePath()), readFile("src/test/resources/csv/expectedFormattedCsvFromJson.csv")); + + } + + private List readFile(String filename) throws IOException { + return Files.readLines(new File(filename), Charset.forName("utf-8")); + } + +}; \ No newline at end of file diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/dynamicobject/DynamicObjectDeserializationUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/dynamicobject/DynamicObjectDeserializationUnitTest.java new file mode 100644 index 0000000000..f037bb398f --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/dynamicobject/DynamicObjectDeserializationUnitTest.java @@ -0,0 +1,69 @@ +package com.ossez.jackson.dynamicobject; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.util.Scanner; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DynamicObjectDeserializationUnitTest { + + private ObjectMapper objectMapper; + + @BeforeEach + void setup() { + objectMapper = new ObjectMapper(); + } + + private String readResource(String path) { + try (Scanner scanner = new Scanner(getClass().getResourceAsStream(path), "UTF-8")) { + return scanner.useDelimiter("\\A").next(); + } + } + + @Test + void givenJsonString_whenParsingToJsonNode_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/embedded.json"); + + // when + ProductJsonNode product = objectMapper.readValue(json, ProductJsonNode.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector").asText()).isEqualTo("none"); + } + + @Test + void givenJsonString_whenParsingToMap_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/embedded.json"); + + // when + ProductMap product = objectMapper.readValue(json, ProductMap.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector")).isEqualTo("none"); + } + + @Test + void givenJsonString_whenParsingWithJsonAnySetter_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/flat.json"); + + // when + Product product = objectMapper.readValue(json, Product.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector")).isEqualTo("none"); + } + +} diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/multiplefields/MapMultipleFieldsToSingleFieldUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/multiplefields/MapMultipleFieldsToSingleFieldUnitTest.java new file mode 100644 index 0000000000..fa8659bacd --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/multiplefields/MapMultipleFieldsToSingleFieldUnitTest.java @@ -0,0 +1,37 @@ +package com.ossez.jackson.multiplefields; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class MapMultipleFieldsToSingleFieldUnitTest { + + @Test + public void givenTwoJsonFormats_whenDeserialized_thenWeatherObjectsCreated() throws Exception { + + ObjectMapper mapper = new ObjectMapper(); + + Weather weather = mapper.readValue("{" + + "\"location\": \"London\"," + + "\"temp\": 15," + + "\"weather\": \"Cloudy\"" + + "}", Weather.class); + + assertEquals("London", weather.getLocation()); + assertEquals("Cloudy", weather.getOutlook()); + assertEquals(15, weather.getTemp()); + + weather = mapper.readValue("{" + + "\"place\": \"Lisbon\"," + + "\"temperature\": 35," + + "\"outlook\": \"Sunny\"" + + "}", Weather.class); + + assertEquals("Lisbon", weather.getLocation()); + assertEquals("Sunny", weather.getOutlook()); + assertEquals(35, weather.getTemp()); + + } +} diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/streaming/StreamingAPIUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/streaming/StreamingAPIUnitTest.java new file mode 100644 index 0000000000..4e987a9d7c --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/streaming/StreamingAPIUnitTest.java @@ -0,0 +1,118 @@ +package com.ossez.jackson.streaming; + +import com.fasterxml.jackson.core.*; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; +import static junit.framework.TestCase.assertEquals; + +public class StreamingAPIUnitTest { + + @Test + public void givenJsonGenerator_whenAppendJsonToIt_thenGenerateJson() throws IOException { + // given + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + JsonFactory jfactory = new JsonFactory(); + JsonGenerator jGenerator = jfactory.createGenerator(stream, JsonEncoding.UTF8); + + // when + jGenerator.writeStartObject(); + jGenerator.writeStringField("name", "Tom"); + jGenerator.writeNumberField("age", 25); + jGenerator.writeFieldName("address"); + jGenerator.writeStartArray(); + jGenerator.writeString("Poland"); + jGenerator.writeString("5th avenue"); + jGenerator.writeEndArray(); + jGenerator.writeEndObject(); + jGenerator.close(); + + // then + String json = new String(stream.toByteArray(), "UTF-8"); + assertEquals(json, "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}"); + } + + @Test + public void givenJson_whenReadItUsingStreamAPI_thenShouldCreateProperJsonObject() throws IOException { + // given + String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}"; + JsonFactory jfactory = new JsonFactory(); + JsonParser jParser = jfactory.createParser(json); + + String parsedName = null; + Integer parsedAge = null; + List addresses = new LinkedList<>(); + + // when + while (jParser.nextToken() != JsonToken.END_OBJECT) { + + String fieldname = jParser.getCurrentName(); + if ("name".equals(fieldname)) { + jParser.nextToken(); + parsedName = jParser.getText(); + + } + + if ("age".equals(fieldname)) { + jParser.nextToken(); + parsedAge = jParser.getIntValue(); + + } + + if ("address".equals(fieldname)) { + jParser.nextToken(); + + while (jParser.nextToken() != JsonToken.END_ARRAY) { + addresses.add(jParser.getText()); + } + } + + } + jParser.close(); + + // then + assertEquals(parsedName, "Tom"); + assertEquals(parsedAge, (Integer) 25); + assertEquals(addresses, Arrays.asList("Poland", "5th avenue")); + + } + + @Test + public void givenJson_whenWantToExtractPartOfIt_thenShouldExtractOnlyNeededFieldWithoutGoingThroughWholeJSON() throws IOException { + // given + String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}"; + JsonFactory jfactory = new JsonFactory(); + JsonParser jParser = jfactory.createParser(json); + + String parsedName = null; + Integer parsedAge = null; + List addresses = new LinkedList<>(); + + // when + while (jParser.nextToken() != JsonToken.END_OBJECT) { + + String fieldname = jParser.getCurrentName(); + + if ("age".equals(fieldname)) { + jParser.nextToken(); + parsedAge = jParser.getIntValue(); + return; + } + + } + jParser.close(); + + // then + assertNull(parsedName); + assertEquals(parsedAge, (Integer) 25); + assertTrue(addresses.isEmpty()); + + } +} diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/DeserializeToJavaCollectionUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/DeserializeToJavaCollectionUnitTest.java new file mode 100644 index 0000000000..bf340fbb74 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/DeserializeToJavaCollectionUnitTest.java @@ -0,0 +1,130 @@ +package com.ossez.jackson.tocollection; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.CollectionType; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class DeserializeToJavaCollectionUnitTest { + private ObjectMapper objectMapper; + private XmlMapper xmlMapper; + private List expectedBookList; + + + @BeforeEach + void setup() { + objectMapper = new ObjectMapper(); + xmlMapper = new XmlMapper(); + expectedBookList = Lists.newArrayList( + new Book(1, "A Song of Ice and Fire", "George R. R. Martin"), + new Book(2, "The Hitchhiker's Guide to the Galaxy", "Douglas Adams"), + new Book(3, "Hackers And Painters", "Paul Graham")); + } + + private String readFile(String path) { + try (Scanner scanner = new Scanner(getClass().getResourceAsStream(path), "UTF-8")) { + return scanner.useDelimiter("\\A").next(); + } + } + + /*==================== + * JSON tests + *==================== + */ + @Test + void givenJsonString_whenDeserializingToList_thenThrowingClassCastException() throws JsonProcessingException { + String jsonString = readFile("/to-java-collection/books.json"); + List bookList = objectMapper.readValue(jsonString, ArrayList.class); + assertThat(bookList).size().isEqualTo(3); + assertThatExceptionOfType(ClassCastException.class) + .isThrownBy(() -> bookList.get(0).getBookId()) + .withMessageMatching(".*java.util.LinkedHashMap cannot be cast to .*com.baeldung.jackson.tocollection.Book.*"); + } + + @Test + void givenJsonString_whenDeserializingWithTypeReference_thenGetExpectedList() throws JsonProcessingException { + String jsonString = readFile("/to-java-collection/books.json"); + List bookList = objectMapper.readValue(jsonString, new TypeReference>() {}); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } + + @Test + void givenJsonString_whenDeserializingWithJavaType_thenGetExpectedList() throws JsonProcessingException { + String jsonString = readFile("/to-java-collection/books.json"); + CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, Book.class); + List bookList = objectMapper.readValue(jsonString, listType); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } + + @Test + void givenJsonString_whenDeserializingWithConvertValueAndTypeReference_thenGetExpectedList() throws JsonProcessingException { + String jsonString = readFile("/to-java-collection/books.json"); + JsonNode jsonNode = objectMapper.readTree(jsonString); + List bookList = objectMapper.convertValue(jsonNode, new TypeReference>() {}); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } + + @Test + void givenJsonString_whenDeserializingWithConvertValueAndJavaType_thenGetExpectedList() throws JsonProcessingException { + String jsonString = readFile("/to-java-collection/books.json"); + JsonNode jsonNode = objectMapper.readTree(jsonString); + List bookList = objectMapper.convertValue(jsonNode, objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, Book.class)); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } + + /*==================== + * XML tests + *==================== + */ + @Test + void givenXml_whenDeserializingToList_thenThrowingClassCastException() throws JsonProcessingException { + String xml = readFile("/to-java-collection/books.xml"); + List bookList = xmlMapper.readValue(xml, ArrayList.class); + assertThat(bookList).size().isEqualTo(3); + assertThatExceptionOfType(ClassCastException.class) + .isThrownBy(() -> bookList.get(0).getBookId()) + .withMessageMatching(".*java.util.LinkedHashMap cannot be cast to .*com.baeldung.jackson.tocollection.Book.*"); + } + + @Test + void givenXml_whenDeserializingWithTypeReference_thenGetExpectedList() throws JsonProcessingException { + String xml = readFile("/to-java-collection/books.xml"); + List bookList = xmlMapper.readValue(xml, new TypeReference>() {}); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } + + @Test + void givenXml_whenDeserializingWithConvertValueAndTypeReference_thenGetExpectedList() throws JsonProcessingException { + String xml = readFile("/to-java-collection/books.xml"); + List node = xmlMapper.readValue(xml, List.class); + List bookList = xmlMapper.convertValue(node, new TypeReference>() {}); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } + + @Test + void givenXml_whenDeserializingWithConvertValueAndJavaType_thenGetExpectedList() throws JsonProcessingException { + String xml = readFile("/to-java-collection/books.xml"); + List node = xmlMapper.readValue(xml, List.class); + List bookList = xmlMapper.convertValue(node, objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, Book.class)); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } +} diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/JsonToCollectionUtilUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/JsonToCollectionUtilUnitTest.java new file mode 100644 index 0000000000..1cd14f3504 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/tocollection/JsonToCollectionUtilUnitTest.java @@ -0,0 +1,51 @@ +package com.ossez.jackson.tocollection; + +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.List; +import java.util.Scanner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class JsonToCollectionUtilUnitTest { + + private List expectedBookList; + + + @BeforeEach + void setup() { + expectedBookList = Lists.newArrayList( + new Book(1, "A Song of Ice and Fire", "George R. R. Martin"), + new Book(2, "The Hitchhiker's Guide to the Galaxy", "Douglas Adams"), + new Book(3, "Hackers And Painters", "Paul Graham")); + } + + private String readFile(String path) { + try (Scanner scanner = new Scanner(getClass().getResourceAsStream(path), "UTF-8")) { + return scanner.useDelimiter("\\A").next(); + } + } + + @Test + void givenJsonString_whenCalljsonArrayToList_thenGetExpectedList() throws IOException { + String jsonString = readFile("/to-java-collection/books.json"); + List bookList = JsonToCollectionUtil.jsonArrayToList(jsonString, Book.class); + assertThat(bookList.get(0)).isInstanceOf(Book.class); + assertThat(bookList).isEqualTo(expectedBookList); + } + + @Test + void givenJsonString_whenCalljsonArrayToList2_thenGetException() throws IOException { + String jsonString = readFile("/to-java-collection/books.json"); + List bookList = JsonToCollectionUtil.jsonArrayToList2(jsonString, Book.class); + assertThat(bookList).size().isEqualTo(3); + assertThatExceptionOfType(ClassCastException.class) + .isThrownBy(() -> bookList.get(0).getBookId()) + .withMessageMatching(".*java.util.LinkedHashMap cannot be cast to .*com.baeldung.jackson.tocollection.Book.*"); + } + +} diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/xmlToJson/XmlToJsonUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/xmlToJson/XmlToJsonUnitTest.java new file mode 100644 index 0000000000..170b1db71e --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/xmlToJson/XmlToJsonUnitTest.java @@ -0,0 +1,43 @@ +package com.ossez.jackson.xmlToJson; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.junit.Test; + +import static org.junit.Assert.*; + +import java.io.IOException; + +public class XmlToJsonUnitTest { + + @Test + public void givenAnXML_whenUseDataBidingToConvertToJSON_thenReturnDataOK() throws IOException{ + String flowerXML = "PoppyRED9"; + + XmlMapper xmlMapper = new XmlMapper(); + Flower poppy = xmlMapper.readValue(flowerXML, Flower.class); + + assertEquals(poppy.getName(), "Poppy"); + assertEquals(poppy.getColor(), Color.RED); + assertEquals(poppy.getPetals(), new Integer(9)); + + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(poppy); + + assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":9}"); + } + + @Test + public void givenAnXML_whenUseATreeConvertToJSON_thenReturnDataOK() throws IOException { + String flowerXML = "PoppyRED9"; + + XmlMapper xmlMapper = new XmlMapper(); + JsonNode node = xmlMapper.readTree(flowerXML.getBytes()); + + ObjectMapper jsonMapper = new ObjectMapper(); + String json = jsonMapper.writeValueAsString(node); + + assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":\"9\"}"); + } +} diff --git a/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/yaml/YamlUnitTest.java b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/yaml/YamlUnitTest.java new file mode 100644 index 0000000000..92a008d17e --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/java/com/ossez/jackson/yaml/YamlUnitTest.java @@ -0,0 +1,69 @@ +package com.ossez.jackson.yaml; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature; + +public class YamlUnitTest { + private ObjectMapper mapper; + private File orderOutput; + + @Before + public void setup() { + mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER)); + mapper.findAndRegisterModules(); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + orderOutput = new File("src/test/resources/yaml/orderOutput.yaml"); + } + + @After + public void cleanup() { + orderOutput.deleteOnExit(); + } + + @Test + public void givenYamlInput_ObjectCreated() throws JsonParseException, JsonMappingException, IOException { + Order order = mapper.readValue(new File("src/test/resources/yaml/orderInput.yaml"), Order.class); + assertEquals("A001", order.getOrderNo()); + assertEquals(LocalDate.parse("2019-04-17", DateTimeFormatter.ISO_DATE), order.getDate()); + assertEquals("Customer, Joe", order.getCustomerName()); + assertEquals(2, order.getOrderLines() + .size()); + } + + @Test + public void givenYamlObject_FileWritten() throws JsonGenerationException, JsonMappingException, IOException { + List lines = new ArrayList<>(); + lines.add(new OrderLine("Copper Wire (200ft)", 1, new BigDecimal(50.67).setScale(2, RoundingMode.HALF_UP))); + lines.add(new OrderLine("Washers (1/4\")", 24, new BigDecimal(.15).setScale(2, RoundingMode.HALF_UP))); + Order order = new Order( + "B-9910", + LocalDate.parse("2019-04-18", DateTimeFormatter.ISO_DATE), + "Customer, Jane", + lines); + mapper.writeValue(orderOutput, order); + + File outputYaml = new File(orderOutput.getAbsolutePath()); + assertTrue(outputYaml.exists()); + } +} diff --git a/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedCsvFromJson.csv b/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedCsvFromJson.csv new file mode 100644 index 0000000000..e15e12f2bf --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedCsvFromJson.csv @@ -0,0 +1,3 @@ +item,quantity,unitPrice +"No. 9 Sprockets",12,1.23 +"Widget (10mm)",4,3.45 diff --git a/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedFormattedCsvFromJson.csv b/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedFormattedCsvFromJson.csv new file mode 100644 index 0000000000..5a60ba602a --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedFormattedCsvFromJson.csv @@ -0,0 +1,3 @@ +count,name +12,"No. 9 Sprockets" +4,"Widget (10mm)" diff --git a/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedJsonFromCsv.json b/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedJsonFromCsv.json new file mode 100644 index 0000000000..64f18e1673 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/resources/csv/expectedJsonFromCsv.json @@ -0,0 +1,9 @@ +[ { + "item" : "No. 9 Sprockets", + "quantity" : 12, + "unitPrice" : 1.23 +}, { + "item" : "Widget (10mm)", + "quantity" : 4, + "unitPrice" : 3.45 +} ] \ No newline at end of file diff --git a/jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/embedded.json b/jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/embedded.json new file mode 100644 index 0000000000..e4f11f7f1f --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/embedded.json @@ -0,0 +1,8 @@ +{ + "name": "Pear yPhone 72", + "category": "cellphone", + "details": { + "displayAspectRatio": "97:3", + "audioConnector": "none" + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/flat.json b/jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/flat.json new file mode 100644 index 0000000000..799ea9339d --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/resources/deserialize-dynamic-object/flat.json @@ -0,0 +1,6 @@ +{ + "name": "Pear yPhone 72", + "category": "cellphone", + "displayAspectRatio": "97:3", + "audioConnector": "none" +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions-2/src/test/resources/yaml/orderInput.yaml b/jackson-modules/jackson-conversions-2/src/test/resources/yaml/orderInput.yaml new file mode 100644 index 0000000000..0aaa6186a2 --- /dev/null +++ b/jackson-modules/jackson-conversions-2/src/test/resources/yaml/orderInput.yaml @@ -0,0 +1,11 @@ +orderNo: A001 +date: 2019-04-17 +customerName: Customer, Joe +orderLines: + - item: No. 9 Sprockets + quantity: 12 + unitPrice: 1.23 + - item: Widget (10mm) + quantity: 4 + unitPrice: 3.45 + \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/README.md b/jackson-modules/jackson-conversions/README.md new file mode 100644 index 0000000000..438eaff052 --- /dev/null +++ b/jackson-modules/jackson-conversions/README.md @@ -0,0 +1,16 @@ +## Jackson Conversions + +This module contains articles about Jackson conversions. + +### Relevant Articles: +- [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array) +- [Jackson Date](https://www.baeldung.com/jackson-serialize-dates) +- [Jackson – Working with Maps and Nulls](https://www.baeldung.com/jackson-map-null-values-or-null-key) +- [Jackson – Decide What Fields Get Serialized/Deserialized](https://www.baeldung.com/jackson-field-serializable-deserializable-or-not) +- [XML Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-xml-serialization-and-deserialization) +- [Map Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-map) +- [How to Serialize and Deserialize Enums with Jackson](https://www.baeldung.com/jackson-serialize-enums) +- [使用 Jackson – 将字符串转换为 JsonNode 对象](https://www.ossez.com/t/jackson-jsonnode/13724) +- [Mapping Nested Values with Jackson](https://www.baeldung.com/jackson-nested-values) +- [Deserialize Immutable Objects with Jackson](https://www.baeldung.com/jackson-deserialize-immutable-objects) +- More articles: [[next -->]](../jackson-conversions-2) diff --git a/jackson-modules/jackson-conversions/pom.xml b/jackson-modules/jackson-conversions/pom.xml new file mode 100644 index 0000000000..f11e2b35fd --- /dev/null +++ b/jackson-modules/jackson-conversions/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + jackson-conversions + 0.0.1-SNAPSHOT + jackson-conversions + + + com.ossez + jackson-modules + 0.0.2-SNAPSHOT + + + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + + + jackson-conversions + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateDeserializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateDeserializer.java new file mode 100644 index 0000000000..6d0fe42cde --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateDeserializer.java @@ -0,0 +1,36 @@ +package com.ossez.jackson.date; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +public class CustomDateDeserializer extends StdDeserializer { + + private static final long serialVersionUID = -5451717385630622729L; + private SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); + + public CustomDateDeserializer() { + this(null); + } + + public CustomDateDeserializer(final Class vc) { + super(vc); + } + + @Override + public Date deserialize(final JsonParser jsonparser, final DeserializationContext context) throws IOException, JsonProcessingException { + final String date = jsonparser.getText(); + try { + return formatter.parse(date); + } catch (final ParseException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateSerializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateSerializer.java new file mode 100644 index 0000000000..db5d68c746 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateSerializer.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.date; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class CustomDateSerializer extends StdSerializer { + + private static final long serialVersionUID = -2894356342227378312L; + private SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); + + public CustomDateSerializer() { + this(null); + } + + public CustomDateSerializer(final Class t) { + super(t); + } + + @Override + public void serialize(final Date value, final JsonGenerator gen, final SerializerProvider arg2) throws IOException, JsonProcessingException { + gen.writeString(formatter.format(value)); + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateTimeSerializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateTimeSerializer.java new file mode 100644 index 0000000000..9d72a89292 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomDateTimeSerializer.java @@ -0,0 +1,32 @@ +package com.ossez.jackson.date; + +import java.io.IOException; + +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class CustomDateTimeSerializer extends StdSerializer { + + private static final long serialVersionUID = -3927232057990121460L; + + public CustomDateTimeSerializer() { + this(null); + } + + public CustomDateTimeSerializer(final Class t) { + super(t); + } + + private static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm"); + + @Override + public void serialize(final DateTime value, final JsonGenerator gen, final SerializerProvider arg2) throws IOException, JsonProcessingException { + gen.writeString(formatter.print(value)); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomLocalDateTimeSerializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomLocalDateTimeSerializer.java new file mode 100644 index 0000000000..e6fea554d3 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/CustomLocalDateTimeSerializer.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.date; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class CustomLocalDateTimeSerializer extends StdSerializer { + + private static final long serialVersionUID = -7449444168934819290L; + private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + + public CustomLocalDateTimeSerializer() { + this(null); + } + + public CustomLocalDateTimeSerializer(final Class t) { + super(t); + } + + @Override + public void serialize(final LocalDateTime value, final JsonGenerator gen, final SerializerProvider arg2) throws IOException, JsonProcessingException { + gen.writeString(formatter.format(value)); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/Event.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/Event.java new file mode 100644 index 0000000000..7762d5907b --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/Event.java @@ -0,0 +1,25 @@ +package com.ossez.jackson.date; + +import java.util.Date; + +public class Event { + public String name; + public Date eventDate; + + public Event() { + super(); + } + + public Event(final String name, final Date eventDate) { + this.name = name; + this.eventDate = eventDate; + } + + public Date getEventDate() { + return eventDate; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithFormat.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithFormat.java new file mode 100644 index 0000000000..fe73f551c7 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithFormat.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.date; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class EventWithFormat { + public String name; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss") + public Date eventDate; + + public EventWithFormat() { + super(); + } + + public EventWithFormat(final String name, final Date eventDate) { + this.name = name; + this.eventDate = eventDate; + } + + public Date getEventDate() { + return eventDate; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithJodaTime.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithJodaTime.java new file mode 100644 index 0000000000..b9e0a8672f --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithJodaTime.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.date; + +import org.joda.time.DateTime; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +public class EventWithJodaTime { + public String name; + + @JsonSerialize(using = CustomDateTimeSerializer.class) + public DateTime eventDate; + + public EventWithJodaTime() { + super(); + } + + public EventWithJodaTime(final String name, final DateTime eventDate) { + this.name = name; + this.eventDate = eventDate; + } + + public DateTime getEventDate() { + return eventDate; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDate.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDate.java new file mode 100644 index 0000000000..1562987b5b --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDate.java @@ -0,0 +1,33 @@ +package com.ossez.jackson.date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; + +import java.time.LocalDate; + +public class EventWithLocalDate { + public String name; + + @JsonDeserialize(using = LocalDateDeserializer.class) + @JsonSerialize(using = LocalDateSerializer.class) + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") + public LocalDate eventDate; + + public EventWithLocalDate() {} + + public EventWithLocalDate(final String name, final LocalDate eventDate) { + this.name = name; + this.eventDate = eventDate; + } + + public LocalDate getEventDate() { + return eventDate; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDateTime.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDateTime.java new file mode 100644 index 0000000000..f5d048fa93 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithLocalDateTime.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.date; + +import java.time.LocalDateTime; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +public class EventWithLocalDateTime { + public String name; + + @JsonSerialize(using = CustomLocalDateTimeSerializer.class) + public LocalDateTime eventDate; + + public EventWithLocalDateTime() { + super(); + } + + public EventWithLocalDateTime(final String name, final LocalDateTime eventDate) { + this.name = name; + this.eventDate = eventDate; + } + + public LocalDateTime getEventDate() { + return eventDate; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithSerializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithSerializer.java new file mode 100644 index 0000000000..595bcb8f76 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/date/EventWithSerializer.java @@ -0,0 +1,31 @@ +package com.ossez.jackson.date; + +import java.util.Date; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +public class EventWithSerializer { + public String name; + + @JsonDeserialize(using = CustomDateDeserializer.class) + @JsonSerialize(using = CustomDateSerializer.class) + public Date eventDate; + + public EventWithSerializer() { + super(); + } + + public EventWithSerializer(final String name, final Date eventDate) { + this.name = name; + this.eventDate = eventDate; + } + + public Date getEventDate() { + return eventDate; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/City.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/City.java new file mode 100644 index 0000000000..c86868de6e --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/City.java @@ -0,0 +1,15 @@ +package com.ossez.jackson.enums.deserialization; + +public class City { + + private Distance distance; + + public Distance getDistance() { + return distance; + } + + public void setDistance(Distance distance) { + this.distance = distance; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/Distance.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/Distance.java new file mode 100644 index 0000000000..96829dc3c9 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/Distance.java @@ -0,0 +1,31 @@ +package com.ossez.jackson.enums.deserialization; + +public enum Distance { + + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public void setMeters(double meters) { + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} + diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/City.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/City.java new file mode 100644 index 0000000000..42425f8c07 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/City.java @@ -0,0 +1,15 @@ +package com.ossez.jackson.enums.deserialization.customdeserializer; + +public class City { + + private Distance distance; + + public Distance getDistance() { + return distance; + } + + public void setDistance(Distance distance) { + this.distance = distance; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/CustomEnumDeserializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/CustomEnumDeserializer.java new file mode 100644 index 0000000000..bb26606741 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/CustomEnumDeserializer.java @@ -0,0 +1,42 @@ +package com.ossez.jackson.enums.deserialization.customdeserializer; + +import java.io.IOException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +public class CustomEnumDeserializer extends StdDeserializer { + + private static final long serialVersionUID = -1166032307856492833L; + + public CustomEnumDeserializer() { + this(null); + } + + public CustomEnumDeserializer(Class c) { + super(c); + } + + @Override + public Distance deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException { + + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + + String unit = node.get("unit").asText(); + double meters = node.get("meters").asDouble(); + + for (Distance distance : Distance.values()) { + + if (distance.getUnit().equals(unit) && + Double.compare(distance.getMeters(), meters) == 0) { + + return distance; + } + } + + return null; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/Distance.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/Distance.java new file mode 100644 index 0000000000..b6053f01d8 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/customdeserializer/Distance.java @@ -0,0 +1,33 @@ +package com.ossez.jackson.enums.deserialization.customdeserializer; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonDeserialize(using = CustomEnumDeserializer.class) +public enum Distance { + + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public void setMeters(double meters) { + this.meters = meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/City.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/City.java new file mode 100644 index 0000000000..734af4e548 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/City.java @@ -0,0 +1,15 @@ +package com.ossez.jackson.enums.deserialization.jsoncreator; + +public class City { + + private Distance distance; + + public Distance getDistance() { + return distance; + } + + public void setDistance(Distance distance) { + this.distance = distance; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/Distance.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/Distance.java new file mode 100644 index 0000000000..1c6bdfaad8 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsoncreator/Distance.java @@ -0,0 +1,48 @@ +package com.ossez.jackson.enums.deserialization.jsoncreator; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum Distance { + + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public void setMeters(double meters) { + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + @JsonCreator + public static Distance forValues(@JsonProperty("unit") String unit, @JsonProperty("meters") double meters) { + + for (Distance distance : Distance.values()) { + if (distance.unit.equals(unit) && Double.compare(distance.meters, meters) == 0) { + + return distance; + } + } + + return null; + + } +} + diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/City.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/City.java new file mode 100644 index 0000000000..8d3ce1b326 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/City.java @@ -0,0 +1,15 @@ +package com.ossez.jackson.enums.deserialization.jsonproperty; + +public class City { + + private Distance distance; + + public Distance getDistance() { + return distance; + } + + public void setDistance(Distance distance) { + this.distance = distance; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/Distance.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/Distance.java new file mode 100644 index 0000000000..656a3dceee --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonproperty/Distance.java @@ -0,0 +1,51 @@ +package com.ossez.jackson.enums.deserialization.jsonproperty; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum Distance { + + @JsonProperty("distance-in-km") + KILOMETER("km", 1000), + + @JsonProperty("distance-in-miles") + MILE("miles", 1609.34), + + @JsonProperty("distance-in-meters") + METER("meters", 1), + + @JsonProperty("distance-in-inches") + INCH("inches", 0.0254), + + @JsonProperty("distance-in-cm") + CENTIMETER("cm", 0.01), + + @JsonProperty("distance-in-mm") + MILLIMETER("mm", 0.001); + + private String unit; + private double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public void setMeters(double meters) { + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} + + diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/City.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/City.java new file mode 100644 index 0000000000..bfe7f3c6e9 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/City.java @@ -0,0 +1,15 @@ +package com.ossez.jackson.enums.deserialization.jsonvalue; + +public class City { + + private Distance distance; + + public Distance getDistance() { + return distance; + } + + public void setDistance(Distance distance) { + this.distance = distance; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/Distance.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/Distance.java new file mode 100644 index 0000000000..530ddf9047 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/deserialization/jsonvalue/Distance.java @@ -0,0 +1,35 @@ +package com.ossez.jackson.enums.deserialization.jsonvalue; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum Distance { + + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public void setMeters(double meters) { + this.meters = meters; + } + + @JsonValue + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} + diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/Distance.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/Distance.java new file mode 100644 index 0000000000..18ef758dfc --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/Distance.java @@ -0,0 +1,53 @@ +package com.ossez.jackson.enums.serialization; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +/** + * Use @JsonFormat to handle representation of Enum as JSON (available since Jackson 2.1.2) + * Use @JsonSerialize to configure a custom Jackson serializer + */ +// @JsonFormat(shape = JsonFormat.Shape.OBJECT) +@JsonSerialize(using = DistanceSerializer.class) +public enum Distance { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + /** + * Use @JsonValue to control marshalling output for an enum + */ + // @JsonValue + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + /** + * Usage example: Distance.MILE.convertFromMeters(1205.5); + */ + public double convertFromMeters(double distanceInMeters) { + return distanceInMeters / meters; + + } + + /** + * Usage example: Distance.MILE.convertToMeters(0.5); + */ + public double convertToMeters(double distanceInMeters) { + return distanceInMeters * meters; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/DistanceSerializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/DistanceSerializer.java new file mode 100644 index 0000000000..8fc9458daf --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/serialization/DistanceSerializer.java @@ -0,0 +1,32 @@ +package com.ossez.jackson.enums.serialization; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class DistanceSerializer extends StdSerializer { + + private static final long serialVersionUID = 1376504304439963619L; + + public DistanceSerializer() { + super(Distance.class); + } + + public DistanceSerializer(Class t) { + super(t); + } + + public void serialize(Distance distance, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException { + generator.writeStartObject(); + generator.writeFieldName("name"); + generator.writeString(distance.name()); + generator.writeFieldName("unit"); + generator.writeString(distance.getUnit()); + generator.writeFieldName("meters"); + generator.writeNumber(distance.getMeters()); + generator.writeEndObject(); + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumSimple.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumSimple.java new file mode 100644 index 0000000000..a282e9e35f --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumSimple.java @@ -0,0 +1,26 @@ +package com.ossez.jackson.enums.withEnum; + +public enum DistanceEnumSimple { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumSimple(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithJsonFormat.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithJsonFormat.java new file mode 100644 index 0000000000..c3d0050f31 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithJsonFormat.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.enums.withEnum; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum DistanceEnumWithJsonFormat { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumWithJsonFormat(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithValue.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithValue.java new file mode 100644 index 0000000000..a94cdde511 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/DistanceEnumWithValue.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.enums.withEnum; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum DistanceEnumWithValue { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumWithValue(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + @JsonValue + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumCustom.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumCustom.java new file mode 100644 index 0000000000..9895d03262 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumCustom.java @@ -0,0 +1,59 @@ +package com.ossez.jackson.enums.withEnum; + +import com.ossez.jackson.enums.serialization.Distance; + +public class MyDtoWithEnumCustom { + + private String stringValue; + private int intValue; + private boolean booleanValue; + private Distance type; + + public MyDtoWithEnumCustom() { + super(); + } + + public MyDtoWithEnumCustom(final String stringValue, final int intValue, final boolean booleanValue, final Distance type) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + this.type = type; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public Distance getType() { + return type; + } + + public void setType(final Distance type) { + this.type = type; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumJsonFormat.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumJsonFormat.java new file mode 100644 index 0000000000..c58b20b87d --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/enums/withEnum/MyDtoWithEnumJsonFormat.java @@ -0,0 +1,57 @@ +package com.ossez.jackson.enums.withEnum; + +public class MyDtoWithEnumJsonFormat { + + private String stringValue; + private int intValue; + private boolean booleanValue; + private DistanceEnumWithJsonFormat distanceType; + + public MyDtoWithEnumJsonFormat() { + super(); + } + + public MyDtoWithEnumJsonFormat(final String stringValue, final int intValue, final boolean booleanValue, final DistanceEnumWithJsonFormat type) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + this.distanceType = type; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public DistanceEnumWithJsonFormat getDistanceType() { + return distanceType; + } + + public void setDistanceType(final DistanceEnumWithJsonFormat type) { + this.distanceType = type; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDto.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDto.java new file mode 100644 index 0000000000..a4583c8b44 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDto.java @@ -0,0 +1,47 @@ +package com.ossez.jackson.field; + +public class MyDto { + + private String stringValue; + private int intValue; + private boolean booleanValue; + + public MyDto() { + super(); + } + + public MyDto(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean getBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoAccessLevel.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoAccessLevel.java new file mode 100644 index 0000000000..7c0604990f --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoAccessLevel.java @@ -0,0 +1,23 @@ +package com.ossez.jackson.field; + +public class MyDtoAccessLevel { + + private String stringValue; + int intValue; + protected float floatValue; + public boolean booleanValue; + + public MyDtoAccessLevel() { + super(); + } + + public MyDtoAccessLevel(final String stringValue, final int intValue, final float floatValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.floatValue = floatValue; + this.booleanValue = booleanValue; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithGetter.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithGetter.java new file mode 100644 index 0000000000..7d60251959 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithGetter.java @@ -0,0 +1,25 @@ +package com.ossez.jackson.field; + +public class MyDtoWithGetter { + + private String stringValue; + private int intValue; + + public MyDtoWithGetter() { + super(); + } + + public MyDtoWithGetter(final String stringValue, final int intValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + } + + // API + + public String getStringValue() { + return stringValue; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithSetter.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithSetter.java new file mode 100644 index 0000000000..f32c5d2151 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/field/MyDtoWithSetter.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.field; + +public class MyDtoWithSetter { + + private int intValue; + public boolean booleanValue; + + public MyDtoWithSetter() { + super(); + } + + public MyDtoWithSetter(final int intValue, final boolean booleanValue) { + super(); + + this.intValue = intValue; + this.booleanValue = booleanValue; + } + + // API + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public int accessIntValue() { + return intValue; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Employee.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Employee.java new file mode 100644 index 0000000000..46f44161cd --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Employee.java @@ -0,0 +1,24 @@ +package com.ossez.jackson.immutable; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Employee { + + private final long id; + private final String name; + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + public Employee(@JsonProperty("id") long id, @JsonProperty("name") String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Person.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Person.java new file mode 100644 index 0000000000..9df9f8c808 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/immutable/Person.java @@ -0,0 +1,44 @@ +package com.ossez.jackson.immutable; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + +@JsonDeserialize(builder = Person.Builder.class) +public class Person { + + private final String name; + private final Integer age; + + private Person(String name, Integer age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public Integer getAge() { + return age; + } + + @JsonPOJOBuilder + static class Builder { + String name; + Integer age; + + Builder withName(String name) { + this.name = name; + return this; + } + + Builder withAge(Integer age) { + this.age = age; + return this; + } + + Person build() { + return new Person(name, age); + } + } +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/ClassWithAMap.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/ClassWithAMap.java new file mode 100644 index 0000000000..09a9818630 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/ClassWithAMap.java @@ -0,0 +1,23 @@ +package com.ossez.jackson.map; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +public class ClassWithAMap { + + @JsonProperty("map") + @JsonDeserialize(keyUsing = MyPairDeserializer.class) + private final Map map; + + @JsonCreator + public ClassWithAMap(Map map) { + this.map = map; + } + + public Map getMap() { + return map; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPair.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPair.java new file mode 100644 index 0000000000..4578aea4f2 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPair.java @@ -0,0 +1,80 @@ +package com.ossez.jackson.map; + +import com.fasterxml.jackson.annotation.JsonValue; + +public class MyPair { + + private String first; + private String second; + + public MyPair(String first, String second) { + this.first = first; + this.second = second; + } + + public MyPair(String both) { + String[] pairs = both.split("and"); + this.first = pairs[0].trim(); + this.second = pairs[1].trim(); + } + + @Override + @JsonValue + public String toString() { + return first + " and " + second; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((first == null) ? 0 : first.hashCode()); + result = prime * result + ((second == null) ? 0 : second.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof MyPair)) { + return false; + } + MyPair other = (MyPair) obj; + if (first == null) { + if (other.first != null) { + return false; + } + } else if (!first.equals(other.first)) { + return false; + } + if (second == null) { + if (other.second != null) { + return false; + } + } else if (!second.equals(other.second)) { + return false; + } + return true; + } + + public String getFirst() { + return first; + } + + public void setFirst(String first) { + this.first = first; + } + + public String getSecond() { + return second; + } + + public void setSecond(String second) { + this.second = second; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairDeserializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairDeserializer.java new file mode 100644 index 0000000000..5feb836b11 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairDeserializer.java @@ -0,0 +1,16 @@ +package com.ossez.jackson.map; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.KeyDeserializer; + +public class MyPairDeserializer extends KeyDeserializer { + + @Override + public MyPair deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException { + + return new MyPair(key); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairSerializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairSerializer.java new file mode 100644 index 0000000000..4fe480ff0d --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/map/MyPairSerializer.java @@ -0,0 +1,22 @@ +package com.ossez.jackson.map; + +import java.io.IOException; +import java.io.StringWriter; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; + +public class MyPairSerializer extends JsonSerializer { + + private final ObjectMapper mapper = new ObjectMapper(); + + @Override + public void serialize(MyPair value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { + StringWriter writer = new StringWriter(); + mapper.writeValue(writer, value); + gen.writeFieldName(writer.toString()); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDto.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDto.java new file mode 100644 index 0000000000..202c4c9aea --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDto.java @@ -0,0 +1,54 @@ +package com.ossez.jackson.mapnull; + +public class MyDto { + + private String stringValue; + private int intValue; + private boolean booleanValue; + + public MyDto() { + super(); + } + + public MyDto(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + // + + @Override + public String toString() { + return "MyDto [stringValue=" + stringValue + ", intValue=" + intValue + ", booleanValue=" + booleanValue + "]"; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDtoNullKeySerializer.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDtoNullKeySerializer.java new file mode 100644 index 0000000000..299ef45305 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/mapnull/MyDtoNullKeySerializer.java @@ -0,0 +1,27 @@ +package com.ossez.jackson.mapnull; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class MyDtoNullKeySerializer extends StdSerializer { + + private static final long serialVersionUID = -4478531309177369056L; + + public MyDtoNullKeySerializer() { + this(null); + } + + public MyDtoNullKeySerializer(final Class t) { + super(t); + } + + @Override + public void serialize(final Object value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException { + jgen.writeFieldName(""); + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/tocollection/MyDto.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/tocollection/MyDto.java new file mode 100644 index 0000000000..9b005299f0 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/tocollection/MyDto.java @@ -0,0 +1,54 @@ +package com.ossez.jackson.tocollection; + +public class MyDto { + + private String stringValue; + private int intValue; + private boolean booleanValue; + + public MyDto() { + super(); + } + + public MyDto(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + // + + @Override + public String toString() { + return "MyDto [stringValue=" + stringValue + ", intValue=" + intValue + ", booleanValue=" + booleanValue + "]"; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Address.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Address.java new file mode 100644 index 0000000000..fcf78d025b --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Address.java @@ -0,0 +1,33 @@ +package com.ossez.jackson.xml; + +public class Address { + + String streetNumber; + String streetName; + String city; + + public String getStreetNumber() { + return streetNumber; + } + + public void setStreetNumber(String streetNumber) { + this.streetNumber = streetNumber; + } + + public String getStreetName() { + return streetName; + } + + public void setStreetName(String streetName) { + this.streetName = streetName; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + +} diff --git a/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Person.java b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Person.java new file mode 100644 index 0000000000..08ea503ccc --- /dev/null +++ b/jackson-modules/jackson-conversions/src/main/java/com/ossez/jackson/xml/Person.java @@ -0,0 +1,47 @@ +package com.ossez.jackson.xml; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; + +import java.util.ArrayList; +import java.util.List; + +@JacksonXmlRootElement(localName = "person") +public final class Person { + private String firstName; + private String lastName; + private List phoneNumbers = new ArrayList<>(); + private List
address = new ArrayList<>(); + + public List
getAddress() { + return address; + } + + public void setAddress(List
address) { + this.address = address; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getPhoneNumbers() { + return phoneNumbers; + } + + public void setPhoneNumbers(List phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/date/JacksonDateUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/date/JacksonDateUnitTest.java new file mode 100644 index 0000000000..1171c9e432 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/date/JacksonDateUnitTest.java @@ -0,0 +1,212 @@ +package com.ossez.jackson.date; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.TimeZone; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.StdDateFormat; +import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +public class JacksonDateUnitTest { + + @Test + public void whenSerializingDateWithJackson_thenSerializedToTimestamp() throws JsonProcessingException, ParseException { + final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + final String toParse = "01-01-1970 01:00"; + final Date date = df.parse(toParse); + final Event event = new Event("party", date); + + final ObjectMapper mapper = new ObjectMapper(); + final String result = mapper.writeValueAsString(event); + assertThat(result, containsString("3600000")); + } + + @Test + public void whenSerializingDateToISO8601_thenSerializedToText() throws JsonProcessingException, ParseException { + final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + final String toParse = "01-01-1970 02:30"; + final Date date = df.parse(toParse); + final Event event = new Event("party", date); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + + // StdDateFormat is ISO8601 since jackson 2.9 + mapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true)); + + final String result = mapper.writeValueAsString(event); + assertThat(result, containsString("1970-01-01T02:30:00.000+00:00")); + } + + @Test + public void whenDeserialisingZonedDateTimeWithDefaults_thenNotCorrect() + throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + ZonedDateTime now = ZonedDateTime.now(ZoneId.of("UTC")); + String converted = objectMapper.writeValueAsString(now); + + ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class); + System.out.println("serialized: " + now); + System.out.println("restored: " + restored); + assertThat(now, is(restored)); + } + + @Test + public void whenSettingObjectMapperDateFormat_thenCorrect() throws JsonProcessingException, ParseException { + final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm"); + + final String toParse = "20-12-2014 02:30"; + final Date date = df.parse(toParse); + final Event event = new Event("party", date); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.setDateFormat(df); + + final String result = mapper.writeValueAsString(event); + assertThat(result, containsString(toParse)); + } + + @Test + public void whenUsingJsonFormatAnnotationToFormatDate_thenCorrect() throws JsonProcessingException, ParseException { + final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + final String toParse = "20-12-2014 02:30:00"; + final Date date = df.parse(toParse); + final EventWithFormat event = new EventWithFormat("party", date); + + final ObjectMapper mapper = new ObjectMapper(); + final String result = mapper.writeValueAsString(event); + assertThat(result, containsString(toParse)); + } + + @Test + public void whenUsingCustomDateSerializer_thenCorrect() throws JsonProcessingException, ParseException { + final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); + + final String toParse = "20-12-2014 02:30:00"; + final Date date = df.parse(toParse); + final EventWithSerializer event = new EventWithSerializer("party", date); + + final ObjectMapper mapper = new ObjectMapper(); + final String result = mapper.writeValueAsString(event); + assertThat(result, containsString(toParse)); + } + + @Test + public void whenSerializingJodaTimeWithJackson_thenCorrect() throws JsonProcessingException { + final DateTime date = new DateTime(2014, 12, 20, 2, 30); + final EventWithJodaTime event = new EventWithJodaTime("party", date); + + final ObjectMapper mapper = new ObjectMapper(); + final String result = mapper.writeValueAsString(event); + assertThat(result, containsString("2014-12-20 02:30")); + } + + @Test + public void whenSerializingJava8DateWithCustomSerializer_thenCorrect() throws JsonProcessingException { + final LocalDateTime date = LocalDateTime.of(2014, 12, 20, 2, 30); + final EventWithLocalDateTime event = new EventWithLocalDateTime("party", date); + + final ObjectMapper mapper = new ObjectMapper(); + final String result = mapper.writeValueAsString(event); + assertThat(result, containsString("2014-12-20 02:30")); + } + + @Test + public void whenDeserializingDateWithJackson_thenCorrect() throws IOException { + final String json = "{\"name\":\"party\",\"eventDate\":\"20-12-2014 02:30:00\"}"; + + final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); + final ObjectMapper mapper = new ObjectMapper(); + mapper.setDateFormat(df); + + final Event event = mapper.readerFor(Event.class) + .readValue(json); + assertEquals("20-12-2014 02:30:00", df.format(event.eventDate)); + } + + @Test + public void whenDeserializingDateUsingCustomDeserializer_thenCorrect() throws IOException { + final String json = "{\"name\":\"party\",\"eventDate\":\"20-12-2014 02:30:00\"}"; + + final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); + final ObjectMapper mapper = new ObjectMapper(); + + final EventWithSerializer event = mapper.readerFor(EventWithSerializer.class) + .readValue(json); + assertEquals("20-12-2014 02:30:00", df.format(event.eventDate)); + } + + @Test + public void whenSerializingJava8Date_thenCorrect() throws JsonProcessingException { + final LocalDateTime date = LocalDateTime.of(2014, 12, 20, 2, 30); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + + final String result = mapper.writeValueAsString(date); + assertThat(result, containsString("2014-12-20T02:30")); + } + + @Test + public void whenSerializingJava8DateAndReadingValue_thenCorrect() throws IOException { + String stringDate = "\"2014-12-20\""; + + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + + LocalDate result = mapper.readValue(stringDate, LocalDate.class); + assertThat(result.toString(), containsString("2014-12-20")); + } + + @Test + public void whenSerializingJava8DateAndReadingFromEntity_thenCorrect() throws IOException { + String json = "{\"name\":\"party\",\"eventDate\":\"20-12-2014\"}"; + + ObjectMapper mapper = new ObjectMapper(); + + EventWithLocalDate result = mapper.readValue(json, EventWithLocalDate.class); + assertThat(result.getEventDate().toString(), containsString("2014-12-20")); + } + + @Test + public void whenSerializingJodaTime_thenCorrect() throws JsonProcessingException { + final DateTime date = new DateTime(2014, 12, 20, 2, 30, DateTimeZone.forID("Europe/London")); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JodaModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + + final String result = mapper.writeValueAsString(date); + assertThat(result, containsString("2014-12-20T02:30:00.000Z")); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java new file mode 100644 index 0000000000..12596336cc --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java @@ -0,0 +1,20 @@ +package com.ossez.jackson.enums.deserialization; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.io.IOException; + +import org.junit.Test; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DefaultEnumDeserializationUnitTest { + + @Test + public void givenEnum_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + String json = "{\"distance\":\"KILOMETER\"}"; + City city = new ObjectMapper().readValue(json, City.class); + + assertEquals(Distance.KILOMETER, city.getDistance()); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/customdeserializer/EnumCustomDeserializationUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/customdeserializer/EnumCustomDeserializationUnitTest.java new file mode 100644 index 0000000000..f3f561e021 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/customdeserializer/EnumCustomDeserializationUnitTest.java @@ -0,0 +1,19 @@ +package com.ossez.jackson.enums.deserialization.customdeserializer; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.io.IOException; + +import org.junit.Test; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class EnumCustomDeserializationUnitTest { + + @Test + public void givenEnumWithCustomDeserializer_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + String json = "{\"distance\": {\"unit\":\"miles\",\"meters\":1609.34}}"; + + City city = new ObjectMapper().readValue(json, City.class); + assertEquals(Distance.MILE, city.getDistance()); + } +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java new file mode 100644 index 0000000000..239e36b261 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java @@ -0,0 +1,20 @@ +package com.ossez.jackson.enums.deserialization.jsoncreator; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.io.IOException; + +import org.junit.Test; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class EnumDeserializationUsingJsonCreatorUnitTest { + + @Test + public void givenEnumWithJsonCreator_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + String json = "{\"distance\": {\"unit\":\"miles\",\"meters\":1609.34}}"; + + City city = new ObjectMapper().readValue(json, City.class); + assertEquals(Distance.MILE, city.getDistance()); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java new file mode 100644 index 0000000000..883e1d7d57 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java @@ -0,0 +1,21 @@ +package com.ossez.jackson.enums.deserialization.jsonproperty; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.io.IOException; + +import org.junit.Test; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class EnumDeserializationUsingJsonPropertyUnitTest { + + @Test + public void givenEnumWithJsonProperty_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + String json = "{\"distance\": \"distance-in-km\"}"; + + City city = new ObjectMapper().readValue(json, City.class); + assertEquals(Distance.KILOMETER, city.getDistance()); + + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java new file mode 100644 index 0000000000..1b38340684 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/deserialization/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java @@ -0,0 +1,20 @@ +package com.ossez.jackson.enums.deserialization.jsonvalue; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.io.IOException; + +import org.junit.Test; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class EnumDeserializationUsingJsonValueUnitTest { + + @Test + public void givenEnumWithJsonValue_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + String json = "{\"distance\": \"0.0254\"}"; + + City city = new ObjectMapper().readValue(json, City.class); + assertEquals(Distance.INCH, city.getDistance()); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonEnumSerializationUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonEnumSerializationUnitTest.java new file mode 100644 index 0000000000..f3f0440a92 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonEnumSerializationUnitTest.java @@ -0,0 +1,20 @@ +package com.ossez.jackson.enums.serialization; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThat; +import java.io.IOException; + +import org.junit.Test; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonEnumSerializationUnitTest { + + @Test + public final void givenEnum_whenSerializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + final String dtoAsString = new ObjectMapper().writeValueAsString(Distance.MILE); + + assertThat(dtoAsString, containsString("1609.34")); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonSerializationEnumsUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonSerializationEnumsUnitTest.java new file mode 100644 index 0000000000..fc9064c3c1 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/enums/serialization/JacksonSerializationEnumsUnitTest.java @@ -0,0 +1,77 @@ +package com.ossez.jackson.enums.serialization; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.io.IOException; + +import org.junit.Test; + +import com.ossez.jackson.enums.withEnum.DistanceEnumSimple; +import com.ossez.jackson.enums.withEnum.DistanceEnumWithJsonFormat; +import com.ossez.jackson.enums.withEnum.DistanceEnumWithValue; +import com.ossez.jackson.enums.withEnum.MyDtoWithEnumCustom; +import com.ossez.jackson.enums.withEnum.MyDtoWithEnumJsonFormat; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonSerializationEnumsUnitTest { + + // tests - simple enum + + @Test + public final void whenSerializingASimpleEnum_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final String enumAsString = mapper.writeValueAsString(DistanceEnumSimple.MILE); + + assertThat(enumAsString, containsString("MILE")); + } + + // tests - enum with main value + + @Test + public final void whenSerializingAEnumWithValue_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final String enumAsString = mapper.writeValueAsString(DistanceEnumWithValue.MILE); + + assertThat(enumAsString, is("1609.34")); + } + + // tests - enum + + @Test + public final void whenSerializingAnEnum_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final String enumAsString = mapper.writeValueAsString(DistanceEnumWithJsonFormat.MILE); + + assertThat(enumAsString, containsString("\"meters\":1609.34")); + } + + @Test + public final void whenSerializingEntityWithEnum_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumJsonFormat("a", 1, true, DistanceEnumWithJsonFormat.MILE)); + + assertThat(enumAsString, containsString("\"meters\":1609.34")); + } + + @Test + public final void whenSerializingArrayOfEnums_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final String json = mapper.writeValueAsString(new DistanceEnumWithJsonFormat[] { DistanceEnumWithJsonFormat.MILE, DistanceEnumWithJsonFormat.KILOMETER }); + + assertThat(json, containsString("\"meters\":1609.34")); + } + + // tests - enum with custom serializer + + @Test + public final void givenCustomSerializer_whenSerializingEntityWithEnum_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumCustom("a", 1, true, Distance.MILE)); + + assertThat(enumAsString, containsString("\"meters\":1609.34")); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/field/JacksonFieldUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/field/JacksonFieldUnitTest.java new file mode 100644 index 0000000000..d3054aa483 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/field/JacksonFieldUnitTest.java @@ -0,0 +1,92 @@ +package com.ossez.jackson.field; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import org.junit.Test; + +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonFieldUnitTest { + + @Test + public final void givenDifferentAccessLevels_whenPublic_thenSerializable() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + + final MyDtoAccessLevel dtoObject = new MyDtoAccessLevel(); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + assertThat(dtoAsString, not(containsString("stringValue"))); + assertThat(dtoAsString, not(containsString("intValue"))); + assertThat(dtoAsString, not(containsString("floatValue"))); + assertThat(dtoAsString, containsString("booleanValue")); + System.out.println(dtoAsString); + } + + @Test + public final void givenDifferentAccessLevels_whenGetterAdded_thenSerializable() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + + final MyDtoWithGetter dtoObject = new MyDtoWithGetter(); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + assertThat(dtoAsString, containsString("stringValue")); + assertThat(dtoAsString, not(containsString("intValue"))); + System.out.println(dtoAsString); + } + + @Test + public final void givenDifferentAccessLevels_whenGetterAdded_thenDeserializable() throws IOException { + final String jsonAsString = "{\"stringValue\":\"dtoString\"}"; + final ObjectMapper mapper = new ObjectMapper(); + + final MyDtoWithGetter dtoObject = mapper.readValue(jsonAsString, MyDtoWithGetter.class); + + assertNotNull(dtoObject); + assertThat(dtoObject.getStringValue(), equalTo("dtoString")); + } + + @Test + public final void givenDifferentAccessLevels_whenSetterAdded_thenDeserializable() throws IOException { + final String jsonAsString = "{\"intValue\":1}"; + final ObjectMapper mapper = new ObjectMapper(); + + final MyDtoWithSetter dtoObject = mapper.readValue(jsonAsString, MyDtoWithSetter.class); + + assertNotNull(dtoObject); + assertThat(dtoObject.accessIntValue(), equalTo(1)); + } + + @Test + public final void givenDifferentAccessLevels_whenSetterAdded_thenStillNotSerializable() throws IOException { + final ObjectMapper mapper = new ObjectMapper(); + + final MyDtoWithSetter dtoObject = new MyDtoWithSetter(); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + assertThat(dtoAsString, not(containsString("intValue"))); + System.out.println(dtoAsString); + } + + @Test + public final void givenDifferentAccessLevels_whenSetVisibility_thenSerializable() throws IOException { + final ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + + final MyDtoAccessLevel dtoObject = new MyDtoAccessLevel(); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + assertThat(dtoAsString, containsString("stringValue")); + assertThat(dtoAsString, containsString("intValue")); + assertThat(dtoAsString, containsString("booleanValue")); + System.out.println(dtoAsString); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/immutable/ImmutableObjectDeserializationUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/immutable/ImmutableObjectDeserializationUnitTest.java new file mode 100644 index 0000000000..de21167fb0 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/immutable/ImmutableObjectDeserializationUnitTest.java @@ -0,0 +1,38 @@ +package com.ossez.jackson.immutable; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.*; + +public class ImmutableObjectDeserializationUnitTest { + + @Test + public void whenPublicConstructorIsUsed_thenObjectIsDeserialized() throws IOException { + final String json = "{\"name\":\"Frank\",\"id\":5000}"; + Employee employee = new ObjectMapper().readValue(json, Employee.class); + + assertEquals("Frank", employee.getName()); + assertEquals(5000, employee.getId()); + } + + @Test + public void whenBuilderIsUsedAndFieldIsNull_thenObjectIsDeserialized() throws IOException { + final String json = "{\"name\":\"Frank\"}"; + Person person = new ObjectMapper().readValue(json, Person.class); + + assertEquals("Frank", person.getName()); + assertNull(person.getAge()); + } + + @Test + public void whenBuilderIsUsedAndAllFieldsPresent_thenObjectIsDeserialized() throws IOException { + final String json = "{\"name\":\"Frank\",\"age\":50}"; + Person person = new ObjectMapper().readValue(json, Person.class); + + assertEquals("Frank", person.getName()); + assertEquals(50, (int) person.getAge()); + } +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapDeserializeUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapDeserializeUnitTest.java new file mode 100644 index 0000000000..dd3db4703d --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapDeserializeUnitTest.java @@ -0,0 +1,62 @@ +package com.ossez.jackson.map; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonMapDeserializeUnitTest { + + private Map map; + private Map cmap; + final ObjectMapper mapper = new ObjectMapper(); + + @Test + public void whenSimpleMapDeserialize_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + + final String jsonInput = "{\"key\": \"value\"}"; + TypeReference> typeRef = new TypeReference>() { + }; + + final Map map = mapper.readValue(jsonInput, typeRef); + + Assert.assertEquals("value", map.get("key")); + } + + @Test + public void whenObjectStringMapDeserialize_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + + final String jsonInput = "{\"Abbott and Costello\":\"Comedy\"}"; + + TypeReference> typeRef = new TypeReference>() { + }; + + map = mapper.readValue(jsonInput, typeRef); + + Assert.assertEquals("Comedy", map.get(new MyPair("Abbott", "Costello"))); + + ClassWithAMap classWithMap = mapper.readValue(jsonInput, ClassWithAMap.class); + + Assert.assertEquals("Comedy", classWithMap.getMap() + .get(new MyPair("Abbott", "Costello"))); + } + + @Test + public void whenObjectObjectMapDeserialize_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + + final String jsonInput = "{\"Abbott and Costello\" : \"Comedy and 1940s\"}"; + TypeReference> typeRef = new TypeReference>() { + }; + + cmap = mapper.readValue(jsonInput, typeRef); + + Assert.assertEquals(new MyPair("Comedy", "1940s"), cmap.get(new MyPair("Abbott", "Costello"))); + } +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapSerializeUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapSerializeUnitTest.java new file mode 100644 index 0000000000..af8bcfb083 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/map/JacksonMapSerializeUnitTest.java @@ -0,0 +1,65 @@ +package com.ossez.jackson.map; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.MapSerializer; + +public class JacksonMapSerializeUnitTest { + + @JsonSerialize(keyUsing = MyPairSerializer.class) + private Map map; + + @JsonSerialize(keyUsing = MapSerializer.class) + private Map cmap; + + @JsonSerialize(keyUsing = MyPairSerializer.class) + private MyPair mapKey; + + @JsonSerialize(keyUsing = MyPairSerializer.class) + private MyPair mapValue; + + final ObjectMapper mapper = new ObjectMapper(); + + @Test + public void whenSimpleMapSerialize_thenCorrect() throws JsonProcessingException { + + Map map = new HashMap<>(); + map.put("key", "value"); + + final String jsonResult = mapper.writeValueAsString(map); + + Assert.assertEquals("{\"key\":\"value\"}", jsonResult); + } + + @Test + public void whenCustomObjectStringMapSerialize_thenCorrect() throws JsonProcessingException { + + map = new HashMap<>(); + MyPair key = new MyPair("Abbott", "Costello"); + map.put(key, "Comedy"); + + final String jsonResult = mapper.writeValueAsString(map); + + Assert.assertEquals("{\"Abbott and Costello\":\"Comedy\"}", jsonResult); + } + + @Test + public void whenCustomObjectObjectMapSerialize_thenCorrect() throws JsonProcessingException { + + cmap = new HashMap<>(); + mapKey = new MyPair("Abbott", "Costello"); + mapValue = new MyPair("Comedy", "1940's"); + cmap.put(mapKey, mapValue); + + final String jsonResult = mapper.writeValueAsString(cmap); + + Assert.assertEquals("{\"Abbott and Costello\":\"Comedy and 1940's\"}", jsonResult); + } +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/mapnull/JacksonMapNullUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/mapnull/JacksonMapNullUnitTest.java new file mode 100644 index 0000000000..3d65b2397b --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/mapnull/JacksonMapNullUnitTest.java @@ -0,0 +1,99 @@ +package com.ossez.jackson.mapnull; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + +public class JacksonMapNullUnitTest { + + @Test + public final void givenIgnoringMapNullValue_whenWritingMapObjectWithNullValue_thenIgnored() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + // mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); + mapper.setSerializationInclusion(Include.NON_NULL); + + final MyDto dtoObject1 = new MyDto(); + + final Map dtoMap = new HashMap(); + dtoMap.put("dtoObject1", dtoObject1); + dtoMap.put("dtoObject2", null); + + final String dtoMapAsString = mapper.writeValueAsString(dtoMap); + + assertThat(dtoMapAsString, containsString("dtoObject1")); + assertThat(dtoMapAsString, not(containsString("dtoObject2"))); + System.out.println(dtoMapAsString); + } + + @Test + public final void givenIgnoringMapValueObjectWithNullField_whenWritingMapValueObjectWithNullField_thenIgnored() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + + final MyDto dtoObject = new MyDto(); + + final Map dtoMap = new HashMap(); + dtoMap.put("dtoObject", dtoObject); + + final String dtoMapAsString = mapper.writeValueAsString(dtoMap); + + assertThat(dtoMapAsString, containsString("dtoObject")); + assertThat(dtoMapAsString, not(containsString("stringValue"))); + System.out.println(dtoMapAsString); + } + + @Test + public final void givenAllowingMapObjectWithNullKey_whenWriting_thenCorrect() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + mapper.getSerializerProvider() + .setNullKeySerializer(new MyDtoNullKeySerializer()); + + final MyDto dtoObject1 = new MyDto(); + dtoObject1.setStringValue("dtoObjectString1"); + final MyDto dtoObject2 = new MyDto(); + dtoObject2.setStringValue("dtoObjectString2"); + + final Map dtoMap = new HashMap(); + dtoMap.put(null, dtoObject1); + dtoMap.put("obj2", dtoObject2); + + final String dtoMapAsString = mapper.writeValueAsString(dtoMap); + + System.out.println(dtoMapAsString); + assertThat(dtoMapAsString, containsString("\"\"")); + assertThat(dtoMapAsString, containsString("dtoObjectString1")); + assertThat(dtoMapAsString, containsString("obj2")); + } + + @Test + public final void givenAllowingMapObjectOneNullKey_whenWritingMapObjectWithTwoNullKeys_thenOverride() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + mapper.getSerializerProvider() + .setNullKeySerializer(new MyDtoNullKeySerializer()); + + final MyDto dtoObject1 = new MyDto(); + dtoObject1.setStringValue("dtoObject1String"); + + final MyDto dtoObject2 = new MyDto(); + dtoObject2.setStringValue("dtoObject2String"); + + final Map dtoMap = new HashMap(); + dtoMap.put(null, dtoObject1); + dtoMap.put(null, dtoObject2); + + final String dtoMapAsString = mapper.writeValueAsString(dtoMap); + + assertThat(dtoMapAsString, not(containsString("dtoObject1String"))); + assertThat(dtoMapAsString, containsString("dtoObject2String")); + System.out.println(dtoMapAsString); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/DeserializeWithNestedPropertiesUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/DeserializeWithNestedPropertiesUnitTest.java new file mode 100644 index 0000000000..e6b6e0b8d7 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/DeserializeWithNestedPropertiesUnitTest.java @@ -0,0 +1,70 @@ +package com.ossez.jackson.nested; + +import static org.junit.Assert.*; + +import java.io.IOException; + +import org.junit.Test; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +public class DeserializeWithNestedPropertiesUnitTest { + + private String SOURCE_JSON = "{\"id\":\"957c43f2-fa2e-42f9-bf75-6e3d5bb6960a\",\"name\":\"The Best Product\",\"brand\":{\"id\":\"9bcd817d-0141-42e6-8f04-e5aaab0980b6\",\"name\":\"ACME Products\",\"owner\":{\"id\":\"b21a80b1-0c09-4be3-9ebd-ea3653511c13\",\"name\":\"Ultimate Corp, Inc.\"}}}"; + + @Test + public void whenUsingAnnotations_thenOk() throws IOException { + Product product = new ObjectMapper().readerFor(Product.class) + .readValue(SOURCE_JSON); + + assertEquals(product.getName(), "The Best Product"); + assertEquals(product.getBrandName(), "ACME Products"); + assertEquals(product.getOwnerName(), "Ultimate Corp, Inc."); + } + + @Test + public void whenUsingJsonNode_thenOk() throws IOException { + JsonNode productNode = new ObjectMapper().readTree(SOURCE_JSON); + + Product product = new Product(); + product.setId(productNode.get("id") + .textValue()); + product.setName(productNode.get("name") + .textValue()); + product.setBrandName(productNode.get("brand") + .get("name") + .textValue()); + product.setOwnerName(productNode.get("brand") + .get("owner") + .get("name") + .textValue()); + + assertEquals(product.getName(), "The Best Product"); + assertEquals(product.getBrandName(), "ACME Products"); + assertEquals(product.getOwnerName(), "Ultimate Corp, Inc."); + } + + @Test + public void whenUsingDeserializerManuallyRegistered_thenOk() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule module = new SimpleModule(); + module.addDeserializer(Product.class, new ProductDeserializer()); + mapper.registerModule(module); + + Product product = mapper.readValue(SOURCE_JSON, Product.class); + assertEquals(product.getName(), "The Best Product"); + assertEquals(product.getBrandName(), "ACME Products"); + assertEquals(product.getOwnerName(), "Ultimate Corp, Inc."); + } + + @Test + public void whenUsingDeserializerAutoRegistered_thenOk() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + Product product = mapper.readValue(SOURCE_JSON, Product.class); + assertEquals(product.getName(), "The Best Product"); + assertEquals(product.getBrandName(), "ACME Products"); + assertEquals(product.getOwnerName(), "Ultimate Corp, Inc."); + } +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/Product.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/Product.java new file mode 100644 index 0000000000..07c21e71ba --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/Product.java @@ -0,0 +1,55 @@ +package com.ossez.jackson.nested; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonDeserialize(using = ProductDeserializer.class) +public class Product { + + private String id; + private String name; + private String brandName; + private String ownerName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getOwnerName() { + return ownerName; + } + + public void setOwnerName(String ownerName) { + this.ownerName = ownerName; + } + + @SuppressWarnings("unchecked") + @JsonProperty("brand") + private void unpackNested(Map brand) { + this.brandName = (String) brand.get("name"); + Map owner = (Map) brand.get("owner"); + this.ownerName = owner.get("name"); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/ProductDeserializer.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/ProductDeserializer.java new file mode 100644 index 0000000000..e25c254d47 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/nested/ProductDeserializer.java @@ -0,0 +1,40 @@ +package com.ossez.jackson.nested; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +@SuppressWarnings("serial") +public class ProductDeserializer extends StdDeserializer { + + public ProductDeserializer() { + this(null); + } + + public ProductDeserializer(Class vc) { + super(vc); + } + + @Override + public Product deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + JsonNode productNode = jp.getCodec() + .readTree(jp); + Product product = new Product(); + product.setId(productNode.get("id") + .textValue()); + product.setName(productNode.get("name") + .textValue()); + product.setBrandName(productNode.get("brand") + .get("name") + .textValue()); + product.setOwnerName(productNode.get("brand") + .get("owner") + .get("name") + .textValue()); + return product; + } +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tocollection/JacksonCollectionDeserializationUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tocollection/JacksonCollectionDeserializationUnitTest.java new file mode 100644 index 0000000000..f0f22b4533 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tocollection/JacksonCollectionDeserializationUnitTest.java @@ -0,0 +1,75 @@ +package com.ossez.jackson.tocollection; + +import static org.hamcrest.Matchers.instanceOf; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.List; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.CollectionType; +import com.google.common.collect.Lists; + +public class JacksonCollectionDeserializationUnitTest { + + // tests - json to multiple entity + + @Test + public final void givenJsonArray_whenDeserializingAsArray_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + + final List listOfDtos = Lists.newArrayList(new MyDto("a", 1, true), new MyDto("bc", 3, false)); + listOfDtos + final String jsonArray = mapper.writeValueAsString(listOfDtos); + // [{"stringValue":"a","intValue":1,"booleanValue":true},{"stringValue":"bc","intValue":3,"booleanValue":false}] + + final MyDto[] asArray = mapper.readValue(jsonArray, MyDto[].class); + assertThat(asArray[0], instanceOf(MyDto.class)); + } + + @Test + public final void givenJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect() throws JsonParseException, JsonMappingException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + + final List listOfDtos = Lists.newArrayList(new MyDto("a", 1, true), new MyDto("bc", 3, false)); + final String jsonArray = mapper.writeValueAsString(listOfDtos); + // [{"stringValue":"a","intValue":1,"booleanValue":true},{"stringValue":"bc","intValue":3,"booleanValue":false}] + + final List asList = mapper.readValue(jsonArray, List.class); + assertThat((Object) asList.get(0), instanceOf(LinkedHashMap.class)); + } + + @Test + public final void givenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + + final List listOfDtos = Lists.newArrayList(new MyDto("a", 1, true), new MyDto("bc", 3, false)); + final String jsonArray = mapper.writeValueAsString(listOfDtos); + // [{"stringValue":"a","intValue":1,"booleanValue":true},{"stringValue":"bc","intValue":3,"booleanValue":false}] + + final List asList = mapper.readValue(jsonArray, new TypeReference>() { + }); + assertThat(asList.get(0), instanceOf(MyDto.class)); + } + + @Test + public final void givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + + final List listOfDtos = Lists.newArrayList(new MyDto("a", 1, true), new MyDto("bc", 3, false)); + final String jsonArray = mapper.writeValueAsString(listOfDtos); + // [{"stringValue":"a","intValue":1,"booleanValue":true},{"stringValue":"bc","intValue":3,"booleanValue":false}] + + final CollectionType javaType = mapper.getTypeFactory() + .constructCollectionType(List.class, MyDto.class); + final List asList = mapper.readValue(jsonArray, javaType); + assertThat(asList.get(0), instanceOf(MyDto.class)); + } + +} +// a (private) no-args constructor is required (simulate without) diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tojsonnode/StringToJsonNodeUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tojsonnode/StringToJsonNodeUnitTest.java new file mode 100644 index 0000000000..9cc438c259 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/tojsonnode/StringToJsonNodeUnitTest.java @@ -0,0 +1,51 @@ +package com.ossez.jackson.tojsonnode; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import org.junit.Test; + +import java.io.IOException; + +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class StringToJsonNodeUnitTest { + + @Test + public final void whenParsingJsonStringIntoJsonNode_thenCorrect() throws JsonParseException, IOException { + final String jsonString = "{\"k1\":\"v1\",\"k2\":\"v2\"}"; + + final ObjectMapper mapper = new ObjectMapper(); + final JsonNode actualObj = mapper.readTree(jsonString); + + assertNotNull(actualObj); + } + + @Test + public final void givenUsingLowLevelDetails_whenParsingJsonStringIntoJsonNode_thenCorrect() throws JsonParseException, IOException { + final String jsonString = "{\"k1\":\"v1\",\"k2\":\"v2\"}"; + + final ObjectMapper mapper = new ObjectMapper(); + final JsonFactory factory = mapper.getFactory(); + final JsonParser parser = factory.createParser(jsonString); + final JsonNode actualObj = mapper.readTree(parser); + + assertNotNull(actualObj); + } + + @Test + public final void givenTheJsonNode_whenRetrievingDataFromId_thenCorrect() throws JsonParseException, IOException { + final String jsonString = "{\"k1\":\"v1\",\"k2\":\"v2\"}"; + final ObjectMapper mapper = new ObjectMapper(); + final JsonNode actualObj = mapper.readTree(jsonString); + + // When + final JsonNode jsonNode1 = actualObj.get("k1"); + assertThat(jsonNode1.textValue(), equalTo("v1")); + } + +} diff --git a/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/xml/XMLSerializeDeserializeUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/xml/XMLSerializeDeserializeUnitTest.java new file mode 100644 index 0000000000..e4d879a319 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/java/com/ossez/jackson/xml/XMLSerializeDeserializeUnitTest.java @@ -0,0 +1,182 @@ +package com.ossez.jackson.xml; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; + +public class XMLSerializeDeserializeUnitTest { + + @Test + public void whenJavaSerializedToXmlStr_thenCorrect() throws JsonProcessingException { + XmlMapper xmlMapper = new XmlMapper(); + String xml = xmlMapper.writeValueAsString(new SimpleBean()); + assertNotNull(xml); + } + + @Test + public void whenJavaSerializedToXmlFile_thenCorrect() throws IOException { + XmlMapper xmlMapper = new XmlMapper(); + xmlMapper.writeValue(new File("target/simple_bean.xml"), new SimpleBean()); + File file = new File("target/simple_bean.xml"); + assertNotNull(file); + } + + @Test + public void whenJavaGotFromXmlStr_thenCorrect() throws IOException { + XmlMapper xmlMapper = new XmlMapper(); + SimpleBean value = xmlMapper.readValue("12", SimpleBean.class); + assertTrue(value.getX() == 1 && value.getY() == 2); + } + + @Test + public void whenJavaGotFromXmlFile_thenCorrect() throws IOException { + File file = new File("src/test/resources/simple_bean.xml"); + XmlMapper xmlMapper = new XmlMapper(); + String xml = inputStreamToString(new FileInputStream(file)); + SimpleBean value = xmlMapper.readValue(xml, SimpleBean.class); + assertTrue(value.getX() == 1 && value.getY() == 2); + } + + @Test + public void whenJavaGotFromXmlStrWithCapitalElem_thenCorrect() throws IOException { + XmlMapper xmlMapper = new XmlMapper(); + SimpleBeanForCapitalizedFields value = xmlMapper.readValue("12", SimpleBeanForCapitalizedFields.class); + assertTrue(value.getX() == 1 && value.getY() == 2); + } + + @Test + public void whenJavaSerializedToXmlFileWithCapitalizedField_thenCorrect() throws IOException { + XmlMapper xmlMapper = new XmlMapper(); + xmlMapper.writeValue(new File("target/simple_bean_capitalized.xml"), new SimpleBeanForCapitalizedFields()); + File file = new File("target/simple_bean_capitalized.xml"); + assertNotNull(file); + } + + @Test + public void whenJavaDeserializedFromXmlFile_thenCorrect() throws IOException { + XmlMapper xmlMapper = new XmlMapper(); + + String xml = "RohanDaye99110347319911033478
1Name1City1
2Name2City2
"; + Person value = xmlMapper.readValue(xml, Person.class); + + assertTrue(value.getAddress() + .get(0) + .getCity() + .equalsIgnoreCase("city1") + && value.getAddress() + .get(1) + .getCity() + .equalsIgnoreCase("city2")); + } + + @Test + public void whenJavaSerializedToXmlFile_thenSuccess() throws IOException { + XmlMapper xmlMapper = new XmlMapper(); + + String expectedXml = "RohanDaye99110347319911033478
1Name1City1
2Name2City2
"; + + Person person = new Person(); + + person.setFirstName("Rohan"); + person.setLastName("Daye"); + + List ph = new ArrayList<>(); + ph.add("9911034731"); + ph.add("9911033478"); + person.setPhoneNumbers(ph); + + List
addresses = new ArrayList<>(); + + Address address1 = new Address(); + address1.setStreetNumber("1"); + address1.setStreetName("Name1"); + address1.setCity("City1"); + + Address address2 = new Address(); + address2.setStreetNumber("2"); + address2.setStreetName("Name2"); + address2.setCity("City2"); + + addresses.add(address1); + addresses.add(address2); + + person.setAddress(addresses); + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + xmlMapper.writeValue(byteArrayOutputStream, person); + assertEquals(expectedXml, byteArrayOutputStream.toString()); + } + + private static String inputStreamToString(InputStream is) throws IOException { + BufferedReader br; + StringBuilder sb = new StringBuilder(); + + String line; + br = new BufferedReader(new InputStreamReader(is)); + while ((line = br.readLine()) != null) { + sb.append(line); + } + br.close(); + return sb.toString(); + } +} + +class SimpleBean { + private int x = 1; + private int y = 2; + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + +} + +class SimpleBeanForCapitalizedFields { + @JsonProperty("X") + private int x = 1; + private int y = 2; + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/test/resources/simple_bean.xml b/jackson-modules/jackson-conversions/src/test/resources/simple_bean.xml new file mode 100644 index 0000000000..7829ea35a4 --- /dev/null +++ b/jackson-modules/jackson-conversions/src/test/resources/simple_bean.xml @@ -0,0 +1,4 @@ + + 1 + 2 + \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/README.md b/jackson-modules/jackson-custom-conversions/README.md new file mode 100644 index 0000000000..68e9a6d50d --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/README.md @@ -0,0 +1,9 @@ +## Jackson Custom Conversions + +This module contains articles about Jackson custom conversions. + +### Relevant Articles: +- [Jackson – Custom Serializer](https://www.baeldung.com/jackson-custom-serialization) +- [Getting Started with Custom Deserialization in Jackson](https://www.baeldung.com/jackson-deserialization) +- [Serialize Only Fields that meet a Custom Criteria with Jackson](https://www.baeldung.com/jackson-serialize-field-custom-criteria) +- [Calling Default Serializer from Custom Serializer in Jackson](https://www.baeldung.com/jackson-call-default-serializer-from-custom-serializer) diff --git a/jackson-modules/jackson-custom-conversions/pom.xml b/jackson-modules/jackson-custom-conversions/pom.xml new file mode 100644 index 0000000000..8772558bf3 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + jackson-custom-conversions + 0.0.1-SNAPSHOT + jackson-custom-conversions + + + com.ossez + jackson-modules + 0.0.2-SNAPSHOT + + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + + + jackson-custom-conversions + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/File.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/File.java new file mode 100644 index 0000000000..791ad3a466 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/File.java @@ -0,0 +1,25 @@ +package com.baeldung.defaultserializercustomserializer; + +public class File { + + private Long id; + + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/Folder.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/Folder.java new file mode 100644 index 0000000000..6f423059a2 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/Folder.java @@ -0,0 +1,82 @@ +package com.baeldung.defaultserializercustomserializer; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class Folder { + + private Long id; + + private String name; + + private String owner; + + private Date created; + + private Date modified; + + private Date lastAccess; + + @JsonIgnore + private List files = new ArrayList<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + + public void setModified(Date modified) { + this.modified = modified; + } + + public Date getLastAccess() { + return lastAccess; + } + + public void setLastAccess(Date lastAccess) { + this.lastAccess = lastAccess; + } + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderBeanSerializerModifier.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderBeanSerializerModifier.java new file mode 100644 index 0000000000..819971939c --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderBeanSerializerModifier.java @@ -0,0 +1,20 @@ +package com.baeldung.defaultserializercustomserializer; + +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializationConfig; +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; + +public class FolderBeanSerializerModifier extends BeanSerializerModifier { + + @Override + public JsonSerializer modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer serializer) { + + if (beanDesc.getBeanClass().equals(Folder.class)) { + return new FolderSerializerWithDefaultSerializerStored((JsonSerializer) serializer); + } + + return serializer; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializer.java new file mode 100644 index 0000000000..3869ab15d8 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializer.java @@ -0,0 +1,34 @@ +package com.baeldung.defaultserializercustomserializer; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class FolderSerializer extends StdSerializer { + + public FolderSerializer() { + super(Folder.class); + } + + @Override + public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException { + + gen.writeStartObject(); + gen.writeStringField("name", value.getName()); + + gen.writeArrayFieldStart("files"); + for (File file : value.getFiles()) { + gen.writeStartObject(); + gen.writeNumberField("id", file.getId()); + gen.writeStringField("name", file.getName()); + gen.writeEndObject(); + } + gen.writeEndArray(); + + gen.writeEndObject(); + + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithCallingOwnSerializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithCallingOwnSerializer.java new file mode 100644 index 0000000000..544a4c6d1a --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithCallingOwnSerializer.java @@ -0,0 +1,29 @@ +package com.baeldung.defaultserializercustomserializer; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class FolderSerializerWithCallingOwnSerializer extends StdSerializer { + + public FolderSerializerWithCallingOwnSerializer() { + super(Folder.class); + } + + @Override + public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException { + + gen.writeStartObject(); + gen.writeStringField("name", value.getName()); + + provider.defaultSerializeField("files", value.getFiles(), gen); + + provider.defaultSerializeField("details", value, gen); + + gen.writeEndObject(); + + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithDefaultSerializerStored.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithDefaultSerializerStored.java new file mode 100644 index 0000000000..558b303301 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithDefaultSerializerStored.java @@ -0,0 +1,34 @@ +package com.baeldung.defaultserializercustomserializer; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class FolderSerializerWithDefaultSerializerStored extends StdSerializer { + + private final JsonSerializer defaultSerializer; + + public FolderSerializerWithDefaultSerializerStored(JsonSerializer defaultSerializer) { + super(Folder.class); + this.defaultSerializer = defaultSerializer; + } + + @Override + public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException { + + gen.writeStartObject(); + gen.writeStringField("name", value.getName()); + + provider.defaultSerializeField("files", value.getFiles(), gen); + + gen.writeFieldName("details"); + defaultSerializer.serialize(value, gen, provider); + + gen.writeEndObject(); + + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithInternalObjectMapper.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithInternalObjectMapper.java new file mode 100644 index 0000000000..1ad51c63c0 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithInternalObjectMapper.java @@ -0,0 +1,33 @@ +package com.baeldung.defaultserializercustomserializer; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class FolderSerializerWithInternalObjectMapper extends StdSerializer { + + public FolderSerializerWithInternalObjectMapper() { + super(Folder.class); + } + + @Override + public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException { + + gen.writeStartObject(); + gen.writeStringField("name", value.getName()); + + // we access internal mapper to delegate the serialization of File list + ObjectMapper mapper = (ObjectMapper) gen.getCodec(); + + gen.writeFieldName("files"); + String stringValue = mapper.writeValueAsString(value.getFiles()); + gen.writeRawValue(stringValue); + + gen.writeEndObject(); + + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithSerializerProvider.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithSerializerProvider.java new file mode 100644 index 0000000000..8aeb28b3d0 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/defaultserializercustomserializer/FolderSerializerWithSerializerProvider.java @@ -0,0 +1,28 @@ +package com.baeldung.defaultserializercustomserializer; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class FolderSerializerWithSerializerProvider extends StdSerializer { + + public FolderSerializerWithSerializerProvider() { + super(Folder.class); + } + + @Override + public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException { + + gen.writeStartObject(); + gen.writeStringField("name", value.getName()); + + // we delegate the File list serialization to its default serializer + provider.defaultSerializeField("files", value.getFiles(), gen); + + gen.writeEndObject(); + + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ActorJackson.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ActorJackson.java new file mode 100644 index 0000000000..4bf3bc57f6 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ActorJackson.java @@ -0,0 +1,61 @@ +package com.baeldung.deserialization; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.TimeZone; + +public class ActorJackson { + + private String imdbId; + private Date dateOfBirth; + private List filmography; + + public ActorJackson() { + super(); + } + + public ActorJackson(String imdbId, Date dateOfBirth, List filmography) { + super(); + this.imdbId = imdbId; + this.dateOfBirth = dateOfBirth; + this.filmography = filmography; + } + + @Override + public String toString() { + return "ActorJackson [imdbId=" + imdbId + ", dateOfBirth=" + formatDateOfBirth() + ", filmography=" + filmography + "]"; + } + + public String getImdbId() { + return imdbId; + } + + public void setImdbId(String imdbId) { + this.imdbId = imdbId; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public List getFilmography() { + return filmography; + } + + public void setFilmography(List filmography) { + this.filmography = filmography; + } + + private String formatDateOfBirth() { + final DateFormat formatter = new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.US); + formatter.setTimeZone(TimeZone.getTimeZone("GMT")); + return formatter.format(dateOfBirth); + } +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Item.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Item.java new file mode 100644 index 0000000000..e6234bb6e9 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Item.java @@ -0,0 +1,32 @@ +package com.baeldung.deserialization; + +public class Item { + public int id; + public String itemName; + public User owner; + + public Item() { + super(); + } + + public Item(final int id, final String itemName, final User owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } + + // API + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public User getOwner() { + return owner; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializer.java new file mode 100644 index 0000000000..7ae2faa04d --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializer.java @@ -0,0 +1,39 @@ +package com.baeldung.deserialization; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.node.IntNode; + +public class ItemDeserializer extends StdDeserializer { + + private static final long serialVersionUID = 1883547683050039861L; + + public ItemDeserializer() { + this(null); + } + + public ItemDeserializer(final Class vc) { + super(vc); + } + + /** + * {"id":1,"itemNr":"theItem","owner":2} + */ + @Override + public Item deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException, JsonProcessingException { + final JsonNode node = jp.getCodec() + .readTree(jp); + final int id = (Integer) ((IntNode) node.get("id")).numberValue(); + final String itemName = node.get("itemName") + .asText(); + final int userId = (Integer) ((IntNode) node.get("createdBy")).numberValue(); + + return new Item(id, itemName, new User(userId, null)); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializerOnClass.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializerOnClass.java new file mode 100644 index 0000000000..b9db114c4a --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemDeserializerOnClass.java @@ -0,0 +1,39 @@ +package com.baeldung.deserialization; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.node.IntNode; + +public class ItemDeserializerOnClass extends StdDeserializer { + + private static final long serialVersionUID = 5579141241817332594L; + + public ItemDeserializerOnClass() { + this(null); + } + + public ItemDeserializerOnClass(final Class vc) { + super(vc); + } + + /** + * {"id":1,"itemNr":"theItem","owner":2} + */ + @Override + public ItemWithDeserializer deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException, JsonProcessingException { + final JsonNode node = jp.getCodec() + .readTree(jp); + final int id = (Integer) ((IntNode) node.get("id")).numberValue(); + final String itemName = node.get("itemName") + .asText(); + final int userId = (Integer) ((IntNode) node.get("owner")).numberValue(); + + return new ItemWithDeserializer(id, itemName, new User(userId, null)); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithDeserializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithDeserializer.java new file mode 100644 index 0000000000..1ab36e4acd --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithDeserializer.java @@ -0,0 +1,31 @@ +package com.baeldung.deserialization; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonDeserialize(using = ItemDeserializerOnClass.class) +public class ItemWithDeserializer { + public final int id; + public final String itemName; + public final User owner; + + public ItemWithDeserializer(final int id, final String itemName, final User owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } + + // API + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public User getOwner() { + return owner; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Movie.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Movie.java new file mode 100644 index 0000000000..fdb107dca2 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Movie.java @@ -0,0 +1,50 @@ +package com.baeldung.deserialization; + +import java.util.List; + +public class Movie { + + private String imdbId; + private String director; + private List actors; + + public Movie(String imdbId, String director, List actors) { + super(); + this.imdbId = imdbId; + this.director = director; + this.actors = actors; + } + + public Movie() { + super(); + } + + @Override + public String toString() { + return "Movie [imdbId=" + imdbId + ", director=" + director + ", actors=" + actors + "]"; + } + + public String getImdbId() { + return imdbId; + } + + public void setImdbId(String imdbId) { + this.imdbId = imdbId; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public List getActors() { + return actors; + } + + public void setActors(List actors) { + this.actors = actors; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/User.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/User.java new file mode 100644 index 0000000000..d22a85aafd --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/User.java @@ -0,0 +1,26 @@ +package com.baeldung.deserialization; + +public class User { + public int id; + public String name; + + public User() { + super(); + } + + public User(final int id, final String name) { + this.id = id; + this.name = name; + } + + // API + + public int getId() { + return id; + } + + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/Item.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/Item.java new file mode 100644 index 0000000000..52a73b048c --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/Item.java @@ -0,0 +1,32 @@ +package com.baeldung.serialization; + +public class Item { + public int id; + public String itemName; + public User owner; + + public Item() { + super(); + } + + public Item(final int id, final String itemName, final User owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } + + // API + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public User getOwner() { + return owner; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializer.java new file mode 100644 index 0000000000..dc0b5e1c88 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializer.java @@ -0,0 +1,31 @@ +package com.baeldung.serialization; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class ItemSerializer extends StdSerializer { + + private static final long serialVersionUID = 6739170890621978901L; + + public ItemSerializer() { + this(null); + } + + public ItemSerializer(final Class t) { + super(t); + } + + @Override + public final void serialize(final Item value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException { + jgen.writeStartObject(); + jgen.writeNumberField("id", value.id); + jgen.writeStringField("itemName", value.itemName); + jgen.writeNumberField("owner", value.owner.id); + jgen.writeEndObject(); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializerOnClass.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializerOnClass.java new file mode 100644 index 0000000000..8f56c349f2 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemSerializerOnClass.java @@ -0,0 +1,31 @@ +package com.baeldung.serialization; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class ItemSerializerOnClass extends StdSerializer { + + private static final long serialVersionUID = -1760959597313610409L; + + public ItemSerializerOnClass() { + this(null); + } + + public ItemSerializerOnClass(final Class t) { + super(t); + } + + @Override + public final void serialize(final ItemWithSerializer value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException { + jgen.writeStartObject(); + jgen.writeNumberField("id", value.id); + jgen.writeStringField("itemName", value.itemName); + jgen.writeNumberField("owner", value.owner.id); + jgen.writeEndObject(); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemWithSerializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemWithSerializer.java new file mode 100644 index 0000000000..5b38ad1af6 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/ItemWithSerializer.java @@ -0,0 +1,32 @@ +package com.baeldung.serialization; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@JsonSerialize(using = ItemSerializerOnClass.class) +public class ItemWithSerializer { + public final int id; + public final String itemName; + public final User owner; + + public ItemWithSerializer(final int id, final String itemName, final User owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } + + // API + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public User getOwner() { + return owner; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/User.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/User.java new file mode 100644 index 0000000000..b01ccc9ffb --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/serialization/User.java @@ -0,0 +1,26 @@ +package com.baeldung.serialization; + +public class User { + public int id; + public String name; + + public User() { + super(); + } + + public User(final int id, final String name) { + this.id = id; + this.name = name; + } + + // API + + public int getId() { + return id; + } + + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Address.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Address.java new file mode 100644 index 0000000000..a394bbc180 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Address.java @@ -0,0 +1,40 @@ +package com.baeldung.skipfields; + +public class Address implements Hidable { + private String city; + private String country; + private boolean hidden; + + public Address(final String city, final String country, final boolean hidden) { + super(); + this.city = city; + this.country = country; + this.hidden = hidden; + } + + public String getCity() { + return city; + } + + public void setCity(final String city) { + this.city = city; + } + + public String getCountry() { + return country; + } + + public void setCountry(final String country) { + this.country = country; + } + + @Override + public boolean isHidden() { + return hidden; + } + + public void setHidden(final boolean hidden) { + this.hidden = hidden; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Hidable.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Hidable.java new file mode 100644 index 0000000000..fff7f81d1e --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Hidable.java @@ -0,0 +1,8 @@ +package com.baeldung.skipfields; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties("hidden") +public interface Hidable { + boolean isHidden(); +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/HidableSerializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/HidableSerializer.java new file mode 100644 index 0000000000..8b300444c0 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/HidableSerializer.java @@ -0,0 +1,29 @@ +package com.baeldung.skipfields; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +public class HidableSerializer extends JsonSerializer { + + private JsonSerializer defaultSerializer; + + public HidableSerializer(final JsonSerializer serializer) { + defaultSerializer = serializer; + } + + @Override + public void serialize(final Hidable value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException { + if (value.isHidden()) + return; + defaultSerializer.serialize(value, jgen, provider); + } + + @Override + public boolean isEmpty(final SerializerProvider provider, final Hidable value) { + return (value == null || value.isHidden()); + } +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/MyDtoWithFilter.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/MyDtoWithFilter.java new file mode 100644 index 0000000000..50492c337a --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/MyDtoWithFilter.java @@ -0,0 +1,50 @@ +package com.baeldung.skipfields; + +import com.fasterxml.jackson.annotation.JsonFilter; + +@JsonFilter("myFilter") +public class MyDtoWithFilter { + + private String stringValue; + private int intValue; + private boolean booleanValue; + + public MyDtoWithFilter() { + super(); + } + + public MyDtoWithFilter(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Person.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Person.java new file mode 100644 index 0000000000..e1501947d3 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/skipfields/Person.java @@ -0,0 +1,40 @@ +package com.baeldung.skipfields; + +public class Person implements Hidable { + private String name; + private Address address; + private boolean hidden; + + public Person(final String name, final Address address, final boolean hidden) { + super(); + this.name = name; + this.address = address; + this.hidden = hidden; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public Address getAddress() { + return address; + } + + public void setAddress(final Address address) { + this.address = address; + } + + @Override + public boolean isHidden() { + return hidden; + } + + public void setHidden(final boolean hidden) { + this.hidden = hidden; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/defaultserializercustomserializer/CallingDefaultSerializerUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/defaultserializercustomserializer/CallingDefaultSerializerUnitTest.java new file mode 100644 index 0000000000..c8b4ec7e1a --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/defaultserializercustomserializer/CallingDefaultSerializerUnitTest.java @@ -0,0 +1,164 @@ +package com.baeldung.defaultserializercustomserializer; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +public class CallingDefaultSerializerUnitTest { + + private ObjectMapper mapper; + private Folder mockFolder; + private TypeReference> mapType; + + @Before + public void setup() { + + mapType = new TypeReference>() { + }; + + mapper = new ObjectMapper(); + + mockFolder = new Folder(); + mockFolder.setId(1L); + mockFolder.setName("Root Folder"); + mockFolder.setOwner("root"); + mockFolder.setCreated(Date.from(Instant.now().minusSeconds(60))); + mockFolder.setModified(Date.from(Instant.now().minusSeconds(30))); + mockFolder.setLastAccess(Date.from(Instant.now())); + + File file1 = new File(); + file1.setId(1L); + file1.setName("File 1"); + + File file2 = new File(); + file2.setId(2L); + file2.setName("File 2"); + + List files = new ArrayList<>(); + files.add(file1); + files.add(file2); + mockFolder.setFiles(files); + + } + + @Test + public void givenFolder_whenSerialized_onlyNameAndFilesFieldsSerialized() throws IOException { + + SimpleModule module = new SimpleModule(); + module.addSerializer(new FolderSerializer()); + mapper.registerModule(module); + + String json = mapper.writeValueAsString(mockFolder); + + HashMap actual = mapper.readValue(json, mapType); + + assertTrue(actual.containsKey("name")); + assertTrue(actual.containsKey("files")); + assertEquals(mockFolder.getName(), actual.get("name")); + + List actualFiles = (List) actual.get("files"); + assertEquals(mockFolder.getFiles().size(), actualFiles.size()); + + } + + @Test + public void givenFolder_whenSerializedWithSerializerProvider_onlyNameAndFilesFieldsSerialized() throws IOException { + + SimpleModule module = new SimpleModule(); + module.addSerializer(new FolderSerializerWithSerializerProvider()); + mapper.registerModule(module); + + String json = mapper.writeValueAsString(mockFolder); + + HashMap actual = mapper.readValue(json, mapType); + + assertTrue(actual.containsKey("name")); + assertTrue(actual.containsKey("files")); + assertEquals(mockFolder.getName(), actual.get("name")); + + List actualFiles = (List) actual.get("files"); + assertEquals(mockFolder.getFiles().size(), actualFiles.size()); + + } + + @Test + public void givenFolder_whenSerializedWithInternalObjectMapper_onlyNameAndFilesFieldsSerialized() throws IOException { + + SimpleModule module = new SimpleModule(); + module.addSerializer(new FolderSerializerWithInternalObjectMapper()); + mapper.registerModule(module); + + String json = mapper.writeValueAsString(mockFolder); + + HashMap actual = mapper.readValue(json, mapType); + + assertTrue(actual.containsKey("name")); + assertTrue(actual.containsKey("files")); + assertEquals(mockFolder.getName(), actual.get("name")); + + List actualFiles = (List) actual.get("files"); + assertEquals(mockFolder.getFiles().size(), actualFiles.size()); + + } + + @Test(expected = StackOverflowError.class) + public void givenFolder_whenSerializedWithCallingOwnSerializer_exceptionOccured() throws IOException { + + SimpleModule module = new SimpleModule(); + module.addSerializer(new FolderSerializerWithCallingOwnSerializer()); + mapper.registerModule(module); + + mapper.writeValueAsString(mockFolder); + + } + + @Test + public void givenFolder_whenSerializedWithDefaultSerializerStored_NameAndFilesAndDetailsFieldsSerialized() throws IOException { + + SimpleModule module = new SimpleModule(); + module.setSerializerModifier(new FolderBeanSerializerModifier()); + mapper.registerModule(module); + + String json = mapper.writeValueAsString(mockFolder); + + HashMap actual = mapper.readValue(json, mapType); + + assertTrue(actual.containsKey("name")); + assertTrue(actual.containsKey("files")); + assertEquals(mockFolder.getName(), actual.get("name")); + + List actualFiles = (List) actual.get("files"); + assertEquals(mockFolder.getFiles().size(), actualFiles.size()); + + Map actualDetails = (Map) actual.get("details"); + assertTrue(actualDetails.containsKey("id")); + assertTrue(actualDetails.containsKey("name")); + assertTrue(actualDetails.containsKey("owner")); + assertTrue(actualDetails.containsKey("created")); + assertTrue(actualDetails.containsKey("modified")); + assertTrue(actualDetails.containsKey("lastAccess")); + + assertEquals(mockFolder.getId().longValue(), ((Number)actualDetails.get("id")).longValue()); + assertEquals(mockFolder.getName(), actualDetails.get("name")); + assertEquals(mockFolder.getOwner(), actualDetails.get("owner")); + assertEquals(mockFolder.getCreated(), new Date((long) actualDetails.get("created"))); + assertEquals(mockFolder.getModified(), new Date((long) actualDetails.get("modified"))); + assertEquals(mockFolder.getLastAccess(), new Date((long) actualDetails.get("lastAccess"))); + + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java new file mode 100644 index 0000000000..17016149a2 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java @@ -0,0 +1,81 @@ +package com.baeldung.deserialization; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.junit.Test; + +import java.io.IOException; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +public class CustomDeserializationUnitTest { + + @Test + public final void whenDeserializingTheStandardRepresentation_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + final String json = "{\"id\":1,\"itemName\":\"theItem\",\"owner\":{\"id\":2,\"name\":\"theUser\"}}"; + + final Item readValue = new ObjectMapper().readValue(json, Item.class); + assertThat(readValue, notNullValue()); + } + + @Test + public final void whenDeserializingANonStandardRepresentation_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + final String json = "{\"id\":1,\"itemName\":\"theItem\",\"createdBy\":2}"; + final ObjectMapper mapper = new ObjectMapper(); + + final SimpleModule module = new SimpleModule(); + module.addDeserializer(Item.class, new ItemDeserializer()); + mapper.registerModule(module); + + final Item readValue = mapper.readValue(json, Item.class); + assertThat(readValue, notNullValue()); + } + + @Test + public final void givenDeserializerIsOnClass_whenDeserializingCustomRepresentation_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + final String json = "{\"id\":1,\"itemName\":\"theItem\",\"owner\":2}"; + + final ItemWithDeserializer readValue = new ObjectMapper().readValue(json, ItemWithDeserializer.class); + assertThat(readValue, notNullValue()); + } + + @Test + public void whenDeserialisingZonedDateTimeWithDefaults_thenTimeZoneIsNotPreserved() throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + // construct a new instance of ZonedDateTime + ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Berlin")); + String converted = objectMapper.writeValueAsString(now); + // restore an instance of ZonedDateTime from String + ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class); + assertThat(now, is(not(restored))); + } + + @Test + public void whenDeserialisingZonedDateTimeWithFeaturesDisabled_thenTimeZoneIsPreserved() throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.enable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID); + objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); + // construct a new instance of ZonedDateTime + ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Berlin")); + String converted = objectMapper.writeValueAsString(now); + // restore an instance of ZonedDateTime from String + ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class); + assertThat(restored, is(now)); + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/serialization/CustomSerializationUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/serialization/CustomSerializationUnitTest.java new file mode 100644 index 0000000000..9c46a86fd8 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/serialization/CustomSerializationUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.serialization; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.google.common.collect.Lists; + +public class CustomSerializationUnitTest { + + @Test + public final void whenSerializing_thenNoExceptions() throws JsonGenerationException, JsonMappingException, IOException { + final Item myItem = new Item(1, "theItem", new User(2, "theUser")); + final String serialized = new ObjectMapper().writeValueAsString(myItem); + } + + @Test + public final void whenSerializingWithCustomSerializer_thenNoExceptions() throws JsonGenerationException, JsonMappingException, IOException { + final Item myItem = new Item(1, "theItem", new User(2, "theUser")); + + final ObjectMapper mapper = new ObjectMapper(); + + final SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Item.class, new ItemSerializer()); + mapper.registerModule(simpleModule); + + final String serialized = mapper.writeValueAsString(myItem); + } + + @Test + public final void givenSerializerRegisteredOnClass_whenSerializingWithCustomSerializer_thenNoExceptions() throws JsonGenerationException, JsonMappingException, IOException { + final ItemWithSerializer myItem = new ItemWithSerializer(1, "theItem", new User(2, "theUser")); + + final String serialized = new ObjectMapper().writeValueAsString(myItem); + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/IgnoreFieldsWithFilterUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/IgnoreFieldsWithFilterUnitTest.java new file mode 100644 index 0000000000..ec753019b2 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/IgnoreFieldsWithFilterUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.skipfields; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.PropertyFilter; +import com.fasterxml.jackson.databind.ser.PropertyWriter; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; +import org.junit.Test; + +import java.io.IOException; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + +public class IgnoreFieldsWithFilterUnitTest { + + @Test + public final void givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("intValue"); + final FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter); + + final MyDtoWithFilter dtoObject = new MyDtoWithFilter(); + dtoObject.setIntValue(12); + + final String dtoAsString = mapper.writer(filters) + .writeValueAsString(dtoObject); + + assertThat(dtoAsString, not(containsString("intValue"))); + assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, containsString("stringValue")); + } + + @Test + public final void givenTypeHasFilterThatIgnoresNegativeInt_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { + final PropertyFilter theFilter = new SimpleBeanPropertyFilter() { + @Override + public final void serializeAsField(final Object pojo, final JsonGenerator jgen, final SerializerProvider provider, final PropertyWriter writer) throws Exception { + if (include(writer)) { + if (!writer.getName() + .equals("intValue")) { + writer.serializeAsField(pojo, jgen, provider); + return; + } + + final int intValue = ((MyDtoWithFilter) pojo).getIntValue(); + if (intValue >= 0) { + writer.serializeAsField(pojo, jgen, provider); + } + } else if (!jgen.canOmitFields()) { // since 2.3 + writer.serializeAsOmittedField(pojo, jgen, provider); + } + } + + @Override + protected final boolean include(final BeanPropertyWriter writer) { + return true; + } + + @Override + protected final boolean include(final PropertyWriter writer) { + return true; + } + }; + final FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter); + + final MyDtoWithFilter dtoObject = new MyDtoWithFilter(); + dtoObject.setIntValue(-1); + + final ObjectMapper mapper = new ObjectMapper(); + final String dtoAsString = mapper.writer(filters) + .writeValueAsString(dtoObject); + + assertThat(dtoAsString, not(containsString("intValue"))); + assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, containsString("stringValue")); + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/JacksonDynamicIgnoreUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/JacksonDynamicIgnoreUnitTest.java new file mode 100644 index 0000000000..2fd59e2a82 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/skipfields/JacksonDynamicIgnoreUnitTest.java @@ -0,0 +1,88 @@ +package com.baeldung.skipfields; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; + +import org.junit.Before; +import org.junit.Test; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationConfig; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; + +public class JacksonDynamicIgnoreUnitTest { + + private ObjectMapper mapper = new ObjectMapper(); + + @Before + public void setUp() { + mapper.setSerializationInclusion(Include.NON_EMPTY); + mapper.registerModule(new SimpleModule() { + @Override + public void setupModule(final SetupContext context) { + super.setupModule(context); + context.addBeanSerializerModifier(new BeanSerializerModifier() { + @Override + public JsonSerializer modifySerializer(final SerializationConfig config, final BeanDescription beanDesc, final JsonSerializer serializer) { + if (Hidable.class.isAssignableFrom(beanDesc.getBeanClass())) { + return new HidableSerializer((JsonSerializer) serializer); + } + return serializer; + } + }); + } + }); + } + + @Test + public void whenNotHidden_thenCorrect() throws JsonProcessingException { + final Address ad = new Address("ny", "usa", false); + final Person person = new Person("john", ad, false); + final String result = mapper.writeValueAsString(person); + + assertTrue(result.contains("name")); + assertTrue(result.contains("john")); + assertTrue(result.contains("address")); + assertTrue(result.contains("usa")); + } + + @Test + public void whenAddressHidden_thenCorrect() throws JsonProcessingException { + final Address ad = new Address("ny", "usa", true); + final Person person = new Person("john", ad, false); + final String result = mapper.writeValueAsString(person); + + assertTrue(result.contains("name")); + assertTrue(result.contains("john")); + assertFalse(result.contains("address")); + assertFalse(result.contains("usa")); + } + + @Test + public void whenAllHidden_thenCorrect() throws JsonProcessingException { + final Address ad = new Address("ny", "usa", false); + final Person person = new Person("john", ad, true); + final String result = mapper.writeValueAsString(person); + + assertTrue(result.length() == 0); + } + + @Test + public void whenSerializeList_thenCorrect() throws JsonProcessingException { + final Address ad1 = new Address("tokyo", "jp", true); + final Address ad2 = new Address("london", "uk", false); + final Address ad3 = new Address("ny", "usa", false); + final Person p1 = new Person("john", ad1, false); + final Person p2 = new Person("tom", ad2, true); + final Person p3 = new Person("adam", ad3, false); + + final String result = mapper.writeValueAsString(Arrays.asList(p1, p2, p3)); + } +} diff --git a/jackson-modules/jackson-exceptions/README.md b/jackson-modules/jackson-exceptions/README.md new file mode 100644 index 0000000000..6f082aaaa5 --- /dev/null +++ b/jackson-modules/jackson-exceptions/README.md @@ -0,0 +1,7 @@ +## Jackson Exceptions + +This module contains articles about Jackson exceptions. + +### Relevant Articles: +- [Jackson Exceptions – Problems and Solutions](https://www.baeldung.com/jackson-exception) +- [Jackson – JsonMappingException (No serializer found for class)](https://www.baeldung.com/jackson-jsonmappingexception) diff --git a/jackson-modules/jackson-exceptions/pom.xml b/jackson-modules/jackson-exceptions/pom.xml new file mode 100644 index 0000000000..bb2a9b1810 --- /dev/null +++ b/jackson-modules/jackson-exceptions/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + jackson-exceptions + 0.0.1-SNAPSHOT + jackson-exceptions + + + com.ossez + jackson-modules + 0.0.2-SNAPSHOT + + + + jackson-exceptions + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/User.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/User.java new file mode 100644 index 0000000000..e0e77c658e --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/User.java @@ -0,0 +1,26 @@ +package com.baeldung.exceptions; + +public class User { + public int id; + public String name; + + public User() { + super(); + } + + public User(final int id, final String name) { + this.id = id; + this.name = name; + } + + // API + + public int getId() { + return id; + } + + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithConflict.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithConflict.java new file mode 100644 index 0000000000..5adbb7b01e --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithConflict.java @@ -0,0 +1,25 @@ +package com.baeldung.exceptions; + +public class UserWithConflict { + public int id; + public String name; + boolean checked; + + public UserWithConflict() { + super(); + } + + public UserWithConflict(final int id, final String name, final boolean checked) { + this.id = id; + this.name = name; + this.checked = checked; + } + + public boolean getChecked() { + return checked; + } + + public boolean isChecked() { + return checked; + } +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithNoDefaultConstructor.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithNoDefaultConstructor.java new file mode 100644 index 0000000000..c75b06ed6a --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithNoDefaultConstructor.java @@ -0,0 +1,21 @@ +package com.baeldung.exceptions; + +public class UserWithNoDefaultConstructor { + + private int id; + private String name; + + public UserWithNoDefaultConstructor(final int id, final String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithPrivateFields.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithPrivateFields.java new file mode 100644 index 0000000000..c10020bd85 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithPrivateFields.java @@ -0,0 +1,16 @@ +package com.baeldung.exceptions; + +public class UserWithPrivateFields { + int id; + String name; + + public UserWithPrivateFields() { + super(); + } + + public UserWithPrivateFields(final int id, final String name) { + this.id = id; + this.name = name; + } + +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithRoot.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithRoot.java new file mode 100644 index 0000000000..cadcd43a72 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/UserWithRoot.java @@ -0,0 +1,18 @@ +package com.baeldung.exceptions; + +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "user") +public class UserWithRoot { + public int id; + public String name; + + public UserWithRoot() { + super(); + } + + public UserWithRoot(final int id, final String name) { + this.id = id; + this.name = name; + } +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Zoo.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Zoo.java new file mode 100644 index 0000000000..3e729a1d2f --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Zoo.java @@ -0,0 +1,22 @@ +package com.baeldung.exceptions; + +public class Zoo { + public Animal animal; + + public Zoo() { + } +} + +abstract class Animal { + public String name; + + public Animal() { + } +} + +class Cat extends Animal { + public int lives; + + public Cat() { + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/ZooConfigured.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/ZooConfigured.java new file mode 100644 index 0000000000..31c2ce4d4c --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/ZooConfigured.java @@ -0,0 +1,25 @@ +package com.baeldung.exceptions; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +public class ZooConfigured { + public AnimalConfigured animal; + + public ZooConfigured() { + } +} + +@JsonDeserialize(as = CatConfigured.class) +abstract class AnimalConfigured { + public String name; + + public AnimalConfigured() { + } +} + +class CatConfigured extends AnimalConfigured { + public int lives; + + public CatConfigured() { + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessors.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessors.java new file mode 100644 index 0000000000..17bc5257fb --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessors.java @@ -0,0 +1,21 @@ +package com.baeldung.mappingexception; + +public class MyDtoNoAccessors { + + String stringValue; + int intValue; + boolean booleanValue; + + public MyDtoNoAccessors() { + super(); + } + + public MyDtoNoAccessors(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessorsAndFieldVisibility.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessorsAndFieldVisibility.java new file mode 100644 index 0000000000..cf5d5ca500 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/MyDtoNoAccessorsAndFieldVisibility.java @@ -0,0 +1,25 @@ +package com.baeldung.mappingexception; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; + +@JsonAutoDetect(fieldVisibility = Visibility.ANY) +public class MyDtoNoAccessorsAndFieldVisibility { + + String stringValue; + int intValue; + boolean booleanValue; + + public MyDtoNoAccessorsAndFieldVisibility() { + super(); + } + + public MyDtoNoAccessorsAndFieldVisibility(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + +} diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java new file mode 100644 index 0000000000..38ef3f9390 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java @@ -0,0 +1,195 @@ +package com.baeldung.exceptions; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; + +import com.baeldung.exceptions.User; +import com.baeldung.exceptions.UserWithPrivateFields; +import com.baeldung.exceptions.UserWithRoot; +import com.baeldung.exceptions.Zoo; +import com.baeldung.exceptions.ZooConfigured; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; + +public class JacksonExceptionsUnitTest { + + // JsonMappingException: Can not construct instance of + @Test(expected = JsonMappingException.class) + public void givenAbstractClass_whenDeserializing_thenException() throws IOException { + final String json = "{\"animal\":{\"name\":\"lacy\"}}"; + final ObjectMapper mapper = new ObjectMapper(); + + mapper.reader() + .forType(Zoo.class) + .readValue(json); + } + + @Test + public void givenAbstractClassConfigured_whenDeserializing_thenCorrect() throws IOException { + final String json = "{\"animal\":{\"name\":\"lacy\"}}"; + final ObjectMapper mapper = new ObjectMapper(); + + mapper.reader() + .forType(ZooConfigured.class) + .readValue(json); + } + + // JsonMappingException: No serializer found for class + @Test(expected = JsonMappingException.class) + public void givenClassWithPrivateFields_whenSerializing_thenException() throws IOException { + final UserWithPrivateFields user = new UserWithPrivateFields(1, "John"); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.writer() + .writeValueAsString(user); + } + + @Test + public void givenClassWithPrivateFields_whenConfigureSerializing_thenCorrect() throws IOException { + final UserWithPrivateFields user = new UserWithPrivateFields(1, "John"); + + final ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + + final String result = mapper.writer() + .writeValueAsString(user); + assertThat(result, containsString("John")); + } + + // JsonMappingException: No suitable constructor found + @Test(expected = JsonMappingException.class) + public void givenNoDefaultConstructor_whenDeserializing_thenException() throws IOException { + final String json = "{\"id\":1,\"name\":\"John\"}"; + final ObjectMapper mapper = new ObjectMapper(); + + mapper.reader() + .forType(UserWithNoDefaultConstructor.class) + .readValue(json); + } + + @Test + public void givenDefaultConstructor_whenDeserializing_thenCorrect() throws IOException { + final String json = "{\"id\":1,\"name\":\"John\"}"; + final ObjectMapper mapper = new ObjectMapper(); + + final User user = mapper.reader() + .forType(User.class) + .readValue(json); + assertEquals("John", user.name); + } + + // JsonMappingException: Root name does not match expected + @Test(expected = JsonMappingException.class) + public void givenWrappedJsonString_whenDeserializing_thenException() throws IOException { + final String json = "{\"user\":{\"id\":1,\"name\":\"John\"}}"; + + final ObjectMapper mapper = new ObjectMapper(); + mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); + + mapper.reader() + .forType(User.class) + .readValue(json); + } + + @Test + public void givenWrappedJsonStringAndConfigureClass_whenDeserializing_thenCorrect() throws IOException { + final String json = "{\"user\":{\"id\":1,\"name\":\"John\"}}"; + + final ObjectMapper mapper = new ObjectMapper(); + mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); + + final UserWithRoot user = mapper.reader() + .forType(UserWithRoot.class) + .readValue(json); + assertEquals("John", user.name); + } + + // JsonMappingException: Can not deserialize instance of + @Test(expected = JsonMappingException.class) + public void givenJsonOfArray_whenDeserializing_thenException() throws JsonProcessingException, IOException { + final String json = "[{\"id\":1,\"name\":\"John\"},{\"id\":2,\"name\":\"Adam\"}]"; + final ObjectMapper mapper = new ObjectMapper(); + + mapper.reader() + .forType(User.class) + .readValue(json); + } + + @Test + public void givenJsonOfArray_whenDeserializing_thenCorrect() throws JsonProcessingException, IOException { + final String json = "[{\"id\":1,\"name\":\"John\"},{\"id\":2,\"name\":\"Adam\"}]"; + final ObjectMapper mapper = new ObjectMapper(); + + final List users = mapper.reader() + .forType(new TypeReference>() { + }) + .readValue(json); + + assertEquals(2, users.size()); + } + + // UnrecognizedPropertyException + @Test(expected = UnrecognizedPropertyException.class) + public void givenJsonStringWithExtra_whenDeserializing_thenException() throws IOException { + final String json = "{\"id\":1,\"name\":\"John\", \"checked\":true}"; + + final ObjectMapper mapper = new ObjectMapper(); + mapper.reader() + .forType(User.class) + .readValue(json); + } + + @Test + public void givenJsonStringWithExtra_whenConfigureDeserializing_thenCorrect() throws IOException { + final String json = "{\"id\":1,\"name\":\"John\", \"checked\":true}"; + + final ObjectMapper mapper = new ObjectMapper(); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + final User user = mapper.reader() + .forType(User.class) + .readValue(json); + assertEquals("John", user.name); + } + + // JsonParseException: Unexpected character (''' (code 39)) + @Test(expected = JsonParseException.class) + public void givenStringWithSingleQuotes_whenDeserializing_thenException() throws JsonProcessingException, IOException { + final String json = "{'id':1,'name':'John'}"; + final ObjectMapper mapper = new ObjectMapper(); + + mapper.reader() + .forType(User.class) + .readValue(json); + } + + @Test + public void givenStringWithSingleQuotes_whenConfigureDeserializing_thenCorrect() throws JsonProcessingException, IOException { + final String json = "{'id':1,'name':'John'}"; + + final JsonFactory factory = new JsonFactory(); + factory.enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES); + final ObjectMapper mapper = new ObjectMapper(factory); + + final User user = mapper.reader() + .forType(User.class) + .readValue(json); + assertEquals("John", user.name); + } + +} diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java new file mode 100644 index 0000000000..df35626828 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.mappingexception; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.google.common.collect.Lists; + +public class JacksonMappingExceptionUnitTest { + + @Test(expected = JsonMappingException.class) + public final void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException { + final String dtoAsString = new ObjectMapper().writeValueAsString(new MyDtoNoAccessors()); + + assertThat(dtoAsString, notNullValue()); + } + + @Test + public final void givenObjectHasNoAccessors_whenSerializingWithPrivateFieldsVisibility_thenNoException() throws JsonParseException, IOException { + final ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessors()); + + assertThat(dtoAsString, containsString("intValue")); + assertThat(dtoAsString, containsString("stringValue")); + assertThat(dtoAsString, containsString("booleanValue")); + } + + @Test + public final void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException() throws JsonParseException, IOException { + final ObjectMapper objectMapper = new ObjectMapper(); + final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessorsAndFieldVisibility()); + + assertThat(dtoAsString, containsString("intValue")); + assertThat(dtoAsString, containsString("stringValue")); + assertThat(dtoAsString, containsString("booleanValue")); + } + +} diff --git a/jackson-modules/jackson/README.md b/jackson-modules/jackson/README.md new file mode 100644 index 0000000000..50e13a5b75 --- /dev/null +++ b/jackson-modules/jackson/README.md @@ -0,0 +1,14 @@ +## Jackson Cookbooks and Examples + +This module contains articles about Jackson. + +### The Course + +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: +- [Using Optional with Jackson](https://www.baeldung.com/jackson-optional) +- [Compare Two JSON Objects with Jackson](https://www.baeldung.com/jackson-compare-two-json-objects) +- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson) +- [Inheritance with Jackson](https://www.baeldung.com/jackson-inheritance) +- [Working with Tree Model Nodes in Jackson](https://www.baeldung.com/jackson-json-node-tree-model) diff --git a/jackson-modules/jackson/pom.xml b/jackson-modules/jackson/pom.xml new file mode 100644 index 0000000000..fdf0c30749 --- /dev/null +++ b/jackson-modules/jackson/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + jackson + 0.0.1-SNAPSHOT + jackson + + + com.ossez + jackson-modules + 0.0.2-SNAPSHOT + + + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-jsonSchema + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + ${jackson.version} + + + + io.rest-assured + json-schema-validator + ${rest-assured.version} + test + + + io.rest-assured + json-path + ${rest-assured.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + jackson + + + src/main/resources + true + + + + + + + + + \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jacksoninject/Person.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jacksoninject/Person.java new file mode 100644 index 0000000000..154d994b12 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jacksoninject/Person.java @@ -0,0 +1,43 @@ +package com.ossez.jackson.deserialization.jacksoninject; + +import com.fasterxml.jackson.annotation.JacksonInject; + +import java.util.UUID; + +public class Person { + + @JacksonInject + private UUID id; + private String firstName; + private String lastName; + + public Person() { + + } + + public Person(String firstName, String lastName) { + this.id = UUID.randomUUID(); + this.firstName = firstName; + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public UUID getId() { + return id; + } +} diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsonanysetter/Inventory.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsonanysetter/Inventory.java new file mode 100644 index 0000000000..390da8a2e2 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsonanysetter/Inventory.java @@ -0,0 +1,20 @@ +package com.ossez.jackson.deserialization.jsonanysetter; + +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonAnySetter; + +public class Inventory { + + private Map countryDeliveryCost = new HashMap<>(); + + public Map getCountryDeliveryCost() { + return countryDeliveryCost; + } + + @JsonAnySetter + public void addCountryDeliveryCost(String country, Float cost) { + countryDeliveryCost.put(country, cost); + } +} diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/Book.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/Book.java new file mode 100644 index 0000000000..4d47d79d7b --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/Book.java @@ -0,0 +1,75 @@ +package com.ossez.jackson.deserialization.jsondeserialize; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.UUID; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +public class Book { + + private UUID id; + private String title; + private float price; + private String ISBN; + + @JsonDeserialize(using = CustomDateDeserializer.class) + private Date published; + private BigDecimal pages; + + public Book() { + } + + public Book(String title) { + this.id = UUID.randomUUID(); + this.title = title; + } + + public String getISBN() { + return ISBN; + } + + public void setISBN(String ISBN) { + this.ISBN = ISBN; + } + + public Date getPublished() { + return published; + } + + public void setPublished(Date published) { + this.published = published; + } + + public BigDecimal getPages() { + return pages; + } + + public void setPages(BigDecimal pages) { + this.pages = pages; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public float getPrice() { + return price; + } + + public void setPrice(float price) { + this.price = price; + } +} diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/CustomDateDeserializer.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/CustomDateDeserializer.java new file mode 100644 index 0000000000..762d198457 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/deserialization/jsondeserialize/CustomDateDeserializer.java @@ -0,0 +1,33 @@ +package com.ossez.jackson.deserialization.jsondeserialize; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class CustomDateDeserializer extends StdDeserializer { + + private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); + + public CustomDateDeserializer() { + this(null); + } + + public CustomDateDeserializer(Class vc) { + super(vc); + } + + @Override + public Date deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException { + String date = jsonparser.getText(); + try { + return formatter.parse(date); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } +} diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/domain/Person.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/domain/Person.java new file mode 100644 index 0000000000..026d52cfaa --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/domain/Person.java @@ -0,0 +1,30 @@ +package com.ossez.jackson.domain; + +public class Person { + + private String firstName; + private String lastName; + + public Person(String firstName, String lastName) { + super(); + this.firstName = firstName; + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} + diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/Event.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/Event.java new file mode 100644 index 0000000000..8843bcc287 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/Event.java @@ -0,0 +1,25 @@ +package com.ossez.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "eventType") +abstract public class Event { + private final String id; + private final Long timestamp; + + @JsonCreator + public Event(@JsonProperty("id") String id, @JsonProperty("timestamp") Long timestamp) { + this.id = id; + this.timestamp = timestamp; + } + + public Long getTimestamp() { + return timestamp; + } + + public String getId() { + return id; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceAnnotationStructure.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceAnnotationStructure.java new file mode 100644 index 0000000000..87cab760ce --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceAnnotationStructure.java @@ -0,0 +1,96 @@ +package com.ossez.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +public class IgnoranceAnnotationStructure { + public static abstract class Vehicle { + private String make; + private String model; + + protected Vehicle() { + } + + protected Vehicle(String make, String model) { + this.make = make; + this.model = model; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + } + + @JsonIgnoreProperties({ "model", "seatingCapacity" }) + public static abstract class Car extends Vehicle { + private int seatingCapacity; + @JsonIgnore + private double topSpeed; + + protected Car() { + } + + protected Car(String make, String model, int seatingCapacity, double topSpeed) { + super(make, model); + this.seatingCapacity = seatingCapacity; + this.topSpeed = topSpeed; + } + + public int getSeatingCapacity() { + return seatingCapacity; + } + + public void setSeatingCapacity(int seatingCapacity) { + this.seatingCapacity = seatingCapacity; + } + + public double getTopSpeed() { + return topSpeed; + } + + public void setTopSpeed(double topSpeed) { + this.topSpeed = topSpeed; + } + } + + public static class Sedan extends Car { + public Sedan() { + } + + public Sedan(String make, String model, int seatingCapacity, double topSpeed) { + super(make, model, seatingCapacity, topSpeed); + } + } + + public static class Crossover extends Car { + private double towingCapacity; + + public Crossover() { + } + + public Crossover(String make, String model, int seatingCapacity, double topSpeed, double towingCapacity) { + super(make, model, seatingCapacity, topSpeed); + this.towingCapacity = towingCapacity; + } + + public double getTowingCapacity() { + return towingCapacity; + } + + public void setTowingCapacity(double towingCapacity) { + this.towingCapacity = towingCapacity; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceMixinOrIntrospection.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceMixinOrIntrospection.java new file mode 100644 index 0000000000..aa352d79a0 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/IgnoranceMixinOrIntrospection.java @@ -0,0 +1,91 @@ +package com.ossez.jackson.inheritance; + +public class IgnoranceMixinOrIntrospection { + public static abstract class Vehicle { + private String make; + private String model; + + protected Vehicle() { + } + + protected Vehicle(String make, String model) { + this.make = make; + this.model = model; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + } + + public static abstract class Car extends Vehicle { + private int seatingCapacity; + private double topSpeed; + + protected Car() { + } + + protected Car(String make, String model, int seatingCapacity, double topSpeed) { + super(make, model); + this.seatingCapacity = seatingCapacity; + this.topSpeed = topSpeed; + } + + public int getSeatingCapacity() { + return seatingCapacity; + } + + public void setSeatingCapacity(int seatingCapacity) { + this.seatingCapacity = seatingCapacity; + } + + public double getTopSpeed() { + return topSpeed; + } + + public void setTopSpeed(double topSpeed) { + this.topSpeed = topSpeed; + } + } + + public static class Sedan extends Car { + public Sedan() { + } + + public Sedan(String make, String model, int seatingCapacity, double topSpeed) { + super(make, model, seatingCapacity, topSpeed); + } + } + + public static class Crossover extends Car { + private double towingCapacity; + + public Crossover() { + } + + public Crossover(String make, String model, int seatingCapacity, double topSpeed, double towingCapacity) { + super(make, model, seatingCapacity, topSpeed); + this.towingCapacity = towingCapacity; + } + + public double getTowingCapacity() { + return towingCapacity; + } + + public void setTowingCapacity(double towingCapacity) { + this.towingCapacity = towingCapacity; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdAddedToUser.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdAddedToUser.java new file mode 100644 index 0000000000..1a5afa72b1 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdAddedToUser.java @@ -0,0 +1,28 @@ +package com.ossez.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +@JsonTypeName("itemIdAddedToUser") +@JsonIgnoreProperties("id") +public class ItemIdAddedToUser extends Event { + private final String itemId; + private final Long quantity; + + @JsonCreator + public ItemIdAddedToUser(@JsonProperty("id") String id, @JsonProperty("timestamp") Long timestamp, @JsonProperty("itemId") String itemId, @JsonProperty("quantity") Long quantity) { + super(id, timestamp); + this.itemId = itemId; + this.quantity = quantity; + } + + public String getItemId() { + return itemId; + } + + public Long getQuantity() { + return quantity; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUser.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUser.java new file mode 100644 index 0000000000..88e2c7968f --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUser.java @@ -0,0 +1,26 @@ +package com.ossez.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +@JsonTypeName("itemIdRemovedFromUser") +public class ItemIdRemovedFromUser extends Event { + private final String itemId; + private final Long quantity; + + @JsonCreator + public ItemIdRemovedFromUser(@JsonProperty("id") String id, @JsonProperty("timestamp") Long timestamp, @JsonProperty("itemId") String itemId, @JsonProperty("quantity") Long quantity) { + super(id, timestamp); + this.itemId = itemId; + this.quantity = quantity; + } + + public String getItemId() { + return itemId; + } + + public Long getQuantity() { + return quantity; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConstructorStructure.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConstructorStructure.java new file mode 100644 index 0000000000..afca1443de --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConstructorStructure.java @@ -0,0 +1,92 @@ +package com.ossez.jackson.inheritance; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SubTypeConstructorStructure { + public static class Fleet { + private List vehicles; + + public List getVehicles() { + return vehicles; + } + + public void setVehicles(List vehicles) { + this.vehicles = vehicles; + } + } + + public static abstract class Vehicle { + private String make; + private String model; + + protected Vehicle(String make, String model) { + this.make = make; + this.model = model; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + } + + public static class Car extends Vehicle { + private int seatingCapacity; + private double topSpeed; + + @JsonCreator + public Car(@JsonProperty("make") String make, @JsonProperty("model") String model, @JsonProperty("seating") int seatingCapacity, @JsonProperty("topSpeed") double topSpeed) { + super(make, model); + this.seatingCapacity = seatingCapacity; + this.topSpeed = topSpeed; + } + + public int getSeatingCapacity() { + return seatingCapacity; + } + + public void setSeatingCapacity(int seatingCapacity) { + this.seatingCapacity = seatingCapacity; + } + + public double getTopSpeed() { + return topSpeed; + } + + public void setTopSpeed(double topSpeed) { + this.topSpeed = topSpeed; + } + } + + public static class Truck extends Vehicle { + private double payloadCapacity; + + @JsonCreator + public Truck(@JsonProperty("make") String make, @JsonProperty("model") String model, @JsonProperty("payload") double payloadCapacity) { + super(make, model); + this.payloadCapacity = payloadCapacity; + } + + public double getPayloadCapacity() { + return payloadCapacity; + } + + public void setPayloadCapacity(double payloadCapacity) { + this.payloadCapacity = payloadCapacity; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConversionStructure.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConversionStructure.java new file mode 100644 index 0000000000..006fc79111 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/SubTypeConversionStructure.java @@ -0,0 +1,87 @@ +package com.ossez.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class SubTypeConversionStructure { + public static abstract class Vehicle { + private String make; + private String model; + + protected Vehicle() { + } + + protected Vehicle(String make, String model) { + this.make = make; + this.model = model; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + } + + public static class Car extends Vehicle { + @JsonIgnore + private int seatingCapacity; + @JsonIgnore + private double topSpeed; + + public Car() { + } + + public Car(String make, String model, int seatingCapacity, double topSpeed) { + super(make, model); + this.seatingCapacity = seatingCapacity; + this.topSpeed = topSpeed; + } + + public int getSeatingCapacity() { + return seatingCapacity; + } + + public void setSeatingCapacity(int seatingCapacity) { + this.seatingCapacity = seatingCapacity; + } + + public double getTopSpeed() { + return topSpeed; + } + + public void setTopSpeed(double topSpeed) { + this.topSpeed = topSpeed; + } + } + + public static class Truck extends Vehicle { + @JsonIgnore + private double payloadCapacity; + + public Truck() { + } + + public Truck(String make, String model, double payloadCapacity) { + super(make, model); + this.payloadCapacity = payloadCapacity; + } + + public double getPayloadCapacity() { + return payloadCapacity; + } + + public void setPayloadCapacity(double payloadCapacity) { + this.payloadCapacity = payloadCapacity; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoAnnotatedStructure.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoAnnotatedStructure.java new file mode 100644 index 0000000000..b9b730f49f --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoAnnotatedStructure.java @@ -0,0 +1,102 @@ +package com.ossez.jackson.inheritance; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonSubTypes.Type; + +public class TypeInfoAnnotatedStructure { + public static class Fleet { + private List vehicles; + + public List getVehicles() { + return vehicles; + } + + public void setVehicles(List vehicles) { + this.vehicles = vehicles; + } + } + + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") + @JsonSubTypes({ @Type(value = Car.class, name = "car"), @Type(value = Truck.class, name = "truck") }) + public static abstract class Vehicle { + private String make; + private String model; + + protected Vehicle() { + } + + protected Vehicle(String make, String model) { + this.make = make; + this.model = model; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + } + + public static class Car extends Vehicle { + private int seatingCapacity; + private double topSpeed; + + public Car() { + } + + public Car(String make, String model, int seatingCapacity, double topSpeed) { + super(make, model); + this.seatingCapacity = seatingCapacity; + this.topSpeed = topSpeed; + } + + public int getSeatingCapacity() { + return seatingCapacity; + } + + public void setSeatingCapacity(int seatingCapacity) { + this.seatingCapacity = seatingCapacity; + } + + public double getTopSpeed() { + return topSpeed; + } + + public void setTopSpeed(double topSpeed) { + this.topSpeed = topSpeed; + } + } + + public static class Truck extends Vehicle { + private double payloadCapacity; + + public Truck() { + } + + public Truck(String make, String model, double payloadCapacity) { + super(make, model); + this.payloadCapacity = payloadCapacity; + } + + public double getPayloadCapacity() { + return payloadCapacity; + } + + public void setPayloadCapacity(double payloadCapacity) { + this.payloadCapacity = payloadCapacity; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoStructure.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoStructure.java new file mode 100644 index 0000000000..d2af497313 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/inheritance/TypeInfoStructure.java @@ -0,0 +1,96 @@ +package com.ossez.jackson.inheritance; + +import java.util.List; + +public class TypeInfoStructure { + public static class Fleet { + private List vehicles; + + public List getVehicles() { + return vehicles; + } + + public void setVehicles(List vehicles) { + this.vehicles = vehicles; + } + } + + public static abstract class Vehicle { + private String make; + private String model; + + protected Vehicle() { + } + + protected Vehicle(String make, String model) { + this.make = make; + this.model = model; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + } + + public static class Car extends Vehicle { + private int seatingCapacity; + private double topSpeed; + + public Car() { + } + + public Car(String make, String model, int seatingCapacity, double topSpeed) { + super(make, model); + this.seatingCapacity = seatingCapacity; + this.topSpeed = topSpeed; + } + + public int getSeatingCapacity() { + return seatingCapacity; + } + + public void setSeatingCapacity(int seatingCapacity) { + this.seatingCapacity = seatingCapacity; + } + + public double getTopSpeed() { + return topSpeed; + } + + public void setTopSpeed(double topSpeed) { + this.topSpeed = topSpeed; + } + } + + public static class Truck extends Vehicle { + private double payloadCapacity; + + public Truck() { + } + + public Truck(String make, String model, double payloadCapacity) { + super(make, model); + this.payloadCapacity = payloadCapacity; + } + + public double getPayloadCapacity() { + return payloadCapacity; + } + + public void setPayloadCapacity(double payloadCapacity) { + this.payloadCapacity = payloadCapacity; + } + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJackson.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJackson.java new file mode 100644 index 0000000000..4338159b18 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJackson.java @@ -0,0 +1,61 @@ +package com.ossez.jackson.jacksonvsgson; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.TimeZone; + +public class ActorJackson { + + private String imdbId; + private Date dateOfBirth; + private List filmography; + + public ActorJackson() { + super(); + } + + public ActorJackson(String imdbId, Date dateOfBirth, List filmography) { + super(); + this.imdbId = imdbId; + this.dateOfBirth = dateOfBirth; + this.filmography = filmography; + } + + @Override + public String toString() { + return "ActorJackson [imdbId=" + imdbId + ", dateOfBirth=" + formatDateOfBirth() + ", filmography=" + filmography + "]"; + } + + public String getImdbId() { + return imdbId; + } + + public void setImdbId(String imdbId) { + this.imdbId = imdbId; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public List getFilmography() { + return filmography; + } + + public void setFilmography(List filmography) { + this.filmography = filmography; + } + + private String formatDateOfBirth() { + final DateFormat formatter = new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.US); + formatter.setTimeZone(TimeZone.getTimeZone("GMT")); + return formatter.format(dateOfBirth); + } +} diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJacksonSerializer.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJacksonSerializer.java new file mode 100644 index 0000000000..bb67092bd9 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/ActorJacksonSerializer.java @@ -0,0 +1,32 @@ +package com.ossez.jackson.jacksonvsgson; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class ActorJacksonSerializer extends StdSerializer { + + private SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + + public ActorJacksonSerializer(Class t) { + super(t); + } + + @Override + public void serialize(ActorJackson actor, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + + jsonGenerator.writeStartObject(); + jsonGenerator.writeStringField("imdbId", actor.getImdbId()); + jsonGenerator.writeObjectField("dateOfBirth", actor.getDateOfBirth() != null ? sdf.format(actor.getDateOfBirth()) : null); + jsonGenerator.writeNumberField("N° Film: ", actor.getFilmography() != null ? actor.getFilmography() + .size() : null); + jsonGenerator.writeStringField("filmography", actor.getFilmography() + .stream() + .collect(Collectors.joining("-"))); + jsonGenerator.writeEndObject(); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/Movie.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/Movie.java new file mode 100644 index 0000000000..6d0feb0a32 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/Movie.java @@ -0,0 +1,50 @@ +package com.ossez.jackson.jacksonvsgson; + +import java.util.List; + +public class Movie { + + private String imdbId; + private String director; + private List actors; + + public Movie(String imdbId, String director, List actors) { + super(); + this.imdbId = imdbId; + this.director = director; + this.actors = actors; + } + + public Movie() { + super(); + } + + @Override + public String toString() { + return "Movie [imdbId=" + imdbId + ", director=" + director + ", actors=" + actors + "]"; + } + + public String getImdbId() { + return imdbId; + } + + public void setImdbId(String imdbId) { + this.imdbId = imdbId; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public List getActors() { + return actors; + } + + public void setActors(List actors) { + this.actors = actors; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/MovieWithNullValue.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/MovieWithNullValue.java new file mode 100644 index 0000000000..2f6dceb6fe --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/jacksonvsgson/MovieWithNullValue.java @@ -0,0 +1,46 @@ +package com.ossez.jackson.jacksonvsgson; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.util.List; + +public class MovieWithNullValue { + + private String imdbId; + + @JsonIgnore + private String director; + + private List actors; + + public MovieWithNullValue(String imdbID, String director, List actors) { + super(); + this.imdbId = imdbID; + this.director = director; + this.actors = actors; + } + + public String getImdbID() { + return imdbId; + } + + public void setImdbID(String imdbID) { + this.imdbId = imdbID; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public List getActors() { + return actors; + } + + public void setActors(List actors) { + this.actors = actors; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/node/JsonNodeIterator.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/node/JsonNodeIterator.java new file mode 100644 index 0000000000..a368e0adb0 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/node/JsonNodeIterator.java @@ -0,0 +1,62 @@ +package com.ossez.jackson.node; + +import java.util.Iterator; +import java.util.Map.Entry; + +import com.fasterxml.jackson.databind.JsonNode; + +public class JsonNodeIterator { + + private static final String NEW_LINE = "\n"; + private static final String FIELD_DELIMITER = ": "; + private static final String ARRAY_PREFIX = "- "; + private static final String YAML_PREFIX = " "; + + public String toYaml(JsonNode root) { + StringBuilder yaml = new StringBuilder(); + processNode(root, yaml, 0); + return yaml.toString(); + } + + private void processNode(JsonNode jsonNode, StringBuilder yaml, int depth) { + if (jsonNode.isValueNode()) { + yaml.append(jsonNode.asText()); + } + else if (jsonNode.isArray()) { + for (JsonNode arrayItem : jsonNode) { + appendNodeToYaml(arrayItem, yaml, depth, true); + } + } + else if (jsonNode.isObject()) { + appendNodeToYaml(jsonNode, yaml, depth, false); + } + } + + private void appendNodeToYaml(JsonNode node, StringBuilder yaml, int depth, boolean isArrayItem) { + Iterator> fields = node.fields(); + boolean isFirst = true; + while (fields.hasNext()) { + Entry jsonField = fields.next(); + addFieldNameToYaml(yaml, jsonField.getKey(), depth, isArrayItem && isFirst); + processNode(jsonField.getValue(), yaml, depth+1); + isFirst = false; + } + + } + + private void addFieldNameToYaml(StringBuilder yaml, String fieldName, int depth, boolean isFirstInArray) { + if (yaml.length()>0) { + yaml.append(NEW_LINE); + int requiredDepth = (isFirstInArray) ? depth-1 : depth; + for(int i = 0; i < requiredDepth; i++) { + yaml.append(YAML_PREFIX); + } + if (isFirstInArray) { + yaml.append(ARRAY_PREFIX); + } + } + yaml.append(fieldName); + yaml.append(FIELD_DELIMITER); + } + +} diff --git a/jackson-modules/jackson/src/main/java/com/ossez/jackson/optionalwithjackson/Book.java b/jackson-modules/jackson/src/main/java/com/ossez/jackson/optionalwithjackson/Book.java new file mode 100644 index 0000000000..aeda5c9b92 --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/ossez/jackson/optionalwithjackson/Book.java @@ -0,0 +1,25 @@ +package com.ossez.jackson.optionalwithjackson; + +import java.util.Optional; + +public class Book { + + private String title; + private Optional subTitle; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Optional getSubTitle() { + return subTitle; + } + + public void setSubTitle(Optional subTitle) { + this.subTitle = subTitle; + } +} diff --git a/jackson-modules/jackson/src/main/resources/example1.json b/jackson-modules/jackson/src/main/resources/example1.json new file mode 100644 index 0000000000..46d2982cec --- /dev/null +++ b/jackson-modules/jackson/src/main/resources/example1.json @@ -0,0 +1,12 @@ +{ + "collection": [ + { + "name": "Test order1", + "detail": "ahk ks" + }, + { + "name": "Test order2", + "detail": "Fisteku" + } + ] +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/resources/example2.json b/jackson-modules/jackson/src/main/resources/example2.json new file mode 100644 index 0000000000..f4433731e6 --- /dev/null +++ b/jackson-modules/jackson/src/main/resources/example2.json @@ -0,0 +1,10 @@ +[ + { + "name": "Test order1", + "detail": "ahk ks" + }, + { + "name": "Test order2", + "detail": "Fisteku" + } +] \ No newline at end of file diff --git a/jackson-modules/jackson/src/main/resources/logback.xml b/jackson-modules/jackson/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/jackson-modules/jackson/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Address.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Address.java new file mode 100644 index 0000000000..f0b3b00efe --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Address.java @@ -0,0 +1,33 @@ +package com.ossez.jackson.dtos; + +public class Address { + + String streetNumber; + String streetName; + String city; + + public String getStreetNumber() { + return streetNumber; + } + + public void setStreetNumber(String streetNumber) { + this.streetNumber = streetNumber; + } + + public String getStreetName() { + return streetName; + } + + public void setStreetName(String streetName) { + this.streetName = streetName; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/MyDto.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/MyDto.java new file mode 100644 index 0000000000..977358a49b --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/MyDto.java @@ -0,0 +1,54 @@ +package com.ossez.jackson.dtos; + +public class MyDto { + + private String stringValue; + private int intValue; + private boolean booleanValue; + + public MyDto() { + super(); + } + + public MyDto(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + // + + @Override + public String toString() { + return "MyDto [stringValue=" + stringValue + ", intValue=" + intValue + ", booleanValue=" + booleanValue + "]"; + } + +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Person.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Person.java new file mode 100644 index 0000000000..538128de83 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/Person.java @@ -0,0 +1,47 @@ +package com.ossez.jackson.dtos; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; + +@JacksonXmlRootElement(localName = "person") +public final class Person { + private String firstName; + private String lastName; + private List phoneNumbers = new ArrayList<>(); + private List
address = new ArrayList<>(); + + public List
getAddress() { + return address; + } + + public void setAddress(List
address) { + this.address = address; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getPhoneNumbers() { + return phoneNumbers; + } + + public void setPhoneNumbers(List phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/User.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/User.java new file mode 100644 index 0000000000..59a1a19ef0 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/dtos/User.java @@ -0,0 +1,26 @@ +package com.ossez.jackson.dtos; + +public class User { + public int id; + public String name; + + public User() { + super(); + } + + public User(final int id, final String name) { + this.id = id; + this.name = name; + } + + // API + + public int getId() { + return id; + } + + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/IgnoranceUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/IgnoranceUnitTest.java new file mode 100644 index 0000000000..e0ebbbdb33 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/IgnoranceUnitTest.java @@ -0,0 +1,92 @@ +package com.ossez.jackson.inheritance; + +import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; + +import org.junit.Test; + +import java.util.List; +import java.util.ArrayList; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.introspect.AnnotatedMember; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; + +public class IgnoranceUnitTest { + private static abstract class CarMixIn { + @JsonIgnore + public String make; + @JsonIgnore + public String topSpeed; + } + + private static class IgnoranceIntrospector extends JacksonAnnotationIntrospector { + private static final long serialVersionUID = 1422295680188892323L; + + public boolean hasIgnoreMarker(AnnotatedMember m) { + return m.getDeclaringClass() == IgnoranceMixinOrIntrospection.Vehicle.class && m.getName() == "model" || m.getDeclaringClass() == IgnoranceMixinOrIntrospection.Car.class || m.getName() == "towingCapacity" || super.hasIgnoreMarker(m); + } + } + + @Test + public void givenAnnotations_whenIgnoringProperties_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + + IgnoranceAnnotationStructure.Sedan sedan = new IgnoranceAnnotationStructure.Sedan("Mercedes-Benz", "S500", 5, 250.0); + IgnoranceAnnotationStructure.Crossover crossover = new IgnoranceAnnotationStructure.Crossover("BMW", "X6", 5, 250.0, 6000.0); + + List vehicles = new ArrayList<>(); + vehicles.add(sedan); + vehicles.add(crossover); + + String jsonDataString = mapper.writeValueAsString(vehicles); + + assertThat(jsonDataString, containsString("make")); + assertThat(jsonDataString, not(containsString("model"))); + assertThat(jsonDataString, not(containsString("seatingCapacity"))); + assertThat(jsonDataString, not(containsString("topSpeed"))); + assertThat(jsonDataString, containsString("towingCapacity")); + } + + @Test + public void givenMixIns_whenIgnoringProperties_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.addMixIn(IgnoranceMixinOrIntrospection.Car.class, CarMixIn.class); + + String jsonDataString = instantiateAndSerializeObjects(mapper); + + assertThat(jsonDataString, not(containsString("make"))); + assertThat(jsonDataString, containsString("model")); + assertThat(jsonDataString, containsString("seatingCapacity")); + assertThat(jsonDataString, not(containsString("topSpeed"))); + assertThat(jsonDataString, containsString("towingCapacity")); + } + + @Test + public void givenIntrospection_whenIgnoringProperties_thenCorrect() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setAnnotationIntrospector(new IgnoranceIntrospector()); + + String jsonDataString = instantiateAndSerializeObjects(mapper); + + assertThat(jsonDataString, containsString("make")); + assertThat(jsonDataString, not(containsString("model"))); + assertThat(jsonDataString, not(containsString("seatingCapacity"))); + assertThat(jsonDataString, not(containsString("topSpeed"))); + assertThat(jsonDataString, not(containsString("towingCapacity"))); + } + + private String instantiateAndSerializeObjects(ObjectMapper mapper) throws JsonProcessingException { + IgnoranceMixinOrIntrospection.Sedan sedan = new IgnoranceMixinOrIntrospection.Sedan("Mercedes-Benz", "S500", 5, 250.0); + IgnoranceMixinOrIntrospection.Crossover crossover = new IgnoranceMixinOrIntrospection.Crossover("BMW", "X6", 5, 250.0, 6000.0); + + List vehicles = new ArrayList<>(); + vehicles.add(sedan); + vehicles.add(crossover); + + return mapper.writeValueAsString(vehicles); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUserUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUserUnitTest.java new file mode 100644 index 0000000000..6e9c3f5136 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/ItemIdRemovedFromUserUnitTest.java @@ -0,0 +1,41 @@ +package com.ossez.jackson.inheritance; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ItemIdRemovedFromUserUnitTest { + @Test + public void givenRemoveItemJson_whenDeserialize_shouldHaveProperClassType() throws IOException { + // given + Event event = new ItemIdRemovedFromUser("1", 12345567L, "item_1", 2L); + ObjectMapper objectMapper = new ObjectMapper(); + String eventJson = objectMapper.writeValueAsString(event); + + // when + Event result = new ObjectMapper().readValue(eventJson, Event.class); + + // then + assertTrue(result instanceof ItemIdRemovedFromUser); + assertEquals("item_1", ((ItemIdRemovedFromUser) result).getItemId()); + } + + @Test + public void givenAdddItemJson_whenSerialize_shouldIgnoreIdPropertyFromSuperclass() throws IOException { + // given + Event event = new ItemIdAddedToUser("1", 12345567L, "item_1", 2L); + ObjectMapper objectMapper = new ObjectMapper(); + + // when + String eventJson = objectMapper.writeValueAsString(event); + + // then + assertFalse(eventJson.contains("id")); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/SubTypeHandlingUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/SubTypeHandlingUnitTest.java new file mode 100644 index 0000000000..3b95f7e283 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/SubTypeHandlingUnitTest.java @@ -0,0 +1,43 @@ +package com.ossez.jackson.inheritance; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import java.util.List; +import java.util.ArrayList; +import java.io.IOException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class SubTypeHandlingUnitTest { + @Test + public void givenSubTypes_whenConvertingObjects_thenDataValuesArePreserved() { + ObjectMapper mapper = new ObjectMapper(); + + SubTypeConversionStructure.Car car = new SubTypeConversionStructure.Car("Mercedes-Benz", "S500", 5, 250.0); + SubTypeConversionStructure.Truck truck = mapper.convertValue(car, SubTypeConversionStructure.Truck.class); + + assertEquals("Mercedes-Benz", truck.getMake()); + assertEquals("S500", truck.getModel()); + } + + @Test + public void givenSubType_whenNotUsingNoArgsConstructors_thenSucceed() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + mapper.enableDefaultTyping(); + + SubTypeConstructorStructure.Car car = new SubTypeConstructorStructure.Car("Mercedes-Benz", "S500", 5, 250.0); + SubTypeConstructorStructure.Truck truck = new SubTypeConstructorStructure.Truck("Isuzu", "NQR", 7500.0); + + List vehicles = new ArrayList<>(); + vehicles.add(car); + vehicles.add(truck); + + SubTypeConstructorStructure.Fleet serializedFleet = new SubTypeConstructorStructure.Fleet(); + serializedFleet.setVehicles(vehicles); + + String jsonDataString = mapper.writeValueAsString(serializedFleet); + mapper.readValue(jsonDataString, SubTypeConstructorStructure.Fleet.class); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/TypeInfoInclusionUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/TypeInfoInclusionUnitTest.java new file mode 100644 index 0000000000..d47a2e4283 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/inheritance/TypeInfoInclusionUnitTest.java @@ -0,0 +1,61 @@ +package com.ossez.jackson.inheritance; + +import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.instanceOf; + +import org.junit.Test; + +import java.util.List; +import java.util.ArrayList; +import java.io.IOException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class TypeInfoInclusionUnitTest { + @Test + public void givenTypeInfo_whenAnnotatingGlobally_thenTypesAreCorrectlyRecovered() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + mapper.enableDefaultTyping(); + + TypeInfoStructure.Car car = new TypeInfoStructure.Car("Mercedes-Benz", "S500", 5, 250.0); + TypeInfoStructure.Truck truck = new TypeInfoStructure.Truck("Isuzu", "NQR", 7500.0); + + List vehicles = new ArrayList<>(); + vehicles.add(car); + vehicles.add(truck); + + TypeInfoStructure.Fleet serializedFleet = new TypeInfoStructure.Fleet(); + serializedFleet.setVehicles(vehicles); + + String jsonDataString = mapper.writeValueAsString(serializedFleet); + TypeInfoStructure.Fleet deserializedFleet = mapper.readValue(jsonDataString, TypeInfoStructure.Fleet.class); + + assertThat(deserializedFleet.getVehicles() + .get(0), instanceOf(TypeInfoStructure.Car.class)); + assertThat(deserializedFleet.getVehicles() + .get(1), instanceOf(TypeInfoStructure.Truck.class)); + } + + @Test + public void givenTypeInfo_whenAnnotatingPerClass_thenTypesAreCorrectlyRecovered() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + TypeInfoAnnotatedStructure.Car car = new TypeInfoAnnotatedStructure.Car("Mercedes-Benz", "S500", 5, 250.0); + TypeInfoAnnotatedStructure.Truck truck = new TypeInfoAnnotatedStructure.Truck("Isuzu", "NQR", 7500.0); + + List vehicles = new ArrayList<>(); + vehicles.add(car); + vehicles.add(truck); + + TypeInfoAnnotatedStructure.Fleet serializedFleet = new TypeInfoAnnotatedStructure.Fleet(); + serializedFleet.setVehicles(vehicles); + + String jsonDataString = mapper.writeValueAsString(serializedFleet); + TypeInfoAnnotatedStructure.Fleet deserializedFleet = mapper.readValue(jsonDataString, TypeInfoAnnotatedStructure.Fleet.class); + + assertThat(deserializedFleet.getVehicles() + .get(0), instanceOf(TypeInfoAnnotatedStructure.Car.class)); + assertThat(deserializedFleet.getVehicles() + .get(1), instanceOf(TypeInfoAnnotatedStructure.Truck.class)); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonDeserializeUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonDeserializeUnitTest.java new file mode 100644 index 0000000000..09ba00bac1 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonDeserializeUnitTest.java @@ -0,0 +1,38 @@ +package com.ossez.jackson.jacksonvsgson; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import org.junit.Test; +import com.fasterxml.jackson.databind.ObjectMapper; +import static org.junit.Assert.assertEquals; + +public class JacksonDeserializeUnitTest { + + @Test + public void whenSimpleDeserialize_thenCorrect() throws IOException { + + final String jsonInput = "{\"imdbId\":\"tt0472043\",\"actors\":[{\"imdbId\":\"nm2199632\",\"dateOfBirth\":\"1982-09-21T12:00:00+01:00\",\"filmography\":[\"Apocalypto\",\"Beatdown\",\"Wind Walkers\"]}]}"; + final ObjectMapper mapper = new ObjectMapper(); + final Movie movie = mapper.readValue(jsonInput, Movie.class); + + final String expectedOutput = "Movie [imdbId=tt0472043, director=null, actors=[ActorJackson [imdbId=nm2199632, dateOfBirth=Tue Sep 21 11:00:00 GMT 1982, filmography=[Apocalypto, Beatdown, Wind Walkers]]]]"; + assertEquals(expectedOutput, movie.toString()); + } + + @Test + public void whenCustomDeserialize_thenCorrect() throws IOException { + + final String jsonInput = "{\"imdbId\":\"tt0472043\",\"director\":\"Mel Gibson\",\"actors\":[{\"imdbId\":\"nm2199632\",\"dateOfBirth\":\"1982-09-21T12:00:00+01:00\",\"filmography\":[\"Apocalypto\",\"Beatdown\",\"Wind Walkers\"]}]}"; + + final ObjectMapper mapper = new ObjectMapper(); + final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + mapper.setDateFormat(df); + + final Movie movie = mapper.readValue(jsonInput, Movie.class); + + final String expectedOutput = "Movie [imdbId=tt0472043, director=Mel Gibson, actors=[ActorJackson [imdbId=nm2199632, dateOfBirth=Tue Sep 21 11:00:00 GMT 1982, filmography=[Apocalypto, Beatdown, Wind Walkers]]]]"; + assertEquals(expectedOutput, movie.toString()); + } + +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonSerializeUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonSerializeUnitTest.java new file mode 100644 index 0000000000..dccedfd1be --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/jacksonvsgson/JacksonSerializeUnitTest.java @@ -0,0 +1,58 @@ +package com.ossez.jackson.jacksonvsgson; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.TimeZone; + +import org.junit.Assert; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; + +public class JacksonSerializeUnitTest { + + @Test + public void whenSimpleSerialize_thenCorrect() throws JsonProcessingException, ParseException { + + final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + sdf.setTimeZone(TimeZone.getTimeZone("GMT")); + + final ActorJackson rudyYoungblood = new ActorJackson("nm2199632", sdf.parse("21-09-1982"), Arrays.asList("Apocalypto", "Beatdown", "Wind Walkers")); + final Movie movie = new Movie("tt0472043", "Mel Gibson", Arrays.asList(rudyYoungblood)); + + final ObjectMapper mapper = new ObjectMapper(); + final String jsonResult = mapper.writeValueAsString(movie); + + final String expectedOutput = "{\"imdbId\":\"tt0472043\",\"director\":\"Mel Gibson\",\"actors\":[{\"imdbId\":\"nm2199632\",\"dateOfBirth\":401414400000,\"filmography\":[\"Apocalypto\",\"Beatdown\",\"Wind Walkers\"]}]}"; + Assert.assertEquals(jsonResult, expectedOutput); + } + + @Test + public void whenCustomSerialize_thenCorrect() throws ParseException, IOException { + + final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + + final ActorJackson rudyYoungblood = new ActorJackson("nm2199632", sdf.parse("21-09-1982"), Arrays.asList("Apocalypto", "Beatdown", "Wind Walkers")); + final MovieWithNullValue movieWithNullValue = new MovieWithNullValue(null, "Mel Gibson", Arrays.asList(rudyYoungblood)); + + final SimpleModule module = new SimpleModule(); + module.addSerializer(new ActorJacksonSerializer(ActorJackson.class)); + final ObjectMapper mapper = new ObjectMapper(); + + final String jsonResult = mapper.registerModule(module) + .writer(new DefaultPrettyPrinter()) + .writeValueAsString(movieWithNullValue); + + final Object json = mapper.readValue("{\"actors\":[{\"imdbId\":\"nm2199632\",\"dateOfBirth\":\"21-09-1982\",\"N° Film: \":3,\"filmography\":\"Apocalypto-Beatdown-Wind Walkers\"}],\"imdbID\":null}", Object.class); + final String expectedOutput = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT) + .writeValueAsString(json); + + Assert.assertEquals(jsonResult, expectedOutput); + } +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/jsoncompare/JsonCompareUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/jsoncompare/JsonCompareUnitTest.java new file mode 100644 index 0000000000..7c21b79bc2 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/jsoncompare/JsonCompareUnitTest.java @@ -0,0 +1,126 @@ +package com.ossez.jackson.jsoncompare; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.Comparator; + +import org.junit.Test; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.NumericNode; +import com.fasterxml.jackson.databind.node.TextNode; + +public class JsonCompareUnitTest { + + @Test + public void givenTwoSameJsonDataObjects_whenCompared_thenAreEqual() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + String s1 = "{\"employee\": {\"id\": \"1212\",\"fullName\": \"John Miles\", \"age\": 34 }}"; + String s2 = "{\"employee\": {\"id\": \"1212\",\"age\": 34, \"fullName\": \"John Miles\" }}"; + + JsonNode actualObj1 = mapper.readTree(s1); + JsonNode actualObj2 = mapper.readTree(s2); + + assertEquals(actualObj1, actualObj2); + + } + + @Test + public void givenTwoSameNestedJsonDataObjects_whenCompared_thenEqual() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + String s1 = "{\"employee\": {\"id\": \"1212\",\"fullName\": \"John Miles\",\"age\": 34, \"contact\":{\"email\": \"john@xyz.com\",\"phone\": \"9999999999\"} }}"; + String s2 = "{\"employee\": {\"id\": \"1212\",\"fullName\": \"John Miles\",\"age\": 34, \"contact\":{\"email\": \"john@xyz.com\",\"phone\": \"9999999999\"} }}"; + + JsonNode actualObj1 = mapper.readTree(s1); + JsonNode actualObj2 = mapper.readTree(s2); + + assertEquals(actualObj1, actualObj2); + + } + + @Test + public void givenTwoSameListJsonDataObjects_whenCompared_thenEqual() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + String s1 = "{\"employee\": {\"id\": \"1212\",\"fullName\": \"John Miles\",\"age\": 34, \"skills\":[\"Java\", \"C++\", \"Python\"] }}"; + String s2 = "{\"employee\": {\"id\": \"1212\",\"fullName\": \"John Miles\",\"age\": 34, \"skills\":[\"Java\", \"C++\", \"Python\"] }}"; + + JsonNode actualObj1 = mapper.readTree(s1); + JsonNode actualObj2 = mapper.readTree(s2); + + assertEquals(actualObj1, actualObj2); + + } + + @Test + public void givenTwoJsonDataObjects_whenComparedUsingCustomNumericNodeComparator_thenEqual() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + String s1 = "{\"name\": \"John\",\"score\":5.0}"; + String s2 = "{\"name\": \"John\",\"score\":5}"; + JsonNode actualObj1 = mapper.readTree(s1); + JsonNode actualObj2 = mapper.readTree(s2); + + NumericNodeComparator cmp = new NumericNodeComparator(); + + assertNotEquals(actualObj1, actualObj2); + assertTrue(actualObj1.equals(cmp, actualObj2)); + + } + + public class NumericNodeComparator implements Comparator { + @Override + public int compare(JsonNode o1, JsonNode o2) { + if (o1.equals(o2)) { + return 0; + } + if ((o1 instanceof NumericNode) && (o2 instanceof NumericNode)) { + Double d1 = ((NumericNode) o1).asDouble(); + Double d2 = ((NumericNode) o2).asDouble(); + if (d1.compareTo(d2) == 0) { + return 0; + } + } + return 1; + } + } + + @Test + public void givenTwoJsonDataObjects_whenComparedUsingCustomTextNodeComparator_thenEqual() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + String s1 = "{\"name\": \"JOHN\",\"score\":5}"; + String s2 = "{\"name\": \"John\",\"score\":5}"; + JsonNode actualObj1 = mapper.readTree(s1); + JsonNode actualObj2 = mapper.readTree(s2); + + TextNodeComparator cmp = new TextNodeComparator(); + + assertNotEquals(actualObj1, actualObj2); + assertTrue(actualObj1.equals(cmp, actualObj2)); + + } + + public class TextNodeComparator implements Comparator { + @Override + public int compare(JsonNode o1, JsonNode o2) { + if (o1.equals(o2)) { + return 0; + } + if ((o1 instanceof TextNode) && (o2 instanceof TextNode)) { + String s1 = ((TextNode) o1).asText(); + String s2 = ((TextNode) o2).asText(); + if (s1.equalsIgnoreCase(s2)) { + return 0; + } + } + return 1; + } + } +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/ExampleStructure.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/ExampleStructure.java new file mode 100644 index 0000000000..79fc5760c1 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/ExampleStructure.java @@ -0,0 +1,18 @@ +package com.ossez.jackson.node; + +import java.io.IOException; +import java.io.InputStream; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ExampleStructure { + private static ObjectMapper mapper = new ObjectMapper(); + + static JsonNode getExampleRoot() throws IOException { + InputStream exampleInput = ExampleStructure.class.getClassLoader() + .getResourceAsStream("node_example.json"); + JsonNode rootNode = mapper.readTree(exampleInput); + return rootNode; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/JsonNodeIteratorUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/JsonNodeIteratorUnitTest.java new file mode 100644 index 0000000000..b80011e96e --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/JsonNodeIteratorUnitTest.java @@ -0,0 +1,37 @@ +package com.ossez.jackson.node; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.junit.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +public class JsonNodeIteratorUnitTest { + + private JsonNodeIterator onTest = new JsonNodeIterator(); + private static String expectedYaml = "name: \n" + + " first: Tatu\n" + + " last: Saloranta\n" + + "title: Jackson founder\n" + + "company: FasterXML\n" + + "pets: \n" + + "- type: dog\n" + + " number: 1\n" + + "- type: fish\n" + + " number: 50"; + +@Test +public void givenANodeTree_whenIteratingSubNodes_thenWeFindExpected() throws IOException { + final JsonNode rootNode = ExampleStructure.getExampleRoot(); + + String yaml = onTest.toYaml(rootNode); + System.out.println(yaml.toString()); + + assertEquals(expectedYaml, yaml); + +} + + +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeBean.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeBean.java new file mode 100644 index 0000000000..bd38487f1f --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeBean.java @@ -0,0 +1,30 @@ +package com.ossez.jackson.node; + +public class NodeBean { + private int id; + private String name; + + public NodeBean() { + } + + public NodeBean(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeOperationUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeOperationUnitTest.java new file mode 100644 index 0000000000..4e801e6ed9 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/node/NodeOperationUnitTest.java @@ -0,0 +1,119 @@ +package com.ossez.jackson.node; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.junit.Test; + +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; + +public class NodeOperationUnitTest { + private static ObjectMapper mapper = new ObjectMapper(); + + @Test + public void givenAnObject_whenConvertingIntoNode_thenCorrect() { + final NodeBean fromValue = new NodeBean(2016, "baeldung.com"); + + final JsonNode node = mapper.valueToTree(fromValue); + + assertEquals(2016, node.get("id") + .intValue()); + assertEquals("baeldung.com", node.get("name") + .textValue()); + } + + @Test + public void givenANode_whenWritingOutAsAJsonString_thenCorrect() throws IOException { + final String pathToTestFile = "node_to_json_test.json"; + final char[] characterBuffer = new char[50]; + + final JsonNode node = mapper.createObjectNode(); + ((ObjectNode) node).put("id", 2016); + ((ObjectNode) node).put("name", "baeldung.com"); + + try (FileWriter outputStream = new FileWriter(pathToTestFile)) { + mapper.writeValue(outputStream, node); + } + + try (FileReader inputStreamForAssertion = new FileReader(pathToTestFile)) { + inputStreamForAssertion.read(characterBuffer); + } + final String textContentOfTestFile = new String(characterBuffer); + + assertThat(textContentOfTestFile, containsString("2016")); + assertThat(textContentOfTestFile, containsString("baeldung.com")); + + Files.delete(Paths.get(pathToTestFile)); + } + + @Test + public void givenANode_whenConvertingIntoAnObject_thenCorrect() throws JsonProcessingException { + final JsonNode node = mapper.createObjectNode(); + ((ObjectNode) node).put("id", 2016); + ((ObjectNode) node).put("name", "baeldung.com"); + + final NodeBean toValue = mapper.treeToValue(node, NodeBean.class); + + assertEquals(2016, toValue.getId()); + assertEquals("baeldung.com", toValue.getName()); + } + + @Test + public void givenANode_whenAddingIntoATree_thenCorrect() throws IOException { + final JsonNode rootNode = ExampleStructure.getExampleRoot(); + final ObjectNode addedNode = ((ObjectNode) rootNode).putObject("address"); + addedNode.put("city", "Seattle") + .put("state", "Washington") + .put("country", "United States"); + + assertFalse(rootNode.path("address") + .isMissingNode()); + assertEquals("Seattle", rootNode.path("address") + .path("city") + .textValue()); + assertEquals("Washington", rootNode.path("address") + .path("state") + .textValue()); + assertEquals("United States", rootNode.path("address") + .path("country") + .textValue()); + } + + @Test + public void givenANode_whenModifyingIt_thenCorrect() throws IOException { + final String newString = "{\"nick\": \"cowtowncoder\"}"; + final JsonNode newNode = mapper.readTree(newString); + + final JsonNode rootNode = ExampleStructure.getExampleRoot(); + ((ObjectNode) rootNode).set("name", newNode); + + assertFalse(rootNode.path("name") + .path("nick") + .isMissingNode()); + assertEquals("cowtowncoder", rootNode.path("name") + .path("nick") + .textValue()); + } + + @Test + public void givenANode_whenRemovingFromATree_thenCorrect() throws IOException { + final JsonNode rootNode = ExampleStructure.getExampleRoot(); + ((ObjectNode) rootNode).remove("company"); + + assertTrue(rootNode.path("company") + .isMissingNode()); + } + +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/optionalwithjackson/OptionalTypeUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/optionalwithjackson/OptionalTypeUnitTest.java new file mode 100644 index 0000000000..89611a74d0 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/optionalwithjackson/OptionalTypeUnitTest.java @@ -0,0 +1,61 @@ +package com.ossez.jackson.optionalwithjackson; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import static io.restassured.path.json.JsonPath.from; +import java.io.IOException; +import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class OptionalTypeUnitTest { + + ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module()); + + @Test + public void givenPresentOptional_whenSerializing_thenValueInJson() throws JsonProcessingException { + + String subTitle = "The Parish Boy's Progress"; + Book book = new Book(); + book.setTitle("Oliver Twist"); + book.setSubTitle(Optional.of(subTitle)); + + String result = mapper.writeValueAsString(book); + + assertThat(from(result).getString("subTitle")).isEqualTo(subTitle); + } + + @Test + public void givenEmptyOptional_whenSerializing_thenNullValue() throws JsonProcessingException { + + Book book = new Book(); + book.setTitle("Oliver Twist"); + book.setSubTitle(Optional.empty()); + + String result = mapper.writeValueAsString(book); + + assertThat(from(result).getString("subTitle")).isNull(); + } + + @Test + public void givenField_whenDeserializingIntoOptional_thenIsPresentWithValue() throws IOException { + + String subTitle = "The Parish Boy's Progress"; + String book = "{ \"title\": \"Oliver Twist\", \"subTitle\": \"" + subTitle + "\" }"; + + Book result = mapper.readValue(book, Book.class); + + assertThat(result.getSubTitle()).isEqualTo(Optional.of(subTitle)); + } + + @Test + public void givenNullField_whenDeserializingIntoOptional_thenIsEmpty() throws IOException { + + String book = "{ \"title\": \"Oliver Twist\", \"subTitle\": null }"; + + Book result = mapper.readValue(book, Book.class); + + assertThat(result.getSubTitle()).isEmpty(); + } +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/JacksonPrettyPrintUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/JacksonPrettyPrintUnitTest.java new file mode 100644 index 0000000000..81278f2fd0 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/JacksonPrettyPrintUnitTest.java @@ -0,0 +1,50 @@ +package com.ossez.jackson.sandbox; + +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonPrettyPrintUnitTest { + + @Test + public final void whenDeserializing_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + // final String fileName = "src/main/resources/example1.json"; + final String fileName = "src/main/resources/example1.json"; + + new File(fileName); + + printJsonFromFile(fileName); + } + + // + + public static void printJsonFromFile(final String fileName) { + System.out.println("-----------------"); + final ObjectMapper mapper = new ObjectMapper(); + try { + final Object json = mapper.readValue(readFile(fileName, StandardCharsets.UTF_8), Object.class); + System.out.println(mapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(json)); + } catch (final IOException e) { + e.printStackTrace(); + } + System.out.println("-----------------"); + } + + static String readFile(final String path, final Charset encoding) throws IOException { + final byte[] encoded = Files.readAllBytes(Paths.get(path)); + return encoding.decode(ByteBuffer.wrap(encoded)) + .toString(); + } + +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/SandboxUnitTest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/SandboxUnitTest.java new file mode 100644 index 0000000000..3c67ae9bad --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/SandboxUnitTest.java @@ -0,0 +1,29 @@ +package com.ossez.jackson.sandbox; + +import java.io.IOException; + +import org.junit.Test; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class SandboxUnitTest { + + @Test + public final void whenDeserializing_thenCorrect() throws JsonParseException, JsonMappingException, IOException { + final TestElement testElement = new TestElement(); + testElement.setX(10); + testElement.setY("adasd"); + final ObjectMapper om = new ObjectMapper(); + om.setVisibility(om.getSerializationConfig() + .getDefaultVisibilityChecker() + .withFieldVisibility(JsonAutoDetect.Visibility.ANY) + .withGetterVisibility(JsonAutoDetect.Visibility.NONE)); + + final String serialized = om.writeValueAsString(testElement); + System.err.println(serialized); + } + +} diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/TestElement.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/TestElement.java new file mode 100644 index 0000000000..8d44842054 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/sandbox/TestElement.java @@ -0,0 +1,25 @@ +package com.ossez.jackson.sandbox; + +public class TestElement { + + int x; + + private transient String y; + + public int getX() { + return x; + } + + public void setX(final int x) { + this.x = x; + } + + public String getY() { + return y; + } + + public void setY(final String y) { + this.y = y; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/test/UnitTestSuite.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/test/UnitTestSuite.java new file mode 100644 index 0000000000..5f715ec599 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/test/UnitTestSuite.java @@ -0,0 +1,14 @@ +package com.ossez.jackson.test; + +import com.ossez.jackson.sandbox.JacksonPrettyPrintUnitTest; +import com.ossez.jackson.sandbox.SandboxUnitTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ // @formatter:off + JacksonPrettyPrintUnitTest.class + , SandboxUnitTest.class +}) // @formatter:on +public class UnitTestSuite { +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/IEntity.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/IEntity.java new file mode 100644 index 0000000000..cc2269ad96 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/IEntity.java @@ -0,0 +1,5 @@ +package com.ossez.jackson.try1; + +public interface IEntity { + public int getId(); +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequest.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequest.java new file mode 100644 index 0000000000..fdeac9b7a3 --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequest.java @@ -0,0 +1,38 @@ +package com.ossez.jackson.try1; + +import java.io.Serializable; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonDeserialize(using = RestLoaderRequestDeserializer.class) +// @Produces(MediaType.APPLICATION_JSON) +public class RestLoaderRequest implements Serializable { + private T entity; // entity to load field to + private String className; // actual class of entity + private String fieldName; // fieldName to lazy REST load + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(final String fieldName) { + this.fieldName = fieldName; + } + + public String getClassName() { + return className; + } + + public void setClassName(final String className) { + this.className = className; + } + + public T getEntity() { + return entity; + } + + public void setEntity(final T entity) { + this.entity = entity; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequestDeserializer.java b/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequestDeserializer.java new file mode 100644 index 0000000000..b49d6b1d8e --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/ossez/jackson/try1/RestLoaderRequestDeserializer.java @@ -0,0 +1,48 @@ +package com.ossez.jackson.try1; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +public class RestLoaderRequestDeserializer extends StdDeserializer> { + private static final long serialVersionUID = -4245207329377196889L; + + public RestLoaderRequestDeserializer() { + this(null); + } + + public RestLoaderRequestDeserializer(final Class vc) { + super(vc); + } + + @Override + public RestLoaderRequest deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException, JsonProcessingException { + try { + final ObjectCodec objectCodec = jp.getCodec(); + final JsonNode node = objectCodec.readTree(jp); + final String className = node.get("className") + .textValue(); + final String fieldName = node.get("fieldName") + .textValue(); + + final Class clazz = Class.forName(className); + + final JsonNode rawEntityNode = node.get("entity"); + // How to deserialize rawEntityNode to T based on className ? + + final RestLoaderRequest request = new RestLoaderRequest(); + request.setClassName(className); + request.setFieldName(fieldName); + } catch (final ClassNotFoundException e) { + e.printStackTrace(); + } + + return null; + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/resources/author-jsonpropertyorder-schema.json b/jackson-modules/jackson/src/test/resources/author-jsonpropertyorder-schema.json new file mode 100644 index 0000000000..8e7a85372c --- /dev/null +++ b/jackson-modules/jackson/src/test/resources/author-jsonpropertyorder-schema.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Author", + "description": "An author", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "type": "object" + } + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "items", + "firstName", + "lastName", + "id" + ] +} \ No newline at end of file diff --git a/jackson-modules/jackson/src/test/resources/node_example-1.json b/jackson-modules/jackson/src/test/resources/node_example-1.json new file mode 100644 index 0000000000..e766981a50 --- /dev/null +++ b/jackson-modules/jackson/src/test/resources/node_example-1.json @@ -0,0 +1,65 @@ +{ + "rootEquipmentId": "830AFC79-E36E-41A4-8944-BDB71EEEC7AF", + "equipmentId": "7C82F833-A495-42E7-8CBE-2CEC42992DD1", + "startTime": "2021-09-01T00:00:00.000Z", + "endTime": "2021-09-01T03:00:00.000Z", + "testMaxBins": 36, + "testData": [ + { + "version": "v1", + "timestamp": "2021-09-01T00:40:00.000Z", + "event": { + "AlertType": "kpi", + "AlertId": "6B341AB0-971D-494E-9522-A23500BF7C9D", + "SourceAspectId": "80CB7FE9-9762-48C0-8027-CBE3EC517D0D", + "State": "INSUFFICIENT", + "SourceId": "7C82F833-A495-42E7-8CBE-2CEC42992DD1", + "Period": 1800, + "Severity": "1", + "SourceAspectName": "TagName" + } + }, + { + "version": "v1", + "timestamp": "2021-09-01T01:10:00.000Z", + "event": { + "AlertType": "kpi", + "AlertId": "6B341AB0-971D-494E-9522-A23500BF7C9D", + "SourceAspectId": "80CB7FE9-9762-48C0-8027-CBE3EC517D0D", + "State": "INSUFFICIENT", + "SourceId": "7C82F833-A495-42E7-8CBE-2CEC42992DD1", + "Period": 1800, + "Severity": "1", + "SourceAspectName": "TagName" + } + }, + { + "version": "v1", + "timestamp": "2021-09-01T02:10:00.000Z", + "event": { + "AlertType": "kpi", + "AlertId": "6B341AB0-971D-494E-9522-A23500BF7C9D", + "SourceAspectId": "80CB7FE9-9762-48C0-8027-CBE3EC517D0D", + "State": "OK", + "SourceId": "7C82F833-A495-42E7-8CBE-2CEC42992DD1", + "Period": 1800, + "Severity": "1", + "SourceAspectName": "TagName" + } + }, + { + "version": "v1", + "timestamp": "2021-09-01T02:40:00.000Z", + "event": { + "AlertType": "kpi", + "AlertId": "6B341AB0-971D-494E-9522-A23500BF7C9D", + "SourceAspectId": "80CB7FE9-9762-48C0-8027-CBE3EC517D0D", + "State": "OK", + "SourceId": "7C82F833-A495-42E7-8CBE-2CEC42992DD1", + "Period": 1800, + "Severity": "1", + "SourceAspectName": "TagName" + } + } + ] +} diff --git a/jackson-modules/jackson/src/test/resources/node_example.json b/jackson-modules/jackson/src/test/resources/node_example.json new file mode 100644 index 0000000000..d57c1df6e3 --- /dev/null +++ b/jackson-modules/jackson/src/test/resources/node_example.json @@ -0,0 +1,18 @@ +{ + "name": { + "first": "Tatu", + "last": "Saloranta" + }, + "title": "Jackson founder", + "company": "FasterXML", + "pets": [ + { + "type": "dog", + "number": 1 + }, + { + "type": "fish", + "number": 50 + } + ] +} \ No newline at end of file diff --git a/jackson-modules/pom.xml b/jackson-modules/pom.xml new file mode 100644 index 0000000000..782bc7e81c --- /dev/null +++ b/jackson-modules/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + jackson-modules + jackson-modules + pom + + + com.ossez + parent-java + 0.0.2-SNAPSHOT + ../parent-java + + + + jackson + jackson-annotations + jackson-conversions + jackson-conversions-2 + jackson-custom-conversions + jackson-exceptions + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson.version} + + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + test + + + org.junit.vintage + junit-vintage-engine + ${junit-jupiter.version} + test + + + + + 5.6.2 + + + \ No newline at end of file From 17044eb1320b6ead404c4849e5260c83e961170e Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 23 Sep 2021 15:49:02 -0400 Subject: [PATCH 14/30] Check Prime numbers --- .idea/workspace.xml | 69 +++++++++++++++++-- parent-java/java-numbers-2/README.md | 2 +- .../ossez/prime/PrimeGeneratorUnitTest.java | 3 + .../tests/algorithm/PrimeNumbersTest.java | 20 ++++++ 4 files changed, 88 insertions(+), 6 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 32f656b6ed..8c6fa47048 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,11 @@