aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/web/server/model/DataServiceImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/traccar/web/server/model/DataServiceImpl.java')
-rw-r--r--src/org/traccar/web/server/model/DataServiceImpl.java172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/org/traccar/web/server/model/DataServiceImpl.java b/src/org/traccar/web/server/model/DataServiceImpl.java
new file mode 100644
index 00000000..cfcc6226
--- /dev/null
+++ b/src/org/traccar/web/server/model/DataServiceImpl.java
@@ -0,0 +1,172 @@
+package org.traccar.web.server.model;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.persistence.EntityManager;
+import javax.persistence.Persistence;
+import javax.persistence.TypedQuery;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpSession;
+
+import org.traccar.web.client.model.DataService;
+import org.traccar.web.shared.model.Device;
+import org.traccar.web.shared.model.Position;
+import org.traccar.web.shared.model.User;
+
+import com.google.gwt.user.server.rpc.RemoteServiceServlet;
+
+public class DataServiceImpl extends RemoteServiceServlet implements DataService {
+
+ private static final long serialVersionUID = 1;
+
+ private static final String PERSISTENCE_DATASTORE = "java:/DefaultDS";
+ private static final String PERSISTENCE_UNIT_DEBUG = "debug";
+ private static final String PERSISTENCE_UNIT_RELEASE = "release";
+ private static final String ATTRIBUTE_USER = "user";
+
+ private EntityManager entityManager;
+
+ @Override
+ public void init() throws ServletException {
+ super.init();
+
+ String persistenceUnit;
+ try {
+ Context context = new InitialContext();
+ context.lookup(PERSISTENCE_DATASTORE);
+ persistenceUnit = PERSISTENCE_UNIT_RELEASE;
+ } catch (NamingException e) {
+ persistenceUnit = PERSISTENCE_UNIT_DEBUG;
+ }
+
+ entityManager = Persistence.createEntityManagerFactory(persistenceUnit).createEntityManager();
+ }
+
+ @Override
+ public void destroy() {
+ entityManager.close();
+ super.destroy();
+ }
+
+ private void setUser(User user) {
+ HttpSession session = getThreadLocalRequest().getSession();
+ session.setAttribute(ATTRIBUTE_USER, user);
+ }
+
+ private User getUser() {
+ HttpSession session = getThreadLocalRequest().getSession();
+ return (User) session.getAttribute(ATTRIBUTE_USER);
+ }
+
+ @Override
+ public boolean authenticated() {
+ return (getUser() != null);
+ }
+
+ @Override
+ public boolean authenticate(String login, String password) {
+ TypedQuery<User> query = entityManager.createQuery(
+ "SELECT x FROM User x WHERE x.login = :login", User.class);
+ query.setParameter("login", login);
+ List<User> results = query.getResultList();
+
+ if (!results.isEmpty() && password.equals(results.get(0).getPassword())) {
+ setUser(results.get(0));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean register(String login, String password) {
+ User user = new User();
+ user.setLogin(login);
+ user.setPassword(password);
+ entityManager.getTransaction().begin();
+ try {
+ entityManager.persist(user);
+ } finally {
+ entityManager.getTransaction().commit();
+ }
+ setUser(user);
+ return true;
+ }
+
+ @Override
+ public List<Device> getDevices() {
+ User user = getUser();
+ List<Device> devices = new LinkedList<Device>();
+ devices.addAll(user.getDevices());
+ return devices;
+ }
+
+ @Override
+ public Device addDevice(Device device) {
+ User user = getUser();
+ entityManager.getTransaction().begin();
+ try {
+ entityManager.persist(device);
+ user.getDevices().add(device);
+ } finally {
+ entityManager.getTransaction().commit();
+ }
+ return device;
+ }
+
+ @Override
+ public Device updateDevice(Device device) {
+ entityManager.getTransaction().begin();
+ try {
+ device = entityManager.merge(device);
+ } finally {
+ entityManager.getTransaction().commit();
+ }
+ return device;
+ }
+
+ @Override
+ public Device removeDevice(Device device) {
+ User user = getUser();
+ entityManager.getTransaction().begin();
+ try {
+ device = entityManager.merge(device);
+ user.getDevices().remove(device);
+ entityManager.remove(device);
+ } finally {
+ entityManager.getTransaction().commit();
+ }
+ return device;
+ }
+
+ @Override
+ public List<Position> getPositions(Device device, Date from, Date to) {
+ List<Position> positions = new LinkedList<Position>();
+ TypedQuery<Position> query = entityManager.createQuery(
+ "SELECT x FROM Position x WHERE x.device = :device AND x.time BETWEEN :from AND :to", Position.class);
+ query.setParameter("device", device);
+ query.setParameter("from", from);
+ query.setParameter("to", to);
+ positions.addAll(query.getResultList());
+ return positions;
+ }
+
+ @Override
+ public List<Position> getLatestPositions() {
+ List<Position> positions = new LinkedList<Position>();
+ User user = getUser();
+ if (!user.getDevices().isEmpty()) {
+ TypedQuery<Position> query = entityManager.createQuery(
+ "SELECT x FROM Position x WHERE (x.device, x.time) IN (" +
+ "SELECT y.device, MAX(y.time) FROM Position y WHERE y.device IN :devices GROUP BY y.device)", Position.class);
+ query.setParameter("devices", user.getDevices());
+ positions.addAll(query.getResultList());
+ }
+ return positions;
+ }
+
+}