finished merging with head
[pithos] / src / gr / ebs / gss / server / ejb / GSSDAOBean.java
index 1bd8f2e..b85835f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd.
+ * Copyright 2007, 2008, 2009, 2010 Electronic Business Systems Ltd.
  *
  * This file is part of GSS.
  *
@@ -18,6 +18,7 @@
  */
 package gr.ebs.gss.server.ejb;
 
+import static gr.ebs.gss.server.configuration.GSSConfigurationFactory.getConfiguration;
 import gr.ebs.gss.client.exceptions.ObjectNotFoundException;
 import gr.ebs.gss.server.domain.AccountingInfo;
 import gr.ebs.gss.server.domain.FileBody;
@@ -25,9 +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;
@@ -40,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;
 
@@ -58,11 +66,21 @@ public class GSSDAOBean implements GSSDAO {
        @PersistenceContext(unitName = "gss")
        private EntityManager manager;
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getRootFolder(java.lang.Long)
-        */
+       @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)
@@ -75,11 +93,7 @@ public class GSSDAOBean implements GSSDAO {
                }
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getUser(java.lang.String)
-        */
+       @Override
        public User getUser(final String username) throws ObjectNotFoundException {
                try {
                        if (username == null)
@@ -92,56 +106,35 @@ public class GSSDAOBean implements GSSDAO {
                }
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#create(java.lang.Object)
-        */
+       @Override
        public void create(final Object obj) {
                if (obj == null)
                        throw new IllegalArgumentException("No object speficied");
                manager.persist(obj);
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#refresh(java.lang.Object)
-        */
+       @Override
        public void refresh(final Object obj) {
                if (obj == null)
                        throw new IllegalArgumentException("No object speficied");
                manager.refresh(obj);
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#update(java.lang.Object)
-        */
+       @Override
        public void update(final Object obj) {
                if (obj == null)
                        throw new IllegalArgumentException("No object speficied");
                manager.merge(obj);
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#delete(java.lang.Object)
-        */
+       @Override
        public void delete(final Object entity) {
                if (entity == null)
                        throw new IllegalArgumentException("No object speficied");
                manager.remove(entity);
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getEntityById(java.lang.Class,
-        *      java.lang.Object)
-        */
+       @Override
        public <T> T getEntityById(final Class<T> _class, final Object _id) throws ObjectNotFoundException {
                if (_id == null)
                        throw new ObjectNotFoundException("No " + _class.getSimpleName() + " specified");
@@ -153,11 +146,7 @@ public class GSSDAOBean implements GSSDAO {
                return entity;
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getGroups(java.lang.Long)
-        */
+       @Override
        @SuppressWarnings("unchecked")
        public List<Group> getGroups(final Long userId) throws ObjectNotFoundException {
                if (userId == null)
@@ -166,11 +155,7 @@ public class GSSDAOBean implements GSSDAO {
                return manager.createQuery("select g from Group g where g.owner.id=:userId").setParameter("userId", userId).getResultList();
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getFiles(java.lang.Long, java.lang.Boolean)
-        */
+       @Override
        @SuppressWarnings("unchecked")
        public List<FileHeader> getFiles(final Long folderId, Long userId, boolean ignoreDeleted) throws ObjectNotFoundException {
                if (folderId == null)
@@ -191,11 +176,7 @@ public class GSSDAOBean implements GSSDAO {
                return retv;
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getUsers(java.lang.Long)
-        */
+       @Override
        @SuppressWarnings("unchecked")
        public List<User> getUsers(final Long groupId) throws ObjectNotFoundException {
                if (groupId == null)
@@ -232,12 +213,7 @@ public class GSSDAOBean implements GSSDAO {
                }
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see gr.ebs.gss.server.ejb.GSSDAO#existsGroup(java.lang.Long,
-        *      java.lang.String)
-        */
+       @Override
        public boolean existsGroup(final Long userId, final String name) throws ObjectNotFoundException {
                if (userId == null)
                        throw new ObjectNotFoundException("No user specified");
@@ -254,9 +230,7 @@ public class GSSDAOBean implements GSSDAO {
                }
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getUserTags(java.lang.Long)
-        */
+       @Override
        public Set<String> getUserTags(final Long userId) throws ObjectNotFoundException {
                if (userId == null)
                        throw new ObjectNotFoundException("No user specified");
@@ -265,16 +239,12 @@ public class GSSDAOBean implements GSSDAO {
                                                .getResultList());
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#flush()
-        */
+       @Override
        public void flush() {
                manager.flush();
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getFile(java.lang.Long, java.lang.String)
-        */
+       @Override
        public FileHeader getFile(Long folderId, String name) throws ObjectNotFoundException {
                if (folderId == null)
                        throw new ObjectNotFoundException("No parent folder specified");
@@ -308,9 +278,7 @@ public class GSSDAOBean implements GSSDAO {
                }
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedFiles(java.lang.Long)
-        */
+       @Override
        public List<FileHeader> getDeletedFiles(Long userId) throws ObjectNotFoundException {
                if (userId == null)
                        throw new ObjectNotFoundException("No User specified");
@@ -326,9 +294,7 @@ public class GSSDAOBean implements GSSDAO {
                return retv;
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedRootFolders(java.lang.Long)
-        */
+       @Override
        public List<Folder> getDeletedRootFolders(Long userId) throws ObjectNotFoundException {
                if (userId == null)
                        throw new ObjectNotFoundException("No User specified");
@@ -367,7 +333,7 @@ public class GSSDAOBean implements GSSDAO {
        public List<Folder> getSharedRootFolders(Long userId) {
                List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
                                        "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
-                                       "and (p.group.id != null or p.user.id != f.owner.id) ").
+                                       "and (p.group.id != null or p.user.id != f.owner.id or f.readForAll=true) ").
                                        setParameter("userId", userId).getResultList();
                List<Folder> result = new ArrayList<Folder>();
                for(Folder f : folders)
@@ -383,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
@@ -413,7 +394,7 @@ public class GSSDAOBean implements GSSDAO {
                                        "and (f.readForAll=true or p.group.id != null or p.user.id != f.owner.id)" +
                                        " and f.folder.id not in (select distinct fo.id from Folder fo LEFT JOIN " +
                                        "fo.permissions po where fo.owner.id=:userId and fo.deleted=false and " +
-                                       "(po.group.id != null or po.user.id != fo.owner.id))").
+                                       "(po.group.id != null or po.user.id != fo.owner.id or fo.readForAll = true))").
                                        setParameter("userId", userId).getResultList();
                List<FileHeader> retv = new ArrayList<FileHeader>();
                for (FileHeader f: tempList)
@@ -447,9 +428,6 @@ public class GSSDAOBean implements GSSDAO {
                return folders;
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedFiles(java.lang.Long, java.lang.Long)
-        */
        @Override
        public List<FileHeader> getSharedFiles(Long userId, Long callingUserId) throws ObjectNotFoundException {
                if (userId == null)
@@ -472,9 +450,6 @@ public class GSSDAOBean implements GSSDAO {
                return retv;
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedRootFolders(java.lang.Long, java.lang.Long)
-        */
        @Override
        public List<Folder> getSharedRootFolders(Long userId, Long callingUserId) {
                List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
@@ -493,9 +468,6 @@ public class GSSDAOBean implements GSSDAO {
 
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#searchFiles(java.lang.Long, java.lang.String)
-        */
        @Override
        public List<FileHeader> searchFiles(Long userId, String query) {
                return manager.createQuery("select f from FileHeader f where f.owner.id=:userId and f.name like :query").
@@ -511,19 +483,6 @@ public class GSSDAOBean implements GSSDAO {
                return results.get(0);
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getFileForIndexing(java.lang.Long)
-        */
-       @Override
-       public FileHeader getFileForIndexing(Long id) throws ObjectNotFoundException {
-               FileHeader h = getEntityById(FileHeader.class, id);
-               h.getFileTags().size();
-               return h;
-       }
-
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getFileCount(java.lang.Long)
-        */
        @Override
        public Long getFileCount(Long userId) {
                Long singleResult = (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.id=:ownerId")
@@ -532,9 +491,6 @@ public class GSSDAOBean implements GSSDAO {
                return singleResult;
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getFileSize(java.lang.Long)
-        */
        @Override
        public Long getFileSize(Long userId) {
                Long singleResult = (Long) manager.createQuery("select sum(f.fileSize) from FileBody f where f.header.owner.id=:ownerId")
@@ -546,18 +502,12 @@ public class GSSDAOBean implements GSSDAO {
 
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getAllFileIds()
-        */
        @Override
        public List<Long> getAllFileIds() {
                List<Long> ids = manager.createQuery("select f.id from FileHeader f").getResultList();
                return ids;
        }
 
-       /* (non-Javadoc)
-        * @see gr.ebs.gss.server.ejb.GSSDAO#getFileUploadStatus(java.lang.Long, java.lang.String)
-        */
        @Override
        public FileUploadStatus getFileUploadStatus(Long userId, String fileName) {
                List<FileUploadStatus> res = manager.createQuery(" select f from FileUploadStatus f where f.owner.id=:userId and f.filename=:filename").setParameter("userId", userId).setParameter("filename", fileName).getResultList();
@@ -619,4 +569,294 @@ public class GSSDAOBean implements GSSDAO {
                ai.updateBandwidth(bandwidthDiff);
        }
 
+       @Override
+       public List<UserClass> getUserClasses() {
+               // Ordering by quota is important here.
+               List<UserClass> ids = manager.createQuery("select uc from UserClass uc order by uc.quota").getResultList();
+               return ids;
+       }
+
+       @Override
+       public List<User> getUsersByUserNameOrEmailLike(String query) {
+               return manager.createQuery("select u from User u where " +
+                                       " upper(u.username) like :query or upper(u.email) like :query order by u.username").
+                       setParameter("query", query.toUpperCase()+"%").getResultList();
+       }
+
+       @Override
+       public Invitation findInvite(String code) {
+               if (code == null)
+                       return null;
+               List<Invitation> results = manager.createQuery("select i from Invitation i where i.code=:code").
+                               setParameter("code", code).getResultList();
+               if (results.isEmpty()) return null;
+               return results.get(0);
+       }
+
+       @Override
+       public UserClass findCouponUserClass() {
+               List<UserClass> results = manager.createQuery("select uc from UserClass uc where uc.name=:name").
+                               setParameter("name", getConfiguration().getString("couponQuota")).getResultList();
+               if (results.isEmpty()) {
+                       // Create the coupon user class on first use.
+                       UserClass couponClass = new UserClass();
+                       couponClass.setName("coupon");
+                       Long couponQuota = getConfiguration().getLong("couponQuota", new Long(52428800L));
+                       couponClass.setQuota(couponQuota);
+                       create(couponClass);
+                       flush();
+                       results.add(couponClass);
+               }
+               return results.get(0);
+       }
+
+       @Override
+       public Long getFileCount(UserClass userClass) {
+               Long result;
+               if(userClass==null)
+                       result=(Long) manager.createQuery("select count(f) from FileHeader f").getSingleResult();
+               else result= (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.userClass.id=:id").setParameter("id", userClass.getId()).getSingleResult();
+               if(result==null)
+                       result =0L;
+               return result;
+       }
+
+       @Override
+       public Long getFileSize(UserClass userClass) {
+               Long result;
+               if(userClass==null)
+                       result=(Long) manager.createQuery("select sum(f.currentBody.fileSize) from FileHeader f").getSingleResult();
+               else result=(Long) manager.createQuery("select sum(f.currentBody.fileSize) from FileHeader f where f.owner.userClass.id=:id").setParameter("id", userClass.getId()).getSingleResult();
+               if(result==null)
+                       result =0L;
+               return result;
+       }
+
+       @Override
+       public Long getUserCount(UserClass userClass) {
+               Long result;
+               if(userClass==null)
+                       result = (Long) manager.createQuery("select count(u) from User u").getSingleResult();
+               else result = (Long) manager.createQuery("select count(u) from User u where u.userClass.id=:id").setParameter("id", userClass.getId()).getSingleResult();
+               if(result==null)
+                       result =0L;
+               return result;
+       }
+
+       @Override
+       public Long getCountUsersByLastLogin(Date lastLoginDate) {
+               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 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 ul from UserLogin ul " +
+                               " where ul.loginDate >= :ldate " +
+                               " order by ul.loginDate desc "
+                               ).
+               setParameter("ldate", lastLoginDate).setFirstResult(firstResult).setMaxResults(maxResult).getResultList();
+       }
+
+       @Override
+       public List<User> getInactiveUsers() {
+               return manager.createQuery("select u from User u where u.active=:active").setParameter("active", false).getResultList();
+       }
+
+       @Override
+       public List<FileHeader> searchFileByFilename(String filename) {
+               return manager.createQuery("select f from FileHeader f where f.name=:name").setParameter("name", filename).getResultList();
+       }
+
+       @Override
+       public Long getBandwithUsed(UserClass userClass, Date date) {
+               Long result;
+               if (userClass == null)
+                       result = (Long) manager.createQuery("select sum(ai.bandwidthUsed)" +
+                                       " from AccountingInfo ai where ai.dateFrom<=:date and " +
+                                       "ai.dateTo>:date").
+                                       setParameter("date", date).
+                                       getSingleResult();
+               else
+                       result = (Long) manager.createQuery("select sum(ai.bandwidthUsed)" +
+                                       " from AccountingInfo ai where ai.user.userClass.id=:id " +
+                                       "and ai.dateFrom<=:date and ai.dateTo>:date").
+                                       setParameter("date", date).
+                                       setParameter("id", userClass.getId()).
+                                       getSingleResult();
+               if (result == null)
+                       result = 0L;
+               return result;
+       }
+
+       @Override
+       public List<AccountingInfo> getAccountingInfo(User user) {
+               List<AccountingInfo> ai = new ArrayList<AccountingInfo>();
+               try {
+                       ai =  manager.createQuery("select ai from AccountingInfo ai " +
+                               "where ai.user=:user")
+                               .setParameter("user", user)
+                               .getResultList();
+               }
+               catch (NoResultException e) {}
+               return ai;
+       }
+
+       @Override
+       public AccountingInfo getAccountingInfo(User user, Date date) {
+               AccountingInfo ai = null;
+               try {
+                       ai = (AccountingInfo) manager.createQuery("select ai from AccountingInfo ai " +
+                               "where ai.user=:user and ai.dateFrom<=:date and ai.dateTo>:date")
+                               .setParameter("user", user)
+                               .setParameter("date", date)
+                               .getSingleResult();
+               }
+               catch (NoResultException e) {
+                       // If not found, that means that there is no accounting info noted
+                       // for given time. So return a 0 as an answer.
+                       ai = new AccountingInfo(user, date, date);
+               }
+               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;
+       }
+
+       
 }