diff --git a/data-mapper/etc/data-mapper.png b/data-mapper/etc/data-mapper.png index 8fc90f591..bcda8054a 100644 Binary files a/data-mapper/etc/data-mapper.png and b/data-mapper/etc/data-mapper.png differ diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 866f5b76e..76ba00f94 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -23,71 +23,61 @@ THE SOFTWARE. --> - - 4.0.0 - - com.iluwatar - java-design-patterns - 1.11.0-SNAPSHOT - - data-mapper + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.11.0-SNAPSHOT + + data-mapper + + + junit + junit + test + + + log4j + log4j + + - - - junit - junit - test - - - log4j - log4j - - + - + + + + src/main/resources + + + src/main/resources + + log4j.xml + + .. + + - - - - - src/main/resources - - - src/main/resources - - log4j.xml - - .. - - + - + + + org.apache.maven.plugins + maven-jar-plugin + 2.6 + + + log4j.xml + + + + true + + + + - - - org.apache.maven.plugins - maven-jar-plugin - 2.6 - - - log4j.xml - - - - true - - - - - - - + + diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/App.java b/data-mapper/src/main/java/com/iluwatar/datamapper/App.java index d23e0219d..5fcd0d9ea 100644 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/App.java +++ b/data-mapper/src/main/java/com/iluwatar/datamapper/App.java @@ -1,5 +1,5 @@ /** - * The MIT License Copyright (c) 2014 Ilkka Seppälä + * The MIT License Copyright (c) 2016 Amit Dixit * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * associated documentation files (the "Software"), to deal in the Software without restriction, @@ -37,9 +37,6 @@ public final class App { private static Logger log = Logger.getLogger(App.class); - private static final String DB_TYPE_FIRST = "first"; - private static final String DB_TYPE_SECOND = "second"; - /** * Program entry point. * @@ -47,49 +44,21 @@ public final class App { */ public static void main(final String... args) { - if (log.isInfoEnabled() & args.length > 0) { - log.debug("App.main(), type: " + args[0]); - } - - StudentDataMapper mapper = null; - - /* Check the desired db type from runtime arguments */ - if (args.length == 0) { - - /* Create default data mapper for mysql */ - mapper = new StudentFirstDataMapper(); - - } else if (args.length > 0 && DB_TYPE_FIRST.equalsIgnoreCase(args[0])) { - - /* Create new data mapper for type 'first' */ - mapper = new StudentFirstDataMapper(); - - } else if (args.length > 0 && DB_TYPE_SECOND.equalsIgnoreCase(args[0])) { - - /* Create new data mapper for type 'second' */ - mapper = new StudentSecondDataMapper(); - } else { - - /* Don't couple any Data Mapper to java.sql.SQLException */ - throw new DataMapperException("Following data mapping type(" + args[0] + ") is not supported"); - } + /* Create new data mapper for type 'first' */ + final StudentDataMapper mapper = new StudentDataMapperImpl(); /* Create new student */ Student student = new Student(1, "Adam", 'A'); - /* Add student in respectibe db */ + /* Add student in respectibe store */ mapper.insert(student); - if (log.isDebugEnabled()) { - log.debug("App.main(), student : " + student + ", is inserted"); - } + log.debug("App.main(), student : " + student + ", is inserted"); /* Find this student */ final Optional studentToBeFound = mapper.find(student.getStudentId()); - if (log.isDebugEnabled()) { - log.debug("App.main(), student : " + studentToBeFound + ", is searched"); - } + log.debug("App.main(), student : " + studentToBeFound + ", is searched"); /* Update existing student object */ student = new Student(student.getStudentId(), "AdamUpdated", 'A'); @@ -97,15 +66,10 @@ public final class App { /* Update student in respectibe db */ mapper.update(student); - if (log.isDebugEnabled()) { - log.debug("App.main(), student : " + student + ", is updated"); - } + log.debug("App.main(), student : " + student + ", is updated"); + log.debug("App.main(), student : " + student + ", is going to be deleted"); /* Delete student in db */ - - if (log.isDebugEnabled()) { - log.debug("App.main(), student : " + student + ", is deleted"); - } mapper.delete(student); } diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java b/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java index 7cc66d5af..24a7cf081 100644 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java +++ b/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java @@ -19,6 +19,8 @@ package com.iluwatar.datamapper; /** + * Using Runtime Exception for avoiding dependancy on implementation exceptions. This helps in + * decoupling. * * @author amit.dixit * diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/StudentFirstDataMapper.java b/data-mapper/src/main/java/com/iluwatar/datamapper/StudentDataMapperImpl.java similarity index 92% rename from data-mapper/src/main/java/com/iluwatar/datamapper/StudentFirstDataMapper.java rename to data-mapper/src/main/java/com/iluwatar/datamapper/StudentDataMapperImpl.java index 97f6d395d..7ecd9e7f8 100644 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/StudentFirstDataMapper.java +++ b/data-mapper/src/main/java/com/iluwatar/datamapper/StudentDataMapperImpl.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -public final class StudentFirstDataMapper implements StudentDataMapper { +public final class StudentDataMapperImpl implements StudentDataMapper { /* Note: Normally this would be in the form of an actual database */ private List students = new ArrayList<>(); @@ -59,7 +59,7 @@ public final class StudentFirstDataMapper implements StudentDataMapper { } else { - /* Throw user error */ + /* Throw user error after wrapping in a runtime exception */ throw new DataMapperException("Student [" + studentToBeUpdated.getName() + "] is not found"); } } @@ -75,7 +75,7 @@ public final class StudentFirstDataMapper implements StudentDataMapper { } else { - /* Throw user error */ + /* Throw user error after wrapping in a runtime exception */ throw new DataMapperException("Student already [" + studentToBeInserted.getName() + "] exists"); } } @@ -91,7 +91,7 @@ public final class StudentFirstDataMapper implements StudentDataMapper { } else { - /* Throw user error */ + /* Throw user error after wrapping in a runtime exception */ throw new DataMapperException("Student [" + studentToBeDeleted.getName() + "] is not found"); } } diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/StudentSecondDataMapper.java b/data-mapper/src/main/java/com/iluwatar/datamapper/StudentSecondDataMapper.java deleted file mode 100644 index 7ad9788c0..000000000 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/StudentSecondDataMapper.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * The MIT License Copyright (c) 2016 Amit Dixit - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and - * associated documentation files (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, publish, distribute, - * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT - * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package com.iluwatar.datamapper; - -import java.util.Vector; -import java.util.List; -import java.util.Optional; - -public final class StudentSecondDataMapper implements StudentDataMapper { - - /* Note: Normally this would be in the form of an actual database */ - private List students = new Vector<>(); - - @Override - public Optional find(int studentId) { - - /* Compare with existing students */ - for (final Student student : this.getStudents()) { - - /* Check if student is found */ - if (student.getStudentId() == studentId) { - - return Optional.of(student); - } - } - - /* Return empty value */ - return Optional.empty(); - } - - @Override - public void update(Student studentToBeUpdated) throws DataMapperException { - - /* Check with existing students */ - if (this.getStudents().contains(studentToBeUpdated)) { - - /* Get the index of student in list */ - final int index = this.getStudents().indexOf(studentToBeUpdated); - - /* Update the student in list */ - this.getStudents().set(index, studentToBeUpdated); - - } else { - - /* Throw user error */ - throw new DataMapperException("Student [" + studentToBeUpdated.getName() + "] is not found"); - } - } - - @Override - public void insert(Student studentToBeInserted) throws DataMapperException { - - /* Check with existing students */ - if (!this.getStudents().contains(studentToBeInserted)) { - - /* Add student in list */ - this.getStudents().add(studentToBeInserted); - - } else { - - /* Throw user error */ - throw new DataMapperException("Student already [" + studentToBeInserted.getName() + "] exists"); - } - } - - @Override - public void delete(Student studentToBeDeleted) throws DataMapperException { - - /* Check with existing students */ - if (this.getStudents().contains(studentToBeDeleted)) { - - /* Delete the student from list */ - this.getStudents().remove(studentToBeDeleted); - - } else { - - /* Throw user error */ - throw new DataMapperException("Student [" + studentToBeDeleted.getName() + "] is not found"); - } - } - - public List getStudents() { - return this.students; - } -} diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java index d3ad2dcb3..f2858100e 100644 --- a/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java @@ -1,6 +1,5 @@ /** * The MIT License Copyright (c) 2016 Amit Dixit - * * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * associated documentation files (the "Software"), to deal in the Software without restriction, diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java index f77097df8..17f4d3922 100644 --- a/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java @@ -24,8 +24,7 @@ import org.junit.Test; import com.iluwatar.datamapper.Student; import com.iluwatar.datamapper.StudentDataMapper; -import com.iluwatar.datamapper.StudentFirstDataMapper; -import com.iluwatar.datamapper.StudentSecondDataMapper; +import com.iluwatar.datamapper.StudentDataMapperImpl; /** * The Data Mapper (DM) is a layer of software that separates the in-memory objects from the @@ -45,41 +44,7 @@ public class DataMapperTest { public void testFirstDataMapper() { /* Create new data mapper of first type */ - final StudentDataMapper mapper = new StudentFirstDataMapper(); - - /* Create new student */ - Student student = new Student(1, "Adam", 'A'); - - /* Add student in respectibe db */ - mapper.insert(student); - - /* Check if student is added in db */ - assertEquals(student.getStudentId(), mapper.find(student.getStudentId()).get().getStudentId()); - - /* Update existing student object */ - student = new Student(student.getStudentId(), "AdamUpdated", 'A'); - - /* Update student in respectibe db */ - mapper.update(student); - - /* Check if student is updated in db */ - assertEquals(mapper.find(student.getStudentId()).get().getName(), "AdamUpdated"); - - /* Delete student in db */ - mapper.delete(student); - - /* Result should be false */ - assertEquals(false, mapper.find(student.getStudentId()).isPresent()); - } - - /** - * This test verify that second data mapper is able to perform all CRUD operations on Student - */ - @Test - public void testSecondDataMapper() { - - /* Create new data mapper of second type */ - final StudentDataMapper mapper = new StudentSecondDataMapper(); + final StudentDataMapper mapper = new StudentDataMapperImpl(); /* Create new student */ Student student = new Student(1, "Adam", 'A'); diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java new file mode 100644 index 000000000..c441d6d6e --- /dev/null +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java @@ -0,0 +1,50 @@ +/** + * The MIT License Copyright (c) 2016 Amit Dixit + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.iluwatar.datamapper; + +import org.junit.Test; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; + +public final class StudentTest { + + @Test + /** + * This API tests the equality behaviour of Student object + * Object Equality should work as per logic defined in equals method + * @throws Exception + */ + public void testEquality() throws Exception { + + /* Create some students */ + final Student firstStudent = new Student(1, "Adam", 'A'); + final Student secondStudent = new Student(2, "Donald", 'B'); + final Student secondSameStudent = new Student(2, "Donald", 'B'); + final Student firstSameStudent = firstStudent; + + /* Check equals functionality: should return 'true' */ + assertTrue(firstStudent.equals(firstSameStudent)); + + /* Check equals functionality: should return 'false' */ + assertFalse(firstStudent.equals(secondStudent)); + + /* Check equals functionality: should return 'true' */ + assertTrue(secondStudent.equals(secondSameStudent)); + } +}