finished merging with head
[pithos] / src / gr / ebs / gss / server / ejb / GSSDAOBean.java
index 1ab1b8d..b85835f 100644 (file)
@@ -26,11 +26,15 @@ import gr.ebs.gss.server.domain.FileHeader;
 import gr.ebs.gss.server.domain.FileUploadStatus;
 import gr.ebs.gss.server.domain.Folder;
 import gr.ebs.gss.server.domain.Group;
+import gr.ebs.gss.server.domain.FileLock;
 import gr.ebs.gss.server.domain.Invitation;
 import gr.ebs.gss.server.domain.Nonce;
 import gr.ebs.gss.server.domain.User;
 import gr.ebs.gss.server.domain.UserClass;
+import gr.ebs.gss.server.domain.UserLogin;
+import gr.ebs.gss.server.domain.WebDavNonce;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -43,6 +47,7 @@ import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
 
 import org.apache.commons.lang.StringUtils;
 
@@ -62,6 +67,20 @@ public class GSSDAOBean implements GSSDAO {
        private EntityManager manager;
 
        @Override
+       public Long getRootFolderId(final Long userId) throws ObjectNotFoundException {
+               try {
+                       if (userId == null)
+                               throw new ObjectNotFoundException("No user specified");
+                       return (Long) manager   .createQuery("select f.id from Folder f " +
+                                       "where f.owner.id=:ownerId and f.parent is null")
+                                                                       .setParameter("ownerId", userId)
+                                                                       .getSingleResult();
+               } catch (final NoResultException e) {
+                       throw new ObjectNotFoundException("Root folder not found for user with id=" + userId);
+               }
+       }
+       
+       @Override
        public Folder getRootFolder(final Long userId) throws ObjectNotFoundException {
                try {
                        if (userId == null)
@@ -330,24 +349,39 @@ public class GSSDAOBean implements GSSDAO {
                                        setParameter("userId", userId).setParameter("groupId", groupId).getResultList();
        }
 
+       private List<Long> getGroupIdsForUserId(Long userId) {
+               List<BigInteger> groups = manager.createNativeQuery("select distinct groupsmember_id " +
+               "from GSS_Group_GSS_User where members_id=:userId")
+                       .setParameter("userId", userId)
+                       .getResultList();
+               List<Long> groupIds = new ArrayList<Long>();
+               for (BigInteger id : groups)
+                       groupIds.add(id.longValue());
+               return groupIds;
+       }
+       
        @Override
        public List<User> getUsersSharingFoldersForUser(Long userId) {
-               return manager.createQuery("select distinct f.owner from Folder f " +
+        List<Long> groupIds = getGroupIdsForUserId(userId);
+               Query q = manager.createQuery("select distinct f.owner from Folder f " +
                                        "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
-                                       "and (p.user.id=:userId or p.group.id in (select distinct gg.id " +
-                                       "from Group gg join gg.members memb where memb.id=:userId))) ").
-                                       setParameter("userId", userId).getResultList();
+                                       "and (p.user.id=:userId "+ (groupIds.isEmpty() ? "" : "or p.group.id in (:groupIds)") +")").
+                                       setParameter("userId", userId);
+        if (!groupIds.isEmpty())
+            q.setParameter("groupIds", groupIds);
+        return q.getResultList();            
        }
 
        @Override
        public List<User> getUsersSharingFilesForUser(Long userId) {
-               List<User> users = manager.createQuery("select distinct f.owner from FileHeader f " +
+        List<Long> groupIds = getGroupIdsForUserId(userId);
+               Query q = manager.createQuery("select distinct f.owner from FileHeader f " +
                                        "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
-                                       "and (p.user.id=:userId or p.group.id in (select distinct gg.id from Group gg " +
-                                       "join gg.members memb where memb.id=:userId)))").
-                                       setParameter("userId", userId).getResultList();
-               return users;
-
+                                       "and (p.user.id=:userId " + (groupIds.isEmpty() ? "" : "or p.group.id in (:groupIds)") + ")").
+                                       setParameter("userId", userId);
+        if (!groupIds.isEmpty())
+            q.setParameter("groupIds", groupIds);
+        return q.getResultList();
        }
 
        @Override
@@ -450,13 +484,6 @@ public class GSSDAOBean implements GSSDAO {
        }
 
        @Override
-       public FileHeader getFileForIndexing(Long id) throws ObjectNotFoundException {
-               FileHeader h = getEntityById(FileHeader.class, id);
-               h.getFileTags().size();
-               return h;
-       }
-
-       @Override
        public Long getFileCount(Long userId) {
                Long singleResult = (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.id=:ownerId")
                .setParameter("ownerId", userId)
@@ -618,21 +645,27 @@ public class GSSDAOBean implements GSSDAO {
 
        @Override
        public Long getCountUsersByLastLogin(Date lastLoginDate) {
-               return (Long) manager.createQuery("select count(u) from User u where " +
-               " u.lastLogin >= :ldate ").setParameter("ldate", lastLoginDate).getSingleResult();
+               return (Long) manager.createQuery(
+                                       " select count(distinct ul.user.id) from UserLogin ul " +                               
+                                               " where ul.loginDate >=:ldate" 
+                                       ).setParameter("ldate", lastLoginDate).getSingleResult();
        }
-
+       
        @Override
        public List<User> getUsersByLastLogin(Date lastLoginDate) {
-               return manager.createQuery("select u from User u where " +
-                       " u.lastLogin >= :ldate order by u.lastLogin desc").
-                       setParameter("ldate", lastLoginDate).getResultList();
+               return manager.createQuery(" select distinct ul.user from UserLogin ul " +                              
+                                               " where ul.loginDate >=:ldate ")
+                                               .setParameter("ldate", lastLoginDate)
+                                               .getResultList();
        }
 
        @Override
        public List<User> getUsersByLastLogin(Date lastLoginDate, int firstResult, int maxResult) {
-               return manager.createQuery("select u from User u where " +
-               " u.lastLogin >= :ldate order by u.lastLogin desc").
+               return manager.createQuery("" +
+                               " select ul from UserLogin ul " +
+                               " where ul.loginDate >= :ldate " +
+                               " order by ul.loginDate desc "
+                               ).
                setParameter("ldate", lastLoginDate).setFirstResult(firstResult).setMaxResults(maxResult).getResultList();
        }
 
@@ -697,4 +730,133 @@ public class GSSDAOBean implements GSSDAO {
                }
                return ai;
        }
+
+       @Override
+       public List<FileHeader> getFilesPermittedForGroup(Long userId, Long groupId) {
+               return manager.createQuery("select distinct f from FileHeader f LEFT JOIN f.permissions p " +
+                                       "where f.owner.id=:userId and f.deleted = false and p.group.id=:groupId ").
+                                       setParameter("userId", userId).setParameter("groupId", groupId).getResultList();
+       }
+       
+       @Override
+       public List<Folder> getSharingFoldersForUser(Long userId) {
+               return manager.createQuery("select distinct f from Folder f " +
+                                       "LEFT JOIN f.permissions p where  " +
+                                       " (p.user.id=:userId or p.group.id in (select distinct gg.id " +
+                                       "from Group gg join gg.members memb where memb.id=:userId))) ").
+                                       setParameter("userId", userId).getResultList();
+       }
+       
+       @Override
+       public List<FileHeader> getSharingFilesForUser(Long userId) {
+               List<FileHeader> users = manager.createQuery("select distinct f from FileHeader f " +
+                                       "LEFT JOIN f.permissions p where " +
+                                       " (p.user.id=:userId or p.group.id in (select distinct gg.id from Group gg " +
+                                       "join gg.members memb where memb.id=:userId)))").
+                                       setParameter("userId", userId).getResultList();
+               return users;
+    }
+
+    @Override
+    public FileHeader getFileForIndexing(Long id) throws ObjectNotFoundException {
+        FileHeader h = getEntityById(FileHeader.class, id);
+        h.getFileTags().size();
+        h.getPermissions().size();
+        return h;
+    }
+       
+       @Override 
+       public List<Group> getGroupsContainingUser(Long userId){
+               List<Group> groups = manager.createQuery("select distinct gg " +
+                                       "from Group gg join gg.members memb where memb.id=:userId)").setParameter("userId", userId).getResultList();
+               return groups;
+       }
+       
+       @Override
+       public List<FileUploadStatus> getUploadStatus(Long userId){
+               List<FileUploadStatus> res = manager.createQuery("select f from FileUploadStatus f where f.owner.id=:userId").setParameter("userId", userId).getResultList();
+               return res;
+       }
+       @Override
+       public int deletePermissionsNotCorrespondingToFilesAndFolders(Long userId){
+               return manager.createNativeQuery("delete from permission where user_id=:userId and id not in(select permissions_id from fileheader_permission) and id not in(select permissions_id from folder_permission)").setParameter("userId", userId).executeUpdate();
+       }
+       
+       public List<UserLogin> getLoginsForUser (Long userId){
+               List<UserLogin> res = manager
+                                                               .createQuery("select ul from UserLogin ul where ul.user.id=:userId " +
+                                                                                       " order by ul.loginDate desc")                                                                                  
+                                                               .setParameter("userId", userId)
+                                                               .setMaxResults(2)                                                               
+                                                               .getResultList();
+               return res;                                                                     
+       }
+
+       public List<UserLogin> getAllLoginsForUser (Long userId){
+               List<UserLogin> res = manager
+                                                               .createQuery("select ul from UserLogin ul where ul.user.id=:userId ")                           
+                                                               .setParameter("userId", userId)                                                                                                 
+                                                               .getResultList();
+               return res;                                                                     
+       }
+       
+       @Override
+       public User getUserByUserName(String username) {
+               return (User) manager.createQuery("select u from User u where u.username=:username").
+               setParameter("username", username).getSingleResult();
+               
+       }
+       
+       
+       /** WEBDAV LOCK API **/
+       @Override
+       public FileLock getLockById(String id) {
+               return manager.find(FileLock.class, id);
+       }
+
+       @Override
+       public FileLock getLockByToken(String tokenId) {
+               return (FileLock) manager.createQuery("select c from FileLock c where c.tokenId=:tokenId").setParameter("tokenId", tokenId).getSingleResult();
+       }
+
+       @Override
+       public void removeLock(FileLock lock) {
+               lock =getLockById(lock.getId());
+               if(lock!=null)
+                       manager.remove(lock);           
+       }
+
+       @Override
+       public FileLock saveOrUpdateLock(FileLock lock) {
+               if(getLockById(lock.getId())!=null)
+                       manager.merge(lock);
+               else
+                       manager.persist(lock);
+               manager.flush();
+               return lock;
+       }
+       
+       @Override
+       public WebDavNonce getWebDavNonce(String tokenId) {
+               return manager.find(WebDavNonce.class, tokenId);
+       }
+
+       @Override
+       public void removeWebDavNonce(WebDavNonce nonce) {
+               nonce =getWebDavNonce(nonce.getId());
+               if(nonce!=null)
+                       manager.remove(nonce);          
+       }
+
+       @Override
+       public WebDavNonce saveOrUpdateWebDavNonce(WebDavNonce nonce) {
+               if(getWebDavNonce(nonce.getId())!=null)
+                       manager.merge(nonce);
+               else
+                       manager.persist(nonce);
+               manager.flush();
+               return nonce;
+       }
+
+       
 }