diff src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.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/DvObjectServiceBean.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,89 @@
+package edu.harvard.iq.dataverse;
+
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.ejb.TransactionAttribute;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.NonUniqueResultException;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+/**
+ * Your goto bean for everything {@link DvObject}, that's not tied to any
+ * concrete subclass.
+ *
+ * @author michael
+ */
+@Stateless
+@Named
+public class DvObjectServiceBean implements java.io.Serializable {
+
+    @PersistenceContext(unitName = "VDCNet-ejbPU")
+    private EntityManager em;
+
+    /**
+     * @param dvoc The object we check
+     * @return {@code true} iff the passed object is the owner of any
+     * {@link DvObject}.
+     */
+    public boolean hasData(DvObjectContainer dvoc) {
+        return em.createNamedQuery("DvObject.ownedObjectsById", Long.class)
+                .setParameter("id", dvoc.getId())
+                .getSingleResult() > 0;
+    }
+
+    public DvObject findDvObject(Long id) {
+        try {
+            return em.createNamedQuery("DvObject.findById", DvObject.class)
+                    .setParameter("id", id)
+                    .getSingleResult();
+        } catch (NoResultException | NonUniqueResultException ex) {
+            return null;
+        }
+    }
+
+    public List<DvObject> findAll() {
+        return em.createNamedQuery("DvObject.findAll", DvObject.class).getResultList();
+    }
+
+    public DvObject updateContentIndexTime(DvObject dvObject) {
+        /**
+         * @todo to avoid a possible OptimisticLockException, should we merge
+         * dvObject before we try to setIndexTime? See
+         * https://github.com/IQSS/dataverse/commit/6ad0ebb272c8cb46368cb76784b55dbf33eea947
+         */
+        DvObject dvObjectToModify = findDvObject(dvObject.getId());
+        dvObjectToModify.setIndexTime(new Timestamp(new Date().getTime()));
+        DvObject savedDvObject = em.merge(dvObjectToModify);
+        return savedDvObject;
+    }
+
+    /**
+     * @todo DRY! Perhaps we should merge this with the older
+     * updateContentIndexTime method.
+     */
+    public DvObject updatePermissionIndexTime(DvObject dvObject) {
+        /**
+         * @todo to avoid a possible OptimisticLockException, should we merge
+         * dvObject before we try to set this timestamp? See
+         * https://github.com/IQSS/dataverse/commit/6ad0ebb272c8cb46368cb76784b55dbf33eea947
+         */
+        DvObject dvObjectToModify = findDvObject(dvObject.getId());
+        dvObjectToModify.setPermissionIndexTime(new Timestamp(new Date().getTime()));
+        DvObject savedDvObject = em.merge(dvObjectToModify);
+        return savedDvObject;
+    }
+
+    @TransactionAttribute(REQUIRES_NEW)
+    public int clearAllIndexTimes() {
+        Query clearIndexTimes = em.createQuery("UPDATE DvObject o SET o.indexTime = NULL, o.permissionIndexTime = NULL");
+        int numRowsUpdated = clearIndexTimes.executeUpdate();
+        return numRowsUpdated;
+    }
+
+}