diff --git a/dozer-tutorial/pom.xml b/dozer-tutorial/pom.xml
new file mode 100644
index 0000000000..9447a3ff54
--- /dev/null
+++ b/dozer-tutorial/pom.xml
@@ -0,0 +1,59 @@
+
+ 4.0.0
+ com.baeldung
+ dozer-tutorial
+ 1.0
+ Dozer
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.3
+
+ 7
+ 7
+
+
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.5
+
+
+
+ org.slf4j
+ jcl-over-slf4j
+ 1.7.5
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.2.1
+
+
+
+ commons-beanutils
+ commons-beanutils
+ 1.9.1
+
+
+
+ net.sf.dozer
+ dozer
+ 5.5.1
+
+
+ junit
+ junit
+ 4.3
+ test
+
+
+
+
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Dest.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Dest.java
new file mode 100644
index 0000000000..26ba7e3ac4
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Dest.java
@@ -0,0 +1,33 @@
+package com.baeldung.dozer;
+
+public class Dest {
+ private String name;
+ private int age;
+
+ public Dest() {
+
+ }
+
+ public Dest(String name, int age) {
+ super();
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Dest2.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Dest2.java
new file mode 100644
index 0000000000..aa969b38d6
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Dest2.java
@@ -0,0 +1,38 @@
+package com.baeldung.dozer;
+
+public class Dest2 {
+ private int id;
+ private int points;
+
+ public Dest2() {
+
+ }
+
+ public Dest2(int id, int points) {
+ super();
+ this.id = id;
+ this.points = points;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getPoints() {
+ return points;
+ }
+
+ public void setPoints(int points) {
+ this.points = points;
+ }
+
+ @Override
+ public String toString() {
+ return "Dest2 [id=" + id + ", points=" + points + "]";
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/MyCustomConvertor.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/MyCustomConvertor.java
new file mode 100644
index 0000000000..ae0ed0ba87
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/MyCustomConvertor.java
@@ -0,0 +1,48 @@
+package com.baeldung.dozer;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.dozer.CustomConverter;
+import org.dozer.MappingException;
+
+public class MyCustomConvertor implements CustomConverter {
+
+ @Override
+ public Object convert(Object dest, Object source, Class> arg2,
+ Class> arg3) {
+ if (source == null) {
+ return null;
+ }
+ if (source instanceof Personne3) {
+ Personne3 person = (Personne3) source;
+ Date date = new Date(person.getDtob());
+ DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+ String isoDate = format.format(date);
+ return new Person3(person.getName(), isoDate);
+
+ } else if (source instanceof Person3) {
+ Person3 person = (Person3) source;
+ DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+ Date date = null;
+ try {
+ date = format.parse(person.getDtob());
+
+ } catch (ParseException e) {
+ throw new MappingException("Converter MyCustomConvertor "
+ + "used incorrectly:" + e.getMessage());
+ }
+ long timestamp = date.getTime();
+ return new Personne3(person.getName(), timestamp);
+
+ } else {
+ throw new MappingException("Converter MyCustomConvertor "
+ + "used incorrectly. Arguments passed in were:" + dest
+ + " and " + source);
+
+ }
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Person.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Person.java
new file mode 100644
index 0000000000..7367541951
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Person.java
@@ -0,0 +1,43 @@
+package com.baeldung.dozer;
+
+public class Person {
+ private String name;
+ private String nickname;
+ private int age;
+
+ public Person() {
+
+ }
+
+ public Person(String name, String nickname, int age) {
+ super();
+ this.name = name;
+ this.nickname = nickname;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getNickname() {
+ return nickname;
+ }
+
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Person2.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Person2.java
new file mode 100644
index 0000000000..1920f2868c
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Person2.java
@@ -0,0 +1,43 @@
+package com.baeldung.dozer;
+
+public class Person2 {
+ private String name;
+ private String nickname;
+ private int age;
+
+ public Person2() {
+
+ }
+
+ public Person2(String name, String nickname, int age) {
+ super();
+ this.name = name;
+ this.nickname = nickname;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getNickname() {
+ return nickname;
+ }
+
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Person3.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Person3.java
new file mode 100644
index 0000000000..ae1e610aa2
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Person3.java
@@ -0,0 +1,39 @@
+package com.baeldung.dozer;
+
+public class Person3 {
+ private String name;
+ private String dtob;
+
+ public Person3() {
+
+ }
+
+ public Person3(String name, String dtob) {
+ super();
+ this.name = name;
+ this.dtob = dtob;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDtob() {
+ return dtob;
+ }
+
+ public void setDtob(String dtob) {
+ this.dtob = dtob;
+ }
+
+ @Override
+ public String toString() {
+ return "Person3 [name=" + name + ", dtob=" + dtob + "]";
+ }
+
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne.java
new file mode 100644
index 0000000000..f6ff22c96b
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne.java
@@ -0,0 +1,43 @@
+package com.baeldung.dozer;
+
+public class Personne {
+ private String nom;
+ private String surnom;
+ private int age;
+
+ public Personne() {
+
+ }
+
+ public Personne(String nom, String surnom, int age) {
+ super();
+ this.nom = nom;
+ this.surnom = surnom;
+ this.age = age;
+ }
+
+ public String getNom() {
+ return nom;
+ }
+
+ public void setNom(String nom) {
+ this.nom = nom;
+ }
+
+ public String getSurnom() {
+ return surnom;
+ }
+
+ public void setSurnom(String surnom) {
+ this.surnom = surnom;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne2.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne2.java
new file mode 100644
index 0000000000..1cd3f7cdfd
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne2.java
@@ -0,0 +1,47 @@
+package com.baeldung.dozer;
+
+import org.dozer.Mapping;
+
+public class Personne2 {
+ private String nom;
+ private String surnom;
+ private int age;
+
+ public Personne2() {
+
+ }
+
+ public Personne2(String nom, String surnom, int age) {
+ super();
+ this.nom = nom;
+ this.surnom = surnom;
+ this.age = age;
+ }
+
+ @Mapping("name")
+ public String getNom() {
+ return nom;
+ }
+
+ @Mapping("nickname")
+ public String getSurnom() {
+ return surnom;
+ }
+
+ public void setNom(String nom) {
+ this.nom = nom;
+ }
+
+ public void setSurnom(String surnom) {
+ this.surnom = surnom;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne3.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne3.java
new file mode 100644
index 0000000000..04af1fe2d1
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Personne3.java
@@ -0,0 +1,38 @@
+package com.baeldung.dozer;
+
+public class Personne3 {
+ private String name;
+ private long dtob;
+
+ public Personne3() {
+
+ }
+
+ public Personne3(String name, long dtob) {
+ super();
+ this.name = name;
+ this.dtob = dtob;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public long getDtob() {
+ return dtob;
+ }
+
+ public void setDtob(long dtob) {
+ this.dtob = dtob;
+ }
+
+ @Override
+ public String toString() {
+ return "Personne3 [name=" + name + ", dtob=" + dtob + "]";
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Source.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Source.java
new file mode 100644
index 0000000000..88b3c7a349
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Source.java
@@ -0,0 +1,32 @@
+package com.baeldung.dozer;
+
+public class Source {
+ private String name;
+ private int age;
+
+ public Source() {
+ }
+
+ public Source(String name, int age) {
+ super();
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
diff --git a/dozer-tutorial/src/main/java/com/baeldung/dozer/Source2.java b/dozer-tutorial/src/main/java/com/baeldung/dozer/Source2.java
new file mode 100644
index 0000000000..ca7e5baaea
--- /dev/null
+++ b/dozer-tutorial/src/main/java/com/baeldung/dozer/Source2.java
@@ -0,0 +1,38 @@
+package com.baeldung.dozer;
+
+public class Source2 {
+ private String id;
+ private double points;
+
+ public Source2() {
+
+ }
+
+ public Source2(String id, double points) {
+ super();
+ this.id = id;
+ this.points = points;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public double getPoints() {
+ return points;
+ }
+
+ public void setPoints(double points) {
+ this.points = points;
+ }
+
+ @Override
+ public String toString() {
+ return "Source2 [id=" + id + ", points=" + points + "]";
+ }
+
+}
diff --git a/dozer-tutorial/src/test/java/com/baeldung/dozer/DozerTest.java b/dozer-tutorial/src/test/java/com/baeldung/dozer/DozerTest.java
new file mode 100644
index 0000000000..ac4a121c64
--- /dev/null
+++ b/dozer-tutorial/src/test/java/com/baeldung/dozer/DozerTest.java
@@ -0,0 +1,199 @@
+package com.baeldung.dozer;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.dozer.DozerBeanMapper;
+import org.dozer.loader.api.BeanMappingBuilder;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DozerTest {
+ DozerBeanMapper mapper = new DozerBeanMapper();
+
+ @Before
+ public void before() throws Exception {
+ mapper = new DozerBeanMapper();
+ }
+
+ BeanMappingBuilder builder = new BeanMappingBuilder() {
+
+ @Override
+ protected void configure() {
+ mapping(Person.class, Personne.class).fields("name", "nom").fields(
+ "nickname", "surnom");
+
+ }
+ };
+ BeanMappingBuilder builderMinusAge = new BeanMappingBuilder() {
+
+ @Override
+ protected void configure() {
+ mapping(Person.class, Personne.class).fields("name", "nom")
+ .fields("nickname", "surnom").exclude("age");
+
+ }
+ };
+
+ @Test
+ public void givenApiMapper_whenMaps_thenCorrect() {
+ Personne frenchAppPerson = new Personne("Sylvester Stallone", "Rambo",
+ 70);
+ mapper.addMapping(builder);
+ Person englishAppPerson = mapper.map(frenchAppPerson, Person.class);
+ assertEquals(englishAppPerson.getName(), frenchAppPerson.getNom());
+ assertEquals(englishAppPerson.getNickname(),
+ frenchAppPerson.getSurnom());
+ assertEquals(englishAppPerson.getAge(), frenchAppPerson.getAge());
+ }
+
+ @Test
+ public void givenApiMapper_whenMapsOnlySpecifiedFields_thenCorrect() {
+ Person englishAppPerson = new Person("Sylvester Stallone", "Rambo", 70);
+ mapper.addMapping(builderMinusAge);
+ Personne frenchAppPerson = mapper.map(englishAppPerson, Personne.class);
+ assertEquals(frenchAppPerson.getNom(), englishAppPerson.getName());
+ assertEquals(frenchAppPerson.getSurnom(),
+ englishAppPerson.getNickname());
+ assertEquals(frenchAppPerson.getAge(), 0);
+ }
+
+ @Test
+ public void givenApiMapper_whenMapsBidirectionally_thenCorrect() {
+ Person englishAppPerson = new Person("Sylvester Stallone", "Rambo", 70);
+ mapper.addMapping(builder);
+ Personne frenchAppPerson = mapper.map(englishAppPerson, Personne.class);
+ assertEquals(frenchAppPerson.getNom(), englishAppPerson.getName());
+ assertEquals(frenchAppPerson.getSurnom(),
+ englishAppPerson.getNickname());
+ assertEquals(frenchAppPerson.getAge(), englishAppPerson.getAge());
+ }
+
+ @Test
+ public void givenSourceObjectAndDestClass_whenMapsSameNameFieldsCorrectly_thenCorrect() {
+ Source source = new Source("Baeldung", 10);
+ Dest dest = mapper.map(source, Dest.class);
+ assertEquals(dest.getName(), "Baeldung");
+ assertEquals(dest.getAge(), 10);
+ }
+
+ @Test
+ public void givenSourceObjectAndDestObject_whenMapsSameNameFieldsCorrectly_thenCorrect() {
+ Source source = new Source("Baeldung", 10);
+ Dest dest = new Dest();
+ mapper.map(source, dest);
+ assertEquals(dest.getName(), "Baeldung");
+ assertEquals(dest.getAge(), 10);
+ }
+
+ @Test
+ public void givenSourceAndDestWithDifferentFieldTypes_whenMapsAndAutoConverts_thenCorrect() {
+ Source2 source = new Source2("320", 15.2);
+ Dest2 dest = mapper.map(source, Dest2.class);
+ assertEquals(dest.getId(), 320);
+ assertEquals(dest.getPoints(), 15);
+ }
+
+ @Test
+ public void givenSrcAndDestWithDifferentFieldNamesWithCustomMapper_whenMaps_thenCorrect() {
+ List mappingFiles = new ArrayList<>();
+ mappingFiles.add("dozer_mapping.xml");
+ Personne frenchAppPerson = new Personne("Sylvester Stallone", "Rambo",
+ 70);
+ mapper.setMappingFiles(mappingFiles);
+ Person englishAppPerson = mapper.map(frenchAppPerson, Person.class);
+ assertEquals(englishAppPerson.getName(), frenchAppPerson.getNom());
+ assertEquals(englishAppPerson.getNickname(),
+ frenchAppPerson.getSurnom());
+ assertEquals(englishAppPerson.getAge(), frenchAppPerson.getAge());
+ }
+
+ @Test
+ public void givenSrcAndDestWithDifferentFieldNamesWithCustomMapper_whenMapsBidirectionally_thenCorrect() {
+ List mappingFiles = new ArrayList<>();
+ mappingFiles.add("dozer_mapping.xml");
+ Person englishAppPerson = new Person("Dwayne Johnson", "The Rock", 44);
+ mapper.setMappingFiles(mappingFiles);
+ Personne frenchAppPerson = mapper.map(englishAppPerson, Personne.class);
+ assertEquals(frenchAppPerson.getNom(), englishAppPerson.getName());
+ assertEquals(frenchAppPerson.getSurnom(),
+ englishAppPerson.getNickname());
+ assertEquals(frenchAppPerson.getAge(), englishAppPerson.getAge());
+ }
+
+// @Test
+// public void givenMappingFileOutsideClasspath_whenMaps_thenCorrect() {
+// List mappingFiles = new ArrayList<>();
+// mappingFiles.add("file:E:\\dozer_mapping.xml");
+// Person englishAppPerson = new Person("Marshall Bruce Mathers III",
+// "Eminem", 43);
+// mapper.setMappingFiles(mappingFiles);
+// Personne frenchAppPerson = mapper.map(englishAppPerson, Personne.class);
+// assertEquals(frenchAppPerson.getNom(), englishAppPerson.getName());
+// assertEquals(frenchAppPerson.getSurnom(),
+// englishAppPerson.getNickname());
+// assertEquals(frenchAppPerson.getAge(), englishAppPerson.getAge());
+// }
+
+ @Test
+ public void givenSrcAndDest_whenMapsOnlySpecifiedFields_thenCorrect() {
+ List mappingFiles = new ArrayList<>();
+ mappingFiles.add("dozer_mapping2.xml");
+ Person englishAppPerson = new Person("Shawn Corey Carter", "Jay Z", 46);
+ mapper.setMappingFiles(mappingFiles);
+ Personne frenchAppPerson = mapper.map(englishAppPerson, Personne.class);
+ assertEquals(frenchAppPerson.getNom(), englishAppPerson.getName());
+ assertEquals(frenchAppPerson.getSurnom(),
+ englishAppPerson.getNickname());
+ assertEquals(frenchAppPerson.getAge(), 0);
+ }
+
+ @Test
+ public void givenAnnotatedSrcFields_whenMapsToRightDestField_thenCorrect() {
+ Person2 englishAppPerson = new Person2("Jean-Claude Van Damme", "JCVD",
+ 55);
+ Personne2 frenchAppPerson = mapper.map(englishAppPerson,
+ Personne2.class);
+ assertEquals(frenchAppPerson.getNom(), englishAppPerson.getName());
+ assertEquals(frenchAppPerson.getSurnom(),
+ englishAppPerson.getNickname());
+ assertEquals(frenchAppPerson.getAge(), englishAppPerson.getAge());
+ }
+
+ @Test
+ public void givenAnnotatedSrcFields_whenMapsToRightDestFieldBidirectionally_thenCorrect() {
+ Personne2 frenchAppPerson = new Personne2("Jason Statham",
+ "transporter", 49);
+ Person2 englishAppPerson = mapper.map(frenchAppPerson, Person2.class);
+ assertEquals(englishAppPerson.getName(), frenchAppPerson.getNom());
+ assertEquals(englishAppPerson.getNickname(),
+ frenchAppPerson.getSurnom());
+ assertEquals(englishAppPerson.getAge(), frenchAppPerson.getAge());
+ }
+
+ @Test
+ public void givenSrcAndDestWithDifferentFieldTypes_whenAbleToCustomConvert_thenCorrect() {
+ String dateTime = "2007-06-26T21:22:39Z";
+ long timestamp = new Long("1182882159000");
+ Person3 person = new Person3("Rich", dateTime);
+ mapper.setMappingFiles(Arrays
+ .asList(new String[] { "dozer_custom_convertor.xml" }));
+ Personne3 person0 = mapper.map(person, Personne3.class);
+ assertEquals(timestamp, person0.getDtob());
+ }
+
+ @Test
+ public void givenSrcAndDestWithDifferentFieldTypes_whenAbleToCustomConvertBidirectionally_thenCorrect() {
+ String dateTime = "2007-06-26T21:22:39Z";
+ long timestamp = new Long("1182882159000");
+ Personne3 person = new Personne3("Rich", timestamp);
+ mapper.setMappingFiles(Arrays
+ .asList(new String[] { "dozer_custom_convertor.xml" }));
+ Person3 person0 = mapper.map(person, Person3.class);
+ assertEquals(dateTime, person0.getDtob());
+ }
+
+}
diff --git a/dozer-tutorial/src/test/resources/dozer_custom_convertor.xml b/dozer-tutorial/src/test/resources/dozer_custom_convertor.xml
new file mode 100644
index 0000000000..0cbe5a7918
--- /dev/null
+++ b/dozer-tutorial/src/test/resources/dozer_custom_convertor.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ com.baeldung.dozer.Personne3
+ com.baeldung.dozer.Person3
+
+
+
+
+
\ No newline at end of file
diff --git a/dozer-tutorial/src/test/resources/dozer_mapping.xml b/dozer-tutorial/src/test/resources/dozer_mapping.xml
new file mode 100644
index 0000000000..13f31db11a
--- /dev/null
+++ b/dozer-tutorial/src/test/resources/dozer_mapping.xml
@@ -0,0 +1,17 @@
+
+
+
+ com.baeldung.dozer.Personne
+ com.baeldung.dozer.Person
+
+ nom
+ name
+
+
+ surnom
+ nickname
+
+
+
\ No newline at end of file
diff --git a/dozer-tutorial/src/test/resources/dozer_mapping2.xml b/dozer-tutorial/src/test/resources/dozer_mapping2.xml
new file mode 100644
index 0000000000..63411568b6
--- /dev/null
+++ b/dozer-tutorial/src/test/resources/dozer_mapping2.xml
@@ -0,0 +1,17 @@
+
+
+
+ com.baeldung.dozer.Personne
+ com.baeldung.dozer.Person
+
+ nom
+ name
+
+
+ surnom
+ nickname
+
+
+
\ No newline at end of file