diff src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,381 @@
+/*
+ * 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 edu.harvard.iq.dataverse;
+
+import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser;
+import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
+import edu.harvard.iq.dataverse.authorization.users.User;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+/**
+ *
+ * @author skraffmiller
+ */
+@Stateless
+@Named
+public class GuestbookResponseServiceBean {
+
+    @PersistenceContext(unitName = "VDCNet-ejbPU")
+    private EntityManager em;
+
+    public List<GuestbookResponse> findAll() {
+        return em.createQuery("select object(o) from GuestbookResponse as o order by o.responseTime desc").getResultList();
+    }
+
+    public List<Long> findAllIds() {
+        return findAllIds(null);
+    }
+
+    public List<Long> findAllIds(Long dataverseId) {
+        if (dataverseId == null) {
+            return em.createQuery("select o.id from GuestbookResponse as o order by o.responseTime desc").getResultList();
+        }
+        return em.createQuery("select o.id from GuestbookResponse  o, Dataset d where o.dataset.id = d.id and d.owner.id = " + dataverseId + " order by o.responseTime desc").getResultList();
+    }
+
+    public List<GuestbookResponse> findAllByGuestbookId(Long guestbookId) {
+
+        if (guestbookId == null) {
+        } else {
+            return em.createQuery("select o from GuestbookResponse as o where o.guestbook.id = " + guestbookId + " order by o.responseTime desc").getResultList();
+        }
+        return null;
+    }
+    
+    public Long findCountByGuestbookId(Long guestbookId) {
+
+        if (guestbookId == null) {
+        } else {
+            String queryString = "select count(o) from GuestbookResponse as o where o.guestbook_id = " + guestbookId;
+            Query query = em.createNativeQuery(queryString);
+            return (Long) query.getSingleResult();
+        }
+        return new Long(0);
+    }
+
+    public List<Long> findAllIds30Days() {
+        return findAllIds30Days(null);
+    }
+
+    public List<Long> findAllIds30Days(Long dataverseId) {
+        String beginTime;
+        String endTime;
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.DAY_OF_YEAR, -30);
+        beginTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());  // Use yesterday as default value
+        cal.add(Calendar.DAY_OF_YEAR, 31);
+        endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
+        String queryString = "select o.id from GuestbookResponse as o  ";
+        if (dataverseId != null) {
+            queryString += ", Dataset d where o.dataset.id = d.id and d.owner.id = " + dataverseId + " and ";
+        } else {
+            queryString += " where ";
+        }
+        queryString += " o.responseTime >='" + beginTime + "'";
+        queryString += " and o.responseTime<='" + endTime + "'";
+        queryString += "  order by o.responseTime desc";
+        Query query = em.createQuery(queryString);
+
+        return query.getResultList();
+    }
+
+    public Long findCount30Days() {
+        return findCount30Days(null);
+    }
+
+    public Long findCount30Days(Long dataverseId) {
+        String beginTime;
+        String endTime;
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.DAY_OF_YEAR, -30);
+        beginTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());  // Use yesterday as default value
+        cal.add(Calendar.DAY_OF_YEAR, 31);
+        endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
+        String queryString = "select count(o.id) from GuestbookResponse as o  ";
+        if (dataverseId != null) {
+            queryString += ", DvObject v where o.dataset_id = v.id and v.owner_id = " + dataverseId + " and ";
+        } else {
+            queryString += " where ";
+        }
+        queryString += " o.responseTime >='" + beginTime + "'";
+        queryString += " and o.responseTime<='" + endTime + "'";
+        Query query = em.createNativeQuery(queryString);
+        return (Long) query.getSingleResult();
+    }
+
+    public Long findCountAll() {
+        return findCountAll(null);
+    }
+
+    public Long findCountAll(Long dataverseId) {
+        String queryString = "";
+        if (dataverseId != null) {
+            queryString = "select count(o.id) from GuestbookResponse  o,  DvObject v, where o.dataset_id = v.id and v.owner_id = " + dataverseId + " ";
+        } else {
+            queryString = "select count(o.id) from GuestbookResponse  o ";
+        }
+
+        Query query = em.createNativeQuery(queryString);
+        return (Long) query.getSingleResult();
+    }
+
+    public List<GuestbookResponse> findAllByDataverse(Long dataverseId) {
+        return em.createQuery("select object(o) from GuestbookResponse  o, Dataset d where o.dataset.id = d.id and d.owner.id = " + dataverseId + " order by o.responseTime desc").getResultList();
+    }
+
+    public List<GuestbookResponse> findAllWithin30Days() {
+        return findAllWithin30Days(null);
+    }
+
+    public List<GuestbookResponse> findAllWithin30Days(Long dataverseId) {
+        String beginTime;
+        String endTime;
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.DAY_OF_YEAR, -30);
+        beginTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());  // Use yesterday as default value
+        cal.add(Calendar.DAY_OF_YEAR, 31);
+        endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
+        String queryString = "select object(o) from GuestbookResponse as o  ";
+        if (dataverseId != null) {
+            queryString += ", Dataset d where o.dataset.id = d.id and d.owner.id = " + dataverseId + " and ";
+        } else {
+            queryString += " where ";
+        }
+        queryString += " o.responseTime >='" + beginTime + "'";
+        queryString += " and o.responseTime<='" + endTime + "'";
+        queryString += "  order by o.responseTime desc";
+        Query query = em.createQuery(queryString);
+
+        return query.getResultList();
+    }
+
+    private List<Object[]> convertIntegerToLong(List<Object[]> list, int index) {
+        for (Object[] item : list) {
+            item[index] = new Long((Integer) item[index]);
+        }
+
+        return list;
+    }
+
+    private String generateTempTableString(List<Long> datasetIds) {
+        // first step: create the temp table with the ids
+
+        em.createNativeQuery(" BEGIN; SET TRANSACTION READ WRITE; DROP TABLE IF EXISTS tempid; END;").executeUpdate();
+        em.createNativeQuery(" BEGIN; SET TRANSACTION READ WRITE; CREATE TEMPORARY TABLE tempid (tempid integer primary key, orderby integer); END;").executeUpdate();
+        em.createNativeQuery(" BEGIN; SET TRANSACTION READ WRITE; INSERT INTO tempid VALUES " + generateIDsforTempInsert(datasetIds) + "; END;").executeUpdate();
+        return "select tempid from tempid";
+    }
+
+    private String generateIDsforTempInsert(List idList) {
+        int count = 0;
+        StringBuffer sb = new StringBuffer();
+        Iterator iter = idList.iterator();
+        while (iter.hasNext()) {
+            Long id = (Long) iter.next();
+            sb.append("(").append(id).append(",").append(count++).append(")");
+            if (iter.hasNext()) {
+                sb.append(",");
+            }
+        }
+
+        return sb.toString();
+    }
+
+    public List<Object[]> findDownloadInfoAll(List<Long> gbrIds) {
+        //this query will return multiple rows per response where the study name has changed over version
+        //these multiples are filtered out by the method that actually writes the download csv,
+        String varString = "(" + generateTempTableString(gbrIds) + ") ";
+        String gbrDownloadQueryString = "select u.username, gbr.sessionid, "
+                + " gbr.firstname, gbr.lastname, gbr.email, gbr.institution, "
+                + " vdc.name, s.protocol, s.authority, m.title, fmd.label, gbr.responsetime, gbr.position, gbr.study_id, gbr.id, gbr.downloadType "
+                + " from guestbookresponse gbr LEFT OUTER JOIN vdcuser u ON  "
+                + "(gbr.vdcuser_id =u.id),  "
+                + " vdc, study s, studyversion sv, metadata m, filemetadata  fmd  "
+                + "where gbr.study_id = s.id  "
+                + "and s.owner_id = vdc.id  "
+                + "and s.id = sv.study_id  "
+                + "and sv.metadata_id = m.id "
+                + "and gbr.studyfile_id = fmd.studyfile_id "
+                + "and sv.id = fmd.studyversion_id "
+                + "and sv.id = gbr.studyversion_id "
+                + " and gbr.id in " + varString
+                + " group by u.username, gbr.sessionid, "
+                + " gbr.firstname, gbr.lastname, gbr.email, gbr.institution, "
+                + " vdc.name, s.protocol, s.authority, m.title, fmd.label, gbr.responsetime, gbr.position, gbr.study_id, gbr.id, s.id, gbr.downloadType  "
+                + "order by s.id, gbr.id";
+        System.out.print(gbrDownloadQueryString);
+        Query query = em.createNativeQuery(gbrDownloadQueryString);
+
+        return convertIntegerToLong(query.getResultList(), 14);
+    }
+
+    public List<Object[]> findCustomResponsePerGuestbookResponse(Long gbrId) {
+
+        String gbrCustomQuestionQueryString = "select response, cq.id "
+                + " from guestbookresponse gbr, customquestion cq, customquestionresponse cqr "
+                + "where gbr.guestbook_id = cq.guestbook_id "
+                + " and gbr.id = cqr.guestbookresponse_id "
+                + "and cq.id = cqr.customquestion_id "
+                + " and cqr.guestbookresponse_id =  " + gbrId;
+        Query query = em.createNativeQuery(gbrCustomQuestionQueryString);
+
+        return convertIntegerToLong(query.getResultList(), 1);
+    }
+
+    private Guestbook findDefaultGuestbook() {
+        Guestbook guestbook = new Guestbook();
+        String queryStr = "SELECT object(o) FROM Guestbook as o WHERE o.dataverse.id = null";
+        Query query = em.createQuery(queryStr);
+        List resultList = query.getResultList();
+
+        if (resultList.size() >= 1) {
+            guestbook = (Guestbook) resultList.get(0);
+        }
+        return guestbook;
+
+    }
+
+    public String getUserName(User user) {
+        if (user.isAuthenticated()) {
+            AuthenticatedUser authUser = (AuthenticatedUser) user;
+            return authUser.getName();
+        }
+
+        try {
+            if (user.isBuiltInUser()) {
+                BuiltinUser builtinUser = (BuiltinUser) user;
+                return builtinUser.getDisplayName();
+            }
+        } catch (Exception e) {
+            return "";
+        }
+        return "Guest";
+    }
+
+    public String getUserEMail(User user) {
+        if (user.isAuthenticated()) {
+            AuthenticatedUser authUser = (AuthenticatedUser) user;
+            return authUser.getEmail();
+        }
+        try {
+            if (user.isBuiltInUser()) {
+                BuiltinUser builtinUser = (BuiltinUser) user;
+                return builtinUser.getEmail();
+            }
+        } catch (Exception e) {
+            return "";
+        }
+        return "";
+    }
+
+    public String getUserInstitution(User user) {
+        if (user.isAuthenticated()) {
+            AuthenticatedUser authUser = (AuthenticatedUser) user;
+            return authUser.getAffiliation();
+        }
+
+        try {
+            if (user.isBuiltInUser()) {
+                BuiltinUser builtinUser = (BuiltinUser) user;
+                return builtinUser.getAffiliation();
+            }
+        } catch (Exception e) {
+            return "";
+        }
+        return "";
+    }
+
+    public String getUserPosition(User user) {
+        if (user.isAuthenticated()) {
+            AuthenticatedUser authUser = (AuthenticatedUser) user;
+            return authUser.getPosition();
+        }
+        try {
+            if (user.isBuiltInUser()) {
+                BuiltinUser builtinUser = (BuiltinUser) user;
+                return builtinUser.getPosition();
+            }
+        } catch (Exception e) {
+            return "";
+        }
+
+        return "";
+    }
+
+    public AuthenticatedUser getAuthenticatedUser(User user) {
+        if (user.isAuthenticated()) {
+            AuthenticatedUser authUser = (AuthenticatedUser) user;
+            return authUser;
+        }
+        return null;
+    }
+
+    public GuestbookResponse initDefaultGuestbookResponse(Dataset dataset, DataFile dataFile, User user, DataverseSession session) {
+        GuestbookResponse guestbookResponse = new GuestbookResponse();
+        guestbookResponse.setGuestbook(findDefaultGuestbook());
+        if (dataFile != null){
+            guestbookResponse.setDataFile(dataFile);
+        }        
+        guestbookResponse.setDataset(dataset);
+        guestbookResponse.setResponseTime(new Date());
+        guestbookResponse.setSessionId(session.toString());
+
+        if (user != null) {
+            guestbookResponse.setEmail(getUserEMail(user));
+            guestbookResponse.setName(getUserName(user));
+            guestbookResponse.setInstitution(getUserInstitution(user));
+            guestbookResponse.setPosition(getUserPosition(user));
+            guestbookResponse.setAuthenticatedUser(getAuthenticatedUser(user));
+        } else {
+            guestbookResponse.setEmail("");
+            guestbookResponse.setName("");
+            guestbookResponse.setInstitution("");
+            guestbookResponse.setPosition("");
+            guestbookResponse.setAuthenticatedUser(null);
+        }
+        return guestbookResponse;
+    }
+
+    public GuestbookResponse findById(Long id) {
+        return em.find(GuestbookResponse.class, id);
+    }
+
+    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+    public void save(GuestbookResponse guestbookResponse) {
+        em.persist(guestbookResponse);
+    }
+    
+    
+    public Long getCountGuestbookResponsesByDataFileId(Long dataFileId) {
+        // datafile id is null, will return 0
+        Query query = em.createNativeQuery("select count(o.id) from GuestbookResponse  o  where o.datafile_id  = " + dataFileId);
+        return (Long) query.getSingleResult();
+    }
+    
+    public Long getCountGuestbookResponsesByDatasetId(Long datasetId) {
+        // dataset id is null, will return 0        
+        Query query = em.createNativeQuery("select count(o.id) from GuestbookResponse  o  where o.dataset_id  = " + datasetId);
+        return (Long) query.getSingleResult();
+    }    
+
+    public Long getCountOfAllGuestbookResponses() {
+        // dataset id is null, will return 0        
+        Query query = em.createNativeQuery("select count(o.id) from GuestbookResponse  o;");
+        return (Long) query.getSingleResult();
+    }
+    
+}