2 * Copyright 2007, 2008, 2009, 2010 Electronic Business Systems Ltd.
4 * This file is part of GSS.
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.
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.
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/>.
19 package gr.ebs.gss.server.ejb;
21 import gr.ebs.gss.client.exceptions.ObjectNotFoundException;
22 import gr.ebs.gss.server.domain.AccountingInfo;
23 import gr.ebs.gss.server.domain.FileBody;
24 import gr.ebs.gss.server.domain.FileHeader;
25 import gr.ebs.gss.server.domain.FileUploadStatus;
26 import gr.ebs.gss.server.domain.Folder;
27 import gr.ebs.gss.server.domain.Group;
28 import gr.ebs.gss.server.domain.Invitation;
29 import gr.ebs.gss.server.domain.Nonce;
30 import gr.ebs.gss.server.domain.User;
32 import java.util.ArrayList;
33 import java.util.Calendar;
34 import java.util.Date;
35 import java.util.GregorianCalendar;
36 import java.util.HashSet;
37 import java.util.List;
40 import javax.ejb.Stateless;
41 import javax.persistence.EntityManager;
42 import javax.persistence.NoResultException;
43 import javax.persistence.PersistenceContext;
45 import org.apache.commons.lang.StringUtils;
48 * The implementation of the GSSDAO interface.
51 public class GSSDAOBean implements GSSDAO {
53 private static final int BANDWIDTH_TIME_PERIOD_FIELD = Calendar.MONTH;
54 private static final int BANDWIDTH_TIME_PERIOD_AMOUNT = 1;
57 * The entity manager for the persistence unit
59 @PersistenceContext(unitName = "gss")
60 private EntityManager manager;
65 * @see gr.ebs.gss.server.ejb.GSSDAO#getRootFolder(java.lang.Long)
67 public Folder getRootFolder(final Long userId) throws ObjectNotFoundException {
70 throw new ObjectNotFoundException("No user specified");
71 return (Folder) manager .createQuery("select f from Folder f where f.owner.id=:ownerId and f.parent is null")
72 .setParameter("ownerId", userId)
74 } catch (final NoResultException e) {
75 throw new ObjectNotFoundException("Root folder not found for user with id=" + userId);
82 * @see gr.ebs.gss.server.ejb.GSSDAO#getUser(java.lang.String)
84 public User getUser(final String username) throws ObjectNotFoundException {
87 throw new ObjectNotFoundException("No user specified");
88 return (User) manager .createQuery("select f from User f where f.username=:username")
89 .setParameter("username", username)
91 } catch (final NoResultException e) {
92 throw new ObjectNotFoundException("No User found for username=" + username);
99 * @see gr.ebs.gss.server.ejb.GSSDAO#create(java.lang.Object)
101 public void create(final Object obj) {
103 throw new IllegalArgumentException("No object speficied");
104 manager.persist(obj);
110 * @see gr.ebs.gss.server.ejb.GSSDAO#refresh(java.lang.Object)
112 public void refresh(final Object obj) {
114 throw new IllegalArgumentException("No object speficied");
115 manager.refresh(obj);
121 * @see gr.ebs.gss.server.ejb.GSSDAO#update(java.lang.Object)
123 public void update(final Object obj) {
125 throw new IllegalArgumentException("No object speficied");
132 * @see gr.ebs.gss.server.ejb.GSSDAO#delete(java.lang.Object)
134 public void delete(final Object entity) {
136 throw new IllegalArgumentException("No object speficied");
137 manager.remove(entity);
143 * @see gr.ebs.gss.server.ejb.GSSDAO#getEntityById(java.lang.Class,
146 public <T> T getEntityById(final Class<T> _class, final Object _id) throws ObjectNotFoundException {
148 throw new ObjectNotFoundException("No " + _class.getSimpleName() + " specified");
150 final T entity = manager.find(_class, _id);
152 throw new ObjectNotFoundException(_class.getSimpleName() + " with id=" + _id + " was not found");
160 * @see gr.ebs.gss.server.ejb.GSSDAO#getGroups(java.lang.Long)
162 @SuppressWarnings("unchecked")
163 public List<Group> getGroups(final Long userId) throws ObjectNotFoundException {
165 throw new ObjectNotFoundException("No user specified");
167 return manager.createQuery("select g from Group g where g.owner.id=:userId").setParameter("userId", userId).getResultList();
173 * @see gr.ebs.gss.server.ejb.GSSDAO#getFiles(java.lang.Long, java.lang.Boolean)
175 @SuppressWarnings("unchecked")
176 public List<FileHeader> getFiles(final Long folderId, Long userId, boolean ignoreDeleted) throws ObjectNotFoundException {
177 if (folderId == null)
178 throw new ObjectNotFoundException("No folder specified");
180 throw new ObjectNotFoundException("No user specified");
181 User user = getEntityById(User.class, userId);
184 query = "select f from FileHeader f where f.folder.id=:folderId and f.deleted=false";
186 query = "select f from FileHeader f where f.folder.id=:folderId";
187 List<FileHeader> tempList = manager.createQuery(query).setParameter("folderId", folderId).getResultList();
188 List<FileHeader> retv = new ArrayList<FileHeader>();
189 for (FileHeader f: tempList)
190 if (f.hasReadPermission(user)) retv.add(f);
198 * @see gr.ebs.gss.server.ejb.GSSDAO#getUsers(java.lang.Long)
200 @SuppressWarnings("unchecked")
201 public List<User> getUsers(final Long groupId) throws ObjectNotFoundException {
203 throw new ObjectNotFoundException("No group specified");
204 return manager.createQuery("select u from User u join u.groupsMember g where g.id=:groupId").
205 setParameter("groupId", groupId).getResultList();
209 public boolean existsFolderOrFile(Long parentId, String name) throws ObjectNotFoundException {
210 if (parentId == null)
211 throw new ObjectNotFoundException("No parent folder specified");
212 if (StringUtils.isEmpty(name))
213 throw new IllegalArgumentException("No folder name specified");
216 manager .createQuery("select f from Folder f " +
217 "where f.parent.id=:parentId and f.name=:name")
218 .setParameter("parentId", parentId)
219 .setParameter("name", name)
222 } catch (NoResultException e) {
224 manager .createQuery("select f from FileHeader f " +
225 "where f.folder.id=:parentId and f.name=:name")
226 .setParameter("parentId", parentId)
227 .setParameter("name", name)
230 } catch (NoResultException e1) {
239 * @see gr.ebs.gss.server.ejb.GSSDAO#existsGroup(java.lang.Long,
242 public boolean existsGroup(final Long userId, final String name) throws ObjectNotFoundException {
244 throw new ObjectNotFoundException("No user specified");
245 if (StringUtils.isEmpty(name))
246 throw new ObjectNotFoundException("No group name specified");
248 manager .createQuery("select g from Group g where g.owner.id=:userId and g.name=:name")
249 .setParameter("userId", userId)
250 .setParameter("name", name)
253 } catch (final NoResultException e) {
259 * @see gr.ebs.gss.server.ejb.GSSDAO#getUserTags(java.lang.Long)
261 public Set<String> getUserTags(final Long userId) throws ObjectNotFoundException {
263 throw new ObjectNotFoundException("No user specified");
264 return new HashSet(manager.createQuery("select t.tag from FileTag t where t.user.id=:userId order by t.tag")
265 .setParameter("userId", userId)
270 * @see gr.ebs.gss.server.ejb.GSSDAO#flush()
272 public void flush() {
277 * @see gr.ebs.gss.server.ejb.GSSDAO#getFile(java.lang.Long, java.lang.String)
279 public FileHeader getFile(Long folderId, String name) throws ObjectNotFoundException {
280 if (folderId == null)
281 throw new ObjectNotFoundException("No parent folder specified");
282 if (StringUtils.isEmpty(name))
283 throw new IllegalArgumentException("No file name specified");
286 return (FileHeader) manager.createQuery("select f from FileHeader f where f.folder.id=:parentId and f.name=:name")
287 .setParameter("parentId", folderId)
288 .setParameter("name", name)
290 } catch (final NoResultException e1) {
291 throw new ObjectNotFoundException("File not found");
296 public Folder getFolder(Long parentId, String name) throws ObjectNotFoundException {
297 if (parentId == null)
298 throw new ObjectNotFoundException("No parent folder specified");
299 if (StringUtils.isEmpty(name))
300 throw new IllegalArgumentException("No folder name specified");
303 return (Folder) manager.createQuery("select f from Folder f where f.parent.id=:parentId and f.name=:name")
304 .setParameter("parentId", parentId)
305 .setParameter("name", name)
307 } catch (NoResultException e) {
308 throw new ObjectNotFoundException("Folder not found");
313 * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedFiles(java.lang.Long)
315 public List<FileHeader> getDeletedFiles(Long userId) throws ObjectNotFoundException {
317 throw new ObjectNotFoundException("No User specified");
318 User user = getEntityById(User.class, userId);
320 List<FileHeader> tempList = manager.createQuery("select f from FileHeader f where f.owner.id=:userId and " +
321 "f.deleted=true and f.folder.deleted=false").
322 setParameter("userId", userId).getResultList();
323 List<FileHeader> retv = new ArrayList<FileHeader>();
324 for (FileHeader f: tempList)
325 if (f.hasReadPermission(user)) retv.add(f);
331 * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedRootFolders(java.lang.Long)
333 public List<Folder> getDeletedRootFolders(Long userId) throws ObjectNotFoundException {
335 throw new ObjectNotFoundException("No User specified");
336 return manager.createQuery("select f from Folder f where f.owner.id=:userId and " +
337 "f.deleted=true and f.parent.deleted=false").
338 setParameter("userId", userId).getResultList();
342 public User findUser(String username) {
343 if (username == null)
345 List<User> results = manager.createQuery("select u from User u where u.username=:username").
346 setParameter("username", username).getResultList();
347 if (results.isEmpty()) return null;
348 return results.get(0);
352 public User findUserByEmail(String email) {
355 List<User> results = manager.createQuery("select u from User u where u.email=:email").
356 setParameter("email", email).getResultList();
357 if (results.isEmpty()) return null;
358 return results.get(0);
362 public List<User> getUsersByUserNameLike(String username) {
363 return manager.createQuery("select u from User u where u.username like :username").
364 setParameter("username", username+"%").getResultList();
368 public List<Folder> getSharedRootFolders(Long userId) {
369 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
370 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
371 "and (p.group.id != null or p.user.id != f.owner.id) ").
372 setParameter("userId", userId).getResultList();
373 List<Folder> result = new ArrayList<Folder>();
374 for(Folder f : folders)
375 if(!folders.contains(f.getParent()))
381 public List<Folder> getFoldersPermittedForGroup(Long userId, Long groupId) {
382 return manager.createQuery("select distinct f from Folder f LEFT JOIN f.permissions p " +
383 "where f.owner.id=:userId and f.deleted = false and p.group.id=:groupId ").
384 setParameter("userId", userId).setParameter("groupId", groupId).getResultList();
388 public List<User> getUsersSharingFoldersForUser(Long userId) {
389 return manager.createQuery("select distinct f.owner from Folder f " +
390 "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
391 "and (p.user.id=:userId or p.group.id in (select distinct gg.id " +
392 "from Group gg join gg.members memb where memb.id=:userId))) ").
393 setParameter("userId", userId).getResultList();
397 public List<User> getUsersSharingFilesForUser(Long userId) {
398 List<User> users = manager.createQuery("select distinct f.owner from FileHeader f " +
399 "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
400 "and (p.user.id=:userId or p.group.id in (select distinct gg.id from Group gg " +
401 "join gg.members memb where memb.id=:userId)))").
402 setParameter("userId", userId).getResultList();
408 public List<FileHeader> getSharedFilesNotInSharedFolders(Long userId) throws ObjectNotFoundException {
410 throw new ObjectNotFoundException("No user specified");
411 User user = getEntityById(User.class, userId);
412 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
413 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
414 "and (f.readForAll=true or p.group.id != null or p.user.id != f.owner.id)" +
415 " and f.folder.id not in (select distinct fo.id from Folder fo LEFT JOIN " +
416 "fo.permissions po where fo.owner.id=:userId and fo.deleted=false and " +
417 "(po.group.id != null or po.user.id != fo.owner.id))").
418 setParameter("userId", userId).getResultList();
419 List<FileHeader> retv = new ArrayList<FileHeader>();
420 for (FileHeader f: tempList)
421 if (f.hasReadPermission(user)) retv.add(f);
427 public List<FileHeader> getSharedFiles(Long userId) throws ObjectNotFoundException {
429 throw new ObjectNotFoundException("No user specified");
430 User user = getEntityById(User.class, userId);
431 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
432 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
433 "and (p.group.id != null or p.user.id != f.owner.id)").
434 setParameter("userId", userId).getResultList();
435 List<FileHeader> retv = new ArrayList<FileHeader>();
436 for (FileHeader f: tempList)
437 if (f.hasReadPermission(user)) retv.add(f);
443 public List<Folder> getSharedFolders(Long userId) {
444 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
445 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
446 "and (p.group.id != null or p.user.id != f.owner.id)").
447 setParameter("userId", userId).getResultList();
452 * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedFiles(java.lang.Long, java.lang.Long)
455 public List<FileHeader> getSharedFiles(Long userId, Long callingUserId) throws ObjectNotFoundException {
457 throw new ObjectNotFoundException("No user specified");
458 User user = getEntityById(User.class, userId);
459 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
460 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
461 "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
462 "(select distinct gg.id from Group gg join gg.members memb " +
463 "where memb.id=:cuserId)) and f.folder.id not in (select distinct fo.id " +
464 "from Folder fo LEFT JOIN fo.permissions po where fo.owner.id = :userId " +
465 "and fo.deleted=false and po.read=true and (po.user.id=:cuserId " +
466 "or po.group.id in (select distinct ggo.id from Group ggo " +
467 "join ggo.members membo where membo.id=:cuserId)))").
468 setParameter("userId", userId).setParameter("cuserId", callingUserId).getResultList();
469 List<FileHeader> retv = new ArrayList<FileHeader>();
470 for (FileHeader f: tempList)
471 if (f.hasReadPermission(user)) retv.add(f);
477 * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedRootFolders(java.lang.Long, java.lang.Long)
480 public List<Folder> getSharedRootFolders(Long userId, Long callingUserId) {
481 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
482 "LEFT JOIN f.permissions p where f.owner.id = :userId and f.deleted=false " +
483 "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
484 "(select distinct gg.id from Group gg join gg.members memb " +
485 "where memb.id=:cuserId))) ").
486 setParameter("userId", userId).
487 setParameter("cuserId", callingUserId).
489 List<Folder> result = new ArrayList<Folder>();
490 for(Folder f : folders)
491 if(!folders.contains(f.getParent()))
498 * @see gr.ebs.gss.server.ejb.GSSDAO#searchFiles(java.lang.Long, java.lang.String)
501 public List<FileHeader> searchFiles(Long userId, String query) {
502 return manager.createQuery("select f from FileHeader f where f.owner.id=:userId and f.name like :query").
503 setParameter("query", "%"+query+"%").setParameter("userId",userId).getResultList();
507 public Nonce getNonce(String nonce, Long userId) throws ObjectNotFoundException {
508 List<Nonce> results = manager.createQuery("select n from Nonce n where n.userId=:userId and n.encodedNonce=:nonce").
509 setParameter("userId", userId).setParameter("nonce", nonce).getResultList();
510 if (results.isEmpty())
511 throw new ObjectNotFoundException("No nonce found");
512 return results.get(0);
516 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileForIndexing(java.lang.Long)
519 public FileHeader getFileForIndexing(Long id) throws ObjectNotFoundException {
520 FileHeader h = getEntityById(FileHeader.class, id);
521 h.getFileTags().size();
526 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileCount(java.lang.Long)
529 public Long getFileCount(Long userId) {
530 Long singleResult = (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.id=:ownerId")
531 .setParameter("ownerId", userId)
537 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileSize(java.lang.Long)
540 public Long getFileSize(Long userId) {
541 Long singleResult = (Long) manager.createQuery("select sum(f.fileSize) from FileBody f where f.header.owner.id=:ownerId")
542 .setParameter("ownerId", userId)
544 if(singleResult == null)
545 singleResult = new Long(0L);
551 * @see gr.ebs.gss.server.ejb.GSSDAO#getAllFileIds()
554 public List<Long> getAllFileIds() {
555 List<Long> ids = manager.createQuery("select f.id from FileHeader f").getResultList();
560 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileUploadStatus(java.lang.Long, java.lang.String)
563 public FileUploadStatus getFileUploadStatus(Long userId, String fileName) {
564 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();
571 public FileBody getFileVersion(Long fileId, int version) throws ObjectNotFoundException {
573 return (FileBody) manager.createQuery("select f from FileBody f " +
574 "where f.header.id=:fileId and f.version=:version")
575 .setParameter("fileId", fileId).setParameter("version", version)
577 } catch (NoResultException e) {
578 throw new ObjectNotFoundException("No version " + version + " found for file #" + fileId);
583 public void updateAccounting(User user, Date date, long bandwidthDiff) {
584 AccountingInfo ai = null;
586 ai = (AccountingInfo) manager.createQuery("select ai from AccountingInfo ai " +
587 "where ai.user=:user and ai.dateFrom<=:date and ai.dateTo>:date")
588 .setParameter("user", user)
589 .setParameter("date", date)
592 catch (NoResultException e) {
597 // The right entry does not exist; must be created.
598 // This is where we set the initial time period.
599 // We now start from the user's creation, we can change this to something else.
600 Calendar creationDate = new GregorianCalendar();
601 creationDate.setTime(user.getAuditInfo().getCreationDate());
605 long timeInMillis = date.getTime();
607 dateFrom = (Calendar) creationDate.clone();
608 dateFrom.add(BANDWIDTH_TIME_PERIOD_FIELD, offset);
609 dateTo = (Calendar) dateFrom.clone();
610 dateTo.add(BANDWIDTH_TIME_PERIOD_FIELD, 1);
611 offset += BANDWIDTH_TIME_PERIOD_AMOUNT;
613 while (!(dateFrom.getTimeInMillis()<=timeInMillis && dateTo.getTimeInMillis()>timeInMillis));
615 ai = new AccountingInfo(user, dateFrom.getTime(), dateTo.getTime());
620 ai.updateBandwidth(bandwidthDiff);
624 public Invitation findInvite(String code) {
627 List<Invitation> results = manager.createQuery("select i from Invitation i where i.code=:code").
628 setParameter("code", code).getResultList();
629 if (results.isEmpty()) return null;
630 return results.get(0);