Added in the index the id of users and groups that have read access to a file
[pithos] / src / gr / ebs / gss / server / ejb / GSSDAOBean.java
1 /*
2  * Copyright 2007, 2008, 2009, 2010 Electronic Business Systems Ltd.
3  *
4  * This file is part of GSS.
5  *
6  * GSS is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSS.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 package gr.ebs.gss.server.ejb;
20
21 import static gr.ebs.gss.server.configuration.GSSConfigurationFactory.getConfiguration;
22 import gr.ebs.gss.client.exceptions.ObjectNotFoundException;
23 import gr.ebs.gss.server.domain.AccountingInfo;
24 import gr.ebs.gss.server.domain.FileBody;
25 import gr.ebs.gss.server.domain.FileHeader;
26 import gr.ebs.gss.server.domain.FileUploadStatus;
27 import gr.ebs.gss.server.domain.Folder;
28 import gr.ebs.gss.server.domain.Group;
29 import gr.ebs.gss.server.domain.Invitation;
30 import gr.ebs.gss.server.domain.Nonce;
31 import gr.ebs.gss.server.domain.User;
32 import gr.ebs.gss.server.domain.UserClass;
33 import gr.ebs.gss.server.domain.UserLogin;
34
35 import java.math.BigInteger;
36 import java.util.ArrayList;
37 import java.util.Calendar;
38 import java.util.Date;
39 import java.util.GregorianCalendar;
40 import java.util.HashSet;
41 import java.util.List;
42 import java.util.Set;
43
44 import javax.ejb.Stateless;
45 import javax.persistence.EntityManager;
46 import javax.persistence.NoResultException;
47 import javax.persistence.PersistenceContext;
48 import javax.persistence.Query;
49
50 import org.apache.commons.lang.StringUtils;
51
52 /**
53  * The implementation of the GSSDAO interface.
54  */
55 @Stateless
56 public class GSSDAOBean implements GSSDAO {
57
58         private static final int BANDWIDTH_TIME_PERIOD_FIELD = Calendar.MONTH;
59         private static final int BANDWIDTH_TIME_PERIOD_AMOUNT = 1;
60
61         /**
62          * The entity manager for the persistence unit
63          */
64         @PersistenceContext(unitName = "gss")
65         private EntityManager manager;
66
67         @Override
68         public Folder getRootFolder(final Long userId) throws ObjectNotFoundException {
69                 try {
70                         if (userId == null)
71                                 throw new ObjectNotFoundException("No user specified");
72                         return (Folder) manager .createQuery("select f from Folder f where f.owner.id=:ownerId and f.parent is null")
73                                                                         .setParameter("ownerId", userId)
74                                                                         .getSingleResult();
75                 } catch (final NoResultException e) {
76                         throw new ObjectNotFoundException("Root folder not found for user with id=" + userId);
77                 }
78         }
79
80         @Override
81         public User getUser(final String username) throws ObjectNotFoundException {
82                 try {
83                         if (username == null)
84                                 throw new ObjectNotFoundException("No user specified");
85                         return (User) manager   .createQuery("select f from User f where f.username=:username")
86                                                                         .setParameter("username", username)
87                                                                         .getSingleResult();
88                 } catch (final NoResultException e) {
89                         throw new ObjectNotFoundException("No User found for username=" + username);
90                 }
91         }
92
93         @Override
94         public void create(final Object obj) {
95                 if (obj == null)
96                         throw new IllegalArgumentException("No object speficied");
97                 manager.persist(obj);
98         }
99
100         @Override
101         public void refresh(final Object obj) {
102                 if (obj == null)
103                         throw new IllegalArgumentException("No object speficied");
104                 manager.refresh(obj);
105         }
106
107         @Override
108         public void update(final Object obj) {
109                 if (obj == null)
110                         throw new IllegalArgumentException("No object speficied");
111                 manager.merge(obj);
112         }
113
114         @Override
115         public void delete(final Object entity) {
116                 if (entity == null)
117                         throw new IllegalArgumentException("No object speficied");
118                 manager.remove(entity);
119         }
120
121         @Override
122         public <T> T getEntityById(final Class<T> _class, final Object _id) throws ObjectNotFoundException {
123                 if (_id == null)
124                         throw new ObjectNotFoundException("No " + _class.getSimpleName() + " specified");
125
126                 final T entity = manager.find(_class, _id);
127                 if (entity == null)
128                         throw new ObjectNotFoundException(_class.getSimpleName() + " with id=" + _id + " was not found");
129
130                 return entity;
131         }
132
133         @Override
134         @SuppressWarnings("unchecked")
135         public List<Group> getGroups(final Long userId) throws ObjectNotFoundException {
136                 if (userId == null)
137                         throw new ObjectNotFoundException("No user specified");
138
139                 return manager.createQuery("select g from Group g where g.owner.id=:userId").setParameter("userId", userId).getResultList();
140         }
141
142         @Override
143         @SuppressWarnings("unchecked")
144         public List<FileHeader> getFiles(final Long folderId, Long userId, boolean ignoreDeleted) throws ObjectNotFoundException {
145                 if (folderId == null)
146                         throw new ObjectNotFoundException("No folder specified");
147                 if (userId == null)
148                         throw new ObjectNotFoundException("No user specified");
149                 User user = getEntityById(User.class, userId);
150                 String query;
151                 if(ignoreDeleted)
152                         query = "select f from FileHeader f where f.folder.id=:folderId  and f.deleted=false";
153                 else
154                         query = "select f from FileHeader f where f.folder.id=:folderId";
155                 List<FileHeader> tempList = manager.createQuery(query).setParameter("folderId", folderId).getResultList();
156                 List<FileHeader> retv = new ArrayList<FileHeader>();
157                 for (FileHeader f: tempList)
158                         if (f.hasReadPermission(user)) retv.add(f);
159
160                 return retv;
161         }
162
163         @Override
164         @SuppressWarnings("unchecked")
165         public List<User> getUsers(final Long groupId) throws ObjectNotFoundException {
166                 if (groupId == null)
167                         throw new ObjectNotFoundException("No group specified");
168                 return manager.createQuery("select u from User u join u.groupsMember g where g.id=:groupId").
169                                 setParameter("groupId", groupId).getResultList();
170         }
171
172         @Override
173         public boolean existsFolderOrFile(Long parentId, String name) throws ObjectNotFoundException {
174                 if (parentId == null)
175                         throw new ObjectNotFoundException("No parent folder specified");
176                 if (StringUtils.isEmpty(name))
177                         throw new IllegalArgumentException("No folder name specified");
178
179                 try {
180                         manager .createQuery("select f from Folder f " +
181                                         "where f.parent.id=:parentId and f.name=:name")
182                                         .setParameter("parentId", parentId)
183                                         .setParameter("name", name)
184                                         .getSingleResult();
185                         return true;
186                 } catch (NoResultException e) {
187                         try {
188                                 manager .createQuery("select f from FileHeader f " +
189                                                 "where f.folder.id=:parentId and f.name=:name")
190                                                 .setParameter("parentId", parentId)
191                                                 .setParameter("name", name)
192                                                 .getSingleResult();
193                                 return true;
194                         } catch (NoResultException e1) {
195                                 return false;
196                         }
197                 }
198         }
199
200         @Override
201         public boolean existsGroup(final Long userId, final String name) throws ObjectNotFoundException {
202                 if (userId == null)
203                         throw new ObjectNotFoundException("No user specified");
204                 if (StringUtils.isEmpty(name))
205                         throw new ObjectNotFoundException("No group name specified");
206                 try {
207                         manager .createQuery("select g from Group g where g.owner.id=:userId and g.name=:name")
208                                         .setParameter("userId", userId)
209                                         .setParameter("name", name)
210                                         .getSingleResult();
211                         return true;
212                 } catch (final NoResultException e) {
213                         return false;
214                 }
215         }
216
217         @Override
218         public Set<String> getUserTags(final Long userId) throws ObjectNotFoundException {
219                 if (userId == null)
220                         throw new ObjectNotFoundException("No user specified");
221                 return new HashSet(manager.createQuery("select t.tag from FileTag t where t.user.id=:userId order by t.tag")
222                                                 .setParameter("userId", userId)
223                                                 .getResultList());
224         }
225
226         @Override
227         public void flush() {
228                 manager.flush();
229         }
230
231         @Override
232         public FileHeader getFile(Long folderId, String name) throws ObjectNotFoundException {
233                 if (folderId == null)
234                         throw new ObjectNotFoundException("No parent folder specified");
235                 if (StringUtils.isEmpty(name))
236                         throw new IllegalArgumentException("No file name specified");
237
238                 try {
239                         return (FileHeader) manager.createQuery("select f from FileHeader f where f.folder.id=:parentId and f.name=:name")
240                                         .setParameter("parentId", folderId)
241                                         .setParameter("name", name)
242                                         .getSingleResult();
243                 } catch (final NoResultException e1) {
244                         throw new ObjectNotFoundException("File not found");
245                 }
246         }
247
248         @Override
249         public Folder getFolder(Long parentId, String name) throws ObjectNotFoundException {
250                 if (parentId == null)
251                         throw new ObjectNotFoundException("No parent folder specified");
252                 if (StringUtils.isEmpty(name))
253                         throw new IllegalArgumentException("No folder name specified");
254
255                 try {
256                         return (Folder) manager.createQuery("select f from Folder f where f.parent.id=:parentId and f.name=:name")
257                                         .setParameter("parentId", parentId)
258                                         .setParameter("name", name)
259                                         .getSingleResult();
260                 } catch (NoResultException e) {
261                         throw new ObjectNotFoundException("Folder not found");
262                 }
263         }
264
265         @Override
266         public List<FileHeader> getDeletedFiles(Long userId) throws ObjectNotFoundException {
267                 if (userId == null)
268                         throw new ObjectNotFoundException("No User specified");
269                 User user = getEntityById(User.class, userId);
270
271                 List<FileHeader> tempList = manager.createQuery("select f from FileHeader f where f.owner.id=:userId and " +
272                                         "f.deleted=true and f.folder.deleted=false").
273                                         setParameter("userId", userId).getResultList();
274                 List<FileHeader> retv = new ArrayList<FileHeader>();
275                 for (FileHeader f: tempList)
276                         if (f.hasReadPermission(user)) retv.add(f);
277
278                 return retv;
279         }
280
281         @Override
282         public List<Folder> getDeletedRootFolders(Long userId) throws ObjectNotFoundException {
283                 if (userId == null)
284                         throw new ObjectNotFoundException("No User specified");
285                 return manager.createQuery("select f from Folder f where f.owner.id=:userId and " +
286                                         "f.deleted=true and f.parent.deleted=false").
287                                         setParameter("userId", userId).getResultList();
288         }
289
290         @Override
291         public User findUser(String username) {
292                 if (username == null)
293                         return null;
294                 List<User> results = manager.createQuery("select u from User u where u.username=:username").
295                                 setParameter("username", username).getResultList();
296                 if (results.isEmpty()) return null;
297                 return results.get(0);
298         }
299
300         @Override
301         public User findUserByEmail(String email) {
302                 if (email == null)
303                         return null;
304                 List<User> results = manager.createQuery("select u from User u where u.email=:email").
305                                 setParameter("email", email).getResultList();
306                 if (results.isEmpty()) return null;
307                 return results.get(0);
308         }
309
310         @Override
311         public List<User> getUsersByUserNameLike(String username) {
312                 return manager.createQuery("select u from User u where u.username like :username").
313                 setParameter("username", username+"%").getResultList();
314         }
315
316         @Override
317         public List<Folder> getSharedRootFolders(Long userId) {
318                 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
319                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
320                                         "and (p.group.id != null or p.user.id != f.owner.id or f.readForAll=true) ").
321                                         setParameter("userId", userId).getResultList();
322                 List<Folder> result = new ArrayList<Folder>();
323                 for(Folder f : folders)
324                         if(!folders.contains(f.getParent()))
325                                 result.add(f);
326                 return result;
327         }
328
329         @Override
330         public List<Folder> getFoldersPermittedForGroup(Long userId, Long groupId) {
331                 return manager.createQuery("select distinct f from Folder f LEFT JOIN f.permissions p " +
332                                         "where f.owner.id=:userId and f.deleted = false and p.group.id=:groupId ").
333                                         setParameter("userId", userId).setParameter("groupId", groupId).getResultList();
334         }
335
336         private List<Long> getGroupIdsForUserId(Long userId) {
337                 List<BigInteger> groups = manager.createNativeQuery("select distinct groupsmember_id " +
338                 "from GSS_Group_GSS_User where members_id=:userId")
339                         .setParameter("userId", userId)
340                         .getResultList();
341                 List<Long> groupIds = new ArrayList<Long>();
342                 for (BigInteger id : groups)
343                         groupIds.add(id.longValue());
344                 return groupIds;
345         }
346         
347         @Override
348         public List<User> getUsersSharingFoldersForUser(Long userId) {
349         List<Long> groupIds = getGroupIdsForUserId(userId);
350                 Query q = manager.createQuery("select distinct f.owner from Folder f " +
351                                         "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
352                                         "and (p.user.id=:userId "+ (groupIds.isEmpty() ? "" : "or p.group.id in (:groupIds)") +")").
353                                         setParameter("userId", userId);
354         if (!groupIds.isEmpty())
355             q.setParameter("groupIds", groupIds);
356         return q.getResultList();            
357         }
358
359         @Override
360         public List<User> getUsersSharingFilesForUser(Long userId) {
361         List<Long> groupIds = getGroupIdsForUserId(userId);
362                 Query q = manager.createQuery("select distinct f.owner from FileHeader f " +
363                                         "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
364                                         "and (p.user.id=:userId " + (groupIds.isEmpty() ? "" : "or p.group.id in (:groupIds)") + ")").
365                                         setParameter("userId", userId);
366         if (!groupIds.isEmpty())
367             q.setParameter("groupIds", groupIds);
368         return q.getResultList();
369         }
370
371         @Override
372         public List<FileHeader> getSharedFilesNotInSharedFolders(Long userId) throws ObjectNotFoundException {
373                 if (userId == null)
374                         throw new ObjectNotFoundException("No user specified");
375                 User user = getEntityById(User.class, userId);
376                 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
377                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
378                                         "and (f.readForAll=true or p.group.id != null or p.user.id != f.owner.id)" +
379                                         " and f.folder.id not in (select distinct fo.id from Folder fo LEFT JOIN " +
380                                         "fo.permissions po where fo.owner.id=:userId and fo.deleted=false and " +
381                                         "(po.group.id != null or po.user.id != fo.owner.id or fo.readForAll = true))").
382                                         setParameter("userId", userId).getResultList();
383                 List<FileHeader> retv = new ArrayList<FileHeader>();
384                 for (FileHeader f: tempList)
385                         if (f.hasReadPermission(user)) retv.add(f);
386
387                 return retv;
388         }
389
390         @Override
391         public List<FileHeader> getSharedFiles(Long userId) throws ObjectNotFoundException {
392                 if (userId == null)
393                         throw new ObjectNotFoundException("No user specified");
394                 User user = getEntityById(User.class, userId);
395                 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
396                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
397                                         "and (p.group.id != null or p.user.id != f.owner.id)").
398                                         setParameter("userId", userId).getResultList();
399                 List<FileHeader> retv = new ArrayList<FileHeader>();
400                 for (FileHeader f: tempList)
401                         if (f.hasReadPermission(user)) retv.add(f);
402
403                 return retv;
404         }
405
406         @Override
407         public List<Folder> getSharedFolders(Long userId) {
408                 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
409                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
410                                         "and (p.group.id != null or p.user.id != f.owner.id)").
411                                         setParameter("userId", userId).getResultList();
412                 return folders;
413         }
414
415         @Override
416         public List<FileHeader> getSharedFiles(Long userId, Long callingUserId) throws ObjectNotFoundException {
417                 if (userId == null)
418                         throw new ObjectNotFoundException("No user specified");
419                 User user = getEntityById(User.class, userId);
420                 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
421                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
422                                         "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
423                                         "(select distinct gg.id from Group gg join gg.members memb " +
424                                         "where memb.id=:cuserId)) and f.folder.id not in (select distinct fo.id " +
425                                         "from Folder fo LEFT JOIN fo.permissions po where fo.owner.id = :userId " +
426                                         "and fo.deleted=false and po.read=true and (po.user.id=:cuserId " +
427                                         "or po.group.id in (select distinct ggo.id from Group ggo " +
428                                         "join ggo.members membo where membo.id=:cuserId)))").
429                                         setParameter("userId", userId).setParameter("cuserId", callingUserId).getResultList();
430                 List<FileHeader> retv = new ArrayList<FileHeader>();
431                 for (FileHeader f: tempList)
432                         if (f.hasReadPermission(user)) retv.add(f);
433
434                 return retv;
435         }
436
437         @Override
438         public List<Folder> getSharedRootFolders(Long userId, Long callingUserId) {
439                 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
440                                         "LEFT JOIN f.permissions p where f.owner.id = :userId and f.deleted=false " +
441                                         "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
442                                         "(select distinct gg.id from Group gg join gg.members memb " +
443                                         "where memb.id=:cuserId))) ").
444                                         setParameter("userId", userId).
445                                         setParameter("cuserId", callingUserId).
446                                         getResultList();
447                 List<Folder> result = new ArrayList<Folder>();
448                 for(Folder f : folders)
449                         if(!folders.contains(f.getParent()))
450                                 result.add(f);
451                 return result;
452
453         }
454
455         @Override
456         public List<FileHeader> searchFiles(Long userId, String query) {
457                 return manager.createQuery("select f from FileHeader f where f.owner.id=:userId and f.name like :query").
458                                 setParameter("query", "%"+query+"%").setParameter("userId",userId).getResultList();
459         }
460
461         @Override
462         public Nonce getNonce(String nonce, Long userId) throws ObjectNotFoundException {
463                 List<Nonce> results = manager.createQuery("select n from Nonce n where n.userId=:userId and n.encodedNonce=:nonce").
464                                 setParameter("userId", userId).setParameter("nonce", nonce).getResultList();
465                 if (results.isEmpty())
466                         throw new ObjectNotFoundException("No nonce found");
467                 return results.get(0);
468         }
469
470         @Override
471         public Long getFileCount(Long userId) {
472                 Long singleResult = (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.id=:ownerId")
473                 .setParameter("ownerId", userId)
474                 .getSingleResult();
475                 return singleResult;
476         }
477
478         @Override
479         public Long getFileSize(Long userId) {
480                 Long singleResult = (Long) manager.createQuery("select sum(f.fileSize) from FileBody f where f.header.owner.id=:ownerId")
481                 .setParameter("ownerId", userId)
482                 .getSingleResult();
483                 if(singleResult == null)
484                         singleResult = new Long(0L);
485                 return singleResult;
486
487         }
488
489         @Override
490         public List<Long> getAllFileIds() {
491                 List<Long> ids = manager.createQuery("select f.id from FileHeader f").getResultList();
492                 return ids;
493         }
494
495         @Override
496         public FileUploadStatus getFileUploadStatus(Long userId, String fileName) {
497                 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();
498                 if(res.size()>0)
499                         return res.get(0);
500                 return null;
501         }
502
503         @Override
504         public FileBody getFileVersion(Long fileId, int version) throws ObjectNotFoundException {
505                 try {
506                         return (FileBody) manager.createQuery("select f from FileBody f " +
507                         "where f.header.id=:fileId and f.version=:version")
508                         .setParameter("fileId", fileId).setParameter("version", version)
509                         .getSingleResult();
510                 } catch (NoResultException e) {
511                         throw new ObjectNotFoundException("No version " + version + " found for file #" + fileId);
512                 }
513         }
514
515         @Override
516         public void updateAccounting(User user, Date date, long bandwidthDiff) {
517                 AccountingInfo ai = null;
518                 try {
519                         ai = (AccountingInfo) manager.createQuery("select ai from AccountingInfo ai " +
520                                 "where ai.user=:user and ai.dateFrom<=:date and ai.dateTo>:date")
521                                 .setParameter("user", user)
522                                 .setParameter("date", date)
523                                 .getSingleResult();
524                 }
525                 catch (NoResultException e) {
526                         ai = null;
527                 }
528
529                 if (ai==null) {
530                         // The right entry does not exist; must be created.
531                         // This is where we set the initial time period.
532                         // We now start from the user's creation, we can change this to something else.
533                         Calendar creationDate = new GregorianCalendar();
534                         creationDate.setTime(user.getAuditInfo().getCreationDate());
535                         int offset = 0;
536                         Calendar dateFrom;
537                         Calendar dateTo;
538                         long timeInMillis = date.getTime();
539                         do {
540                                 dateFrom = (Calendar) creationDate.clone();
541                                 dateFrom.add(BANDWIDTH_TIME_PERIOD_FIELD, offset);
542                                 dateTo = (Calendar) dateFrom.clone();
543                                 dateTo.add(BANDWIDTH_TIME_PERIOD_FIELD, 1);
544                                 offset += BANDWIDTH_TIME_PERIOD_AMOUNT;
545                         }
546                         while (!(dateFrom.getTimeInMillis()<=timeInMillis && dateTo.getTimeInMillis()>timeInMillis));
547
548                         ai = new AccountingInfo(user, dateFrom.getTime(), dateTo.getTime());
549                         manager.persist(ai);
550                 }
551
552                 // Do the update.
553                 ai.updateBandwidth(bandwidthDiff);
554         }
555
556         @Override
557         public List<UserClass> getUserClasses() {
558                 // Ordering by quota is important here.
559                 List<UserClass> ids = manager.createQuery("select uc from UserClass uc order by uc.quota").getResultList();
560                 return ids;
561         }
562
563         @Override
564         public List<User> getUsersByUserNameOrEmailLike(String query) {
565                 return manager.createQuery("select u from User u where " +
566                                         " upper(u.username) like :query or upper(u.email) like :query order by u.username").
567                         setParameter("query", query.toUpperCase()+"%").getResultList();
568         }
569
570         @Override
571         public Invitation findInvite(String code) {
572                 if (code == null)
573                         return null;
574                 List<Invitation> results = manager.createQuery("select i from Invitation i where i.code=:code").
575                                 setParameter("code", code).getResultList();
576                 if (results.isEmpty()) return null;
577                 return results.get(0);
578         }
579
580         @Override
581         public UserClass findCouponUserClass() {
582                 List<UserClass> results = manager.createQuery("select uc from UserClass uc where uc.name=:name").
583                                 setParameter("name", getConfiguration().getString("couponQuota")).getResultList();
584                 if (results.isEmpty()) {
585                         // Create the coupon user class on first use.
586                         UserClass couponClass = new UserClass();
587                         couponClass.setName("coupon");
588                         Long couponQuota = getConfiguration().getLong("couponQuota", new Long(52428800L));
589                         couponClass.setQuota(couponQuota);
590                         create(couponClass);
591                         flush();
592                         results.add(couponClass);
593                 }
594                 return results.get(0);
595         }
596
597         @Override
598         public Long getFileCount(UserClass userClass) {
599                 Long result;
600                 if(userClass==null)
601                         result=(Long) manager.createQuery("select count(f) from FileHeader f").getSingleResult();
602                 else result= (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.userClass.id=:id").setParameter("id", userClass.getId()).getSingleResult();
603                 if(result==null)
604                         result =0L;
605                 return result;
606         }
607
608         @Override
609         public Long getFileSize(UserClass userClass) {
610                 Long result;
611                 if(userClass==null)
612                         result=(Long) manager.createQuery("select sum(f.currentBody.fileSize) from FileHeader f").getSingleResult();
613                 else result=(Long) manager.createQuery("select sum(f.currentBody.fileSize) from FileHeader f where f.owner.userClass.id=:id").setParameter("id", userClass.getId()).getSingleResult();
614                 if(result==null)
615                         result =0L;
616                 return result;
617         }
618
619         @Override
620         public Long getUserCount(UserClass userClass) {
621                 Long result;
622                 if(userClass==null)
623                         result = (Long) manager.createQuery("select count(u) from User u").getSingleResult();
624                 else result = (Long) manager.createQuery("select count(u) from User u where u.userClass.id=:id").setParameter("id", userClass.getId()).getSingleResult();
625                 if(result==null)
626                         result =0L;
627                 return result;
628         }
629
630         @Override
631         public Long getCountUsersByLastLogin(Date lastLoginDate) {
632                 return (Long) manager.createQuery("select count(u) from User u where " +
633                 " u.lastLogin >= :ldate ").setParameter("ldate", lastLoginDate).getSingleResult();
634         }
635
636         @Override
637         public List<User> getUsersByLastLogin(Date lastLoginDate) {
638                 return manager.createQuery("select u from User u where " +
639                         " u.lastLogin >= :ldate order by u.lastLogin desc").
640                         setParameter("ldate", lastLoginDate).getResultList();
641         }
642
643         @Override
644         public List<User> getUsersByLastLogin(Date lastLoginDate, int firstResult, int maxResult) {
645                 return manager.createQuery("select u from User u where " +
646                 " u.lastLogin >= :ldate order by u.lastLogin desc").
647                 setParameter("ldate", lastLoginDate).setFirstResult(firstResult).setMaxResults(maxResult).getResultList();
648         }
649
650         @Override
651         public List<User> getInactiveUsers() {
652                 return manager.createQuery("select u from User u where u.active=:active").setParameter("active", false).getResultList();
653         }
654
655         @Override
656         public List<FileHeader> searchFileByFilename(String filename) {
657                 return manager.createQuery("select f from FileHeader f where f.name=:name").setParameter("name", filename).getResultList();
658         }
659
660         @Override
661         public Long getBandwithUsed(UserClass userClass, Date date) {
662                 Long result;
663                 if (userClass == null)
664                         result = (Long) manager.createQuery("select sum(ai.bandwidthUsed)" +
665                                         " from AccountingInfo ai where ai.dateFrom<=:date and " +
666                                         "ai.dateTo>:date").
667                                         setParameter("date", date).
668                                         getSingleResult();
669                 else
670                         result = (Long) manager.createQuery("select sum(ai.bandwidthUsed)" +
671                                         " from AccountingInfo ai where ai.user.userClass.id=:id " +
672                                         "and ai.dateFrom<=:date and ai.dateTo>:date").
673                                         setParameter("date", date).
674                                         setParameter("id", userClass.getId()).
675                                         getSingleResult();
676                 if (result == null)
677                         result = 0L;
678                 return result;
679         }
680
681         @Override
682         public List<AccountingInfo> getAccountingInfo(User user) {
683                 List<AccountingInfo> ai = new ArrayList<AccountingInfo>();
684                 try {
685                         ai =  manager.createQuery("select ai from AccountingInfo ai " +
686                                 "where ai.user=:user")
687                                 .setParameter("user", user)
688                                 .getResultList();
689                 }
690                 catch (NoResultException e) {}
691                 return ai;
692         }
693
694         @Override
695         public AccountingInfo getAccountingInfo(User user, Date date) {
696                 AccountingInfo ai = null;
697                 try {
698                         ai = (AccountingInfo) manager.createQuery("select ai from AccountingInfo ai " +
699                                 "where ai.user=:user and ai.dateFrom<=:date and ai.dateTo>:date")
700                                 .setParameter("user", user)
701                                 .setParameter("date", date)
702                                 .getSingleResult();
703                 }
704                 catch (NoResultException e) {
705                         // If not found, that means that there is no accounting info noted
706                         // for given time. So return a 0 as an answer.
707                         ai = new AccountingInfo(user, date, date);
708                 }
709                 return ai;
710         }
711
712         @Override
713         public List<FileHeader> getFilesPermittedForGroup(Long userId, Long groupId) {
714                 return manager.createQuery("select distinct f from FileHeader f LEFT JOIN f.permissions p " +
715                                         "where f.owner.id=:userId and f.deleted = false and p.group.id=:groupId ").
716                                         setParameter("userId", userId).setParameter("groupId", groupId).getResultList();
717         }
718         
719         @Override
720         public List<Folder> getSharingFoldersForUser(Long userId) {
721                 return manager.createQuery("select distinct f from Folder f " +
722                                         "LEFT JOIN f.permissions p where  " +
723                                         " (p.user.id=:userId or p.group.id in (select distinct gg.id " +
724                                         "from Group gg join gg.members memb where memb.id=:userId))) ").
725                                         setParameter("userId", userId).getResultList();
726         }
727         
728         @Override
729         public List<FileHeader> getSharingFilesForUser(Long userId) {
730                 List<FileHeader> users = manager.createQuery("select distinct f from FileHeader f " +
731                                         "LEFT JOIN f.permissions p where " +
732                                         " (p.user.id=:userId or p.group.id in (select distinct gg.id from Group gg " +
733                                         "join gg.members memb where memb.id=:userId)))").
734                                         setParameter("userId", userId).getResultList();
735                 return users;
736     }
737
738     @Override
739     public FileHeader getFileForIndexing(Long id) throws ObjectNotFoundException {
740         FileHeader h = getEntityById(FileHeader.class, id);
741         h.getFileTags().size();
742         h.getPermissions().size();
743         return h;
744     }
745         
746         @Override 
747         public List<Group> getGroupsContainingUser(Long userId){
748                 List<Group> groups = manager.createQuery("select distinct gg " +
749                                         "from Group gg join gg.members memb where memb.id=:userId)").setParameter("userId", userId).getResultList();
750                 return groups;
751         }
752         
753         @Override
754         public List<FileUploadStatus> getUploadStatus(Long userId){
755                 List<FileUploadStatus> res = manager.createQuery("select f from FileUploadStatus f where f.owner.id=:userId").setParameter("userId", userId).getResultList();
756                 return res;
757         }
758         @Override
759         public int deletePermissionsNotCorrespondingToFilesAndFolders(Long userId){
760                 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();
761         }
762         
763         public List<UserLogin> getLoginsForUser (Long userId){
764                 List<UserLogin> res = manager
765                                                                 .createQuery("select ul from UserLogin ul where ul.user.id=:userId " +
766                                                                                         " order by ul.loginDate desc")                                                                                  
767                                                                 .setParameter("userId", userId)
768                                                                 .setMaxResults(2)                                                               
769                                                                 .getResultList();
770                 return res;                                                                     
771         }
772 }