diff --git a/src/main/java/org/literacyapp/dao/StudentDao.java b/src/main/java/org/literacyapp/dao/StudentDao.java new file mode 100644 index 000000000..e45673028 --- /dev/null +++ b/src/main/java/org/literacyapp/dao/StudentDao.java @@ -0,0 +1,14 @@ +package org.literacyapp.dao; + +import java.util.List; +import org.literacyapp.model.Student; +import org.literacyapp.model.enums.Locale; + +import org.springframework.dao.DataAccessException; + +public interface StudentDao extends GenericDao { + + Student read(String uniqueId) throws DataAccessException; + + List readAll(Locale locale) throws DataAccessException; +} diff --git a/src/main/java/org/literacyapp/dao/jpa/StudentDaoJpa.java b/src/main/java/org/literacyapp/dao/jpa/StudentDaoJpa.java new file mode 100644 index 000000000..5c966f06a --- /dev/null +++ b/src/main/java/org/literacyapp/dao/jpa/StudentDaoJpa.java @@ -0,0 +1,38 @@ +package org.literacyapp.dao.jpa; + +import java.util.List; +import javax.persistence.NoResultException; +import org.literacyapp.dao.StudentDao; + +import org.springframework.dao.DataAccessException; + +import org.literacyapp.model.Student; +import org.literacyapp.model.enums.Locale; + +public class StudentDaoJpa extends GenericDaoJpa implements StudentDao { + + @Override + public Student read(String uniqueId) throws DataAccessException { + try { + return (Student) em.createQuery( + "SELECT s " + + "FROM Student s " + + "WHERE s.uniqueId = :uniqueId") + .setParameter("uniqueId", uniqueId) + .getSingleResult(); + } catch (NoResultException e) { + logger.warn("Student \"" + uniqueId + "\" was not found"); + return null; + } + } + + @Override + public List readAll(Locale locale) throws DataAccessException { + return em.createQuery( + "SELECT s " + + "FROM Student s " + + "WHERE s.locale = :locale") + .setParameter("locale", locale) + .getResultList(); + } +} diff --git a/src/main/java/org/literacyapp/model/Device.java b/src/main/java/org/literacyapp/model/Device.java index 456f4227a..ca4e12e33 100644 --- a/src/main/java/org/literacyapp/model/Device.java +++ b/src/main/java/org/literacyapp/model/Device.java @@ -8,7 +8,7 @@ import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; -import javax.persistence.OneToMany; +import javax.persistence.ManyToMany; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.validation.constraints.NotNull; @@ -44,7 +44,7 @@ public class Device extends BaseEntity { @Enumerated(EnumType.STRING) private Locale locale; - @OneToMany(fetch = FetchType.EAGER) + @ManyToMany(fetch = FetchType.EAGER) private Set devicesNearby = new HashSet<>(); public String getDeviceId() { diff --git a/src/main/java/org/literacyapp/model/Student.java b/src/main/java/org/literacyapp/model/Student.java index 5e038eebc..1a515fb18 100644 --- a/src/main/java/org/literacyapp/model/Student.java +++ b/src/main/java/org/literacyapp/model/Student.java @@ -1,6 +1,7 @@ package org.literacyapp.model; import java.util.Set; +import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; @@ -12,23 +13,29 @@ @Entity public class Student extends BaseEntity { - + @NotNull - @Enumerated(EnumType.STRING) - private Locale locale; + @Column(unique = true) + private String uniqueId; // "_" @NotEmpty @ManyToMany(fetch = FetchType.EAGER) private Set devices; + + // TODO: avatar - public Locale getLocale() { - return locale; + @NotNull + @Enumerated(EnumType.STRING) + private Locale locale; + + public String getUniqueId() { + return uniqueId; } - public void setLocale(Locale locale) { - this.locale = locale; + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; } - + public Set getDevices() { return devices; } @@ -36,4 +43,12 @@ public Set getDevices() { public void setDevices(Set devices) { this.devices = devices; } + + public Locale getLocale() { + return locale; + } + + public void setLocale(Locale locale) { + this.locale = locale; + } } diff --git a/src/main/java/org/literacyapp/rest/v1/JavaToGsonConverter.java b/src/main/java/org/literacyapp/rest/v1/JavaToGsonConverter.java index 1506a6523..d3560a49f 100644 --- a/src/main/java/org/literacyapp/rest/v1/JavaToGsonConverter.java +++ b/src/main/java/org/literacyapp/rest/v1/JavaToGsonConverter.java @@ -4,6 +4,7 @@ import java.util.List; import org.literacyapp.model.admin.Application; import org.literacyapp.model.Device; +import org.literacyapp.model.Student; import org.literacyapp.model.content.Number; import org.literacyapp.model.content.Word; import org.literacyapp.model.admin.ApplicationVersion; @@ -13,6 +14,7 @@ import org.literacyapp.model.content.multimedia.Image; import org.literacyapp.model.content.multimedia.Video; import org.literacyapp.model.gson.DeviceGson; +import org.literacyapp.model.gson.StudentGson; import org.literacyapp.model.gson.content.NumberGson; import org.literacyapp.model.gson.content.WordGson; import org.literacyapp.model.gson.admin.ApplicationGson; @@ -150,6 +152,20 @@ public static DeviceGson getDeviceGson(Device device) { } } + public static StudentGson getStudentGson(Student student) { + if (student == null) { + return null; + } else { + StudentGson studentGson = new StudentGson(); + + studentGson.setUniqueId(student.getUniqueId()); +// studentGson.setAvatar(null); +// studentGson.setDevices(null); + + return studentGson; + } + } + public static ImageGson getImageGson(Image image) { if (image == null) { return null; diff --git a/src/main/webapp/WEB-INF/spring/applicationContext-jpa.xml b/src/main/webapp/WEB-INF/spring/applicationContext-jpa.xml index b9d51e50c..a06091931 100644 --- a/src/main/webapp/WEB-INF/spring/applicationContext-jpa.xml +++ b/src/main/webapp/WEB-INF/spring/applicationContext-jpa.xml @@ -71,6 +71,7 @@ + diff --git a/src/test/java/org/literacyapp/dao/StudentDaoTest.java b/src/test/java/org/literacyapp/dao/StudentDaoTest.java new file mode 100644 index 000000000..a33f995d8 --- /dev/null +++ b/src/test/java/org/literacyapp/dao/StudentDaoTest.java @@ -0,0 +1,85 @@ +package org.literacyapp.dao; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.log4j.Logger; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; +import org.hibernate.exception.ConstraintViolationException; +import org.junit.Ignore; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.literacyapp.model.Device; +import org.literacyapp.model.Student; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.orm.jpa.JpaSystemException; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/applicationContext-jpa.xml") +public class StudentDaoTest { + + private Logger logger = Logger.getLogger(getClass()); + + @Autowired + private StudentDao studentDao; + + @Autowired + private DeviceDao deviceDao; + + @Test(expected = JpaSystemException.class) + public void testCreateStudentsWithNonUniqueIds() { + Student student1 = new Student(); + student1.setUniqueId("4113947bec18b7ad_1"); + studentDao.create(student1); + + Student student2 = new Student(); + student2.setUniqueId("4113947bec18b7ad_1"); + studentDao.create(student2); + } + + @Test + public void testStoreStudentWithOneDevice() { + Set devices = new HashSet<>(); + + Device device = new Device(); + device.setDeviceId("4113947bec18b7ad"); + deviceDao.create(device); + devices.add(device); + + Student student = new Student(); + student.setUniqueId("4113947bec18b7ad_1"); + student.setDevices(devices); + studentDao.create(student); + + Student studentStoredInDatabase = studentDao.read("4113947bec18b7ad_1"); + assertThat(studentStoredInDatabase.getDevices().size(), is(1)); + } + + @Test + public void testStoreStudentWithTWoDevices() { + Set devices = new HashSet<>(); + + Device device1 = new Device(); + device1.setDeviceId("2223947bec18b7ad"); + deviceDao.create(device1); + devices.add(device1); + + Device device2 = new Device(); + device2.setDeviceId("679b35bb2322c6e4"); + deviceDao.create(device2); + devices.add(device2); + + Student student = new Student(); + student.setUniqueId("2223947bec18b7ad_1"); + student.setDevices(devices); + studentDao.create(student); + + Student studentStoredInDatabase = studentDao.read("2223947bec18b7ad_1"); + assertThat(studentStoredInDatabase.getDevices().size(), is(2)); + } +}