2 * Copyright 2007, 2008, 2009 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.Nonce;
29 import gr.ebs.gss.server.domain.User;
31 import java.util.ArrayList;
32 import java.util.Calendar;
33 import java.util.Date;
34 import java.util.GregorianCalendar;
35 import java.util.HashSet;
36 import java.util.List;
39 import javax.ejb.Stateless;
40 import javax.persistence.EntityManager;
41 import javax.persistence.NoResultException;
42 import javax.persistence.PersistenceContext;
44 import org.apache.commons.lang.StringUtils;
47 * The implementation of the GSSDAO interface.
50 public class GSSDAOBean implements GSSDAO {
52 private static final int BANDWIDTH_TIME_PERIOD_FIELD = Calendar.MONTH;
53 private static final int BANDWIDTH_TIME_PERIOD_AMOUNT = 1;
56 * The entity manager for the persistence unit
58 @PersistenceContext(unitName = "gss")
59 private EntityManager manager;
64 * @see gr.ebs.gss.server.ejb.GSSDAO#getRootFolder(java.lang.Long)
66 public Folder getRootFolder(final Long userId) throws ObjectNotFoundException {
69 throw new ObjectNotFoundException("No user specified");
70 return (Folder) manager .createQuery("select f from Folder f where f.owner.id=:ownerId and f.parent is null")
71 .setParameter("ownerId", userId)
73 } catch (final NoResultException e) {
74 throw new ObjectNotFoundException("Root folder not found for user with id=" + userId);
81 * @see gr.ebs.gss.server.ejb.GSSDAO#getUser(java.lang.String)
83 public User getUser(final String username) throws ObjectNotFoundException {
86 throw new ObjectNotFoundException("No user specified");
87 return (User) manager .createQuery("select f from User f where f.username=:username")
88 .setParameter("username", username)
90 } catch (final NoResultException e) {
91 throw new ObjectNotFoundException("No User found for username=" + username);
98 * @see gr.ebs.gss.server.ejb.GSSDAO#create(java.lang.Object)
100 public void create(final Object obj) {
102 throw new IllegalArgumentException("No object speficied");
103 manager.persist(obj);
109 * @see gr.ebs.gss.server.ejb.GSSDAO#refresh(java.lang.Object)
111 public void refresh(final Object obj) {
113 throw new IllegalArgumentException("No object speficied");
114 manager.refresh(obj);
120 * @see gr.ebs.gss.server.ejb.GSSDAO#update(java.lang.Object)
122 public void update(final Object obj) {
124 throw new IllegalArgumentException("No object speficied");
131 * @see gr.ebs.gss.server.ejb.GSSDAO#delete(java.lang.Object)
133 public void delete(final Object entity) {
135 throw new IllegalArgumentException("No object speficied");
136 manager.remove(entity);
142 * @see gr.ebs.gss.server.ejb.GSSDAO#getEntityById(java.lang.Class,
145 public <T> T getEntityById(final Class<T> _class, final Object _id) throws ObjectNotFoundException {
147 throw new ObjectNotFoundException("No " + _class.getSimpleName() + " specified");
149 final T entity = manager.find(_class, _id);
151 throw new ObjectNotFoundException(_class.getSimpleName() + " with id=" + _id + " was not found");
159 * @see gr.ebs.gss.server.ejb.GSSDAO#getGroups(java.lang.Long)
161 @SuppressWarnings("unchecked")
162 public List<Group> getGroups(final Long userId) throws ObjectNotFoundException {
164 throw new ObjectNotFoundException("No user specified");
166 return manager.createQuery("select g from Group g where g.owner.id=:userId").setParameter("userId", userId).getResultList();
172 * @see gr.ebs.gss.server.ejb.GSSDAO#getFiles(java.lang.Long, java.lang.Boolean)
174 @SuppressWarnings("unchecked")
175 public List<FileHeader> getFiles(final Long folderId, Long userId, boolean ignoreDeleted) throws ObjectNotFoundException {
176 if (folderId == null)
177 throw new ObjectNotFoundException("No folder specified");
179 throw new ObjectNotFoundException("No user specified");
180 User user = getEntityById(User.class, userId);
183 query = "select f from FileHeader f where f.folder.id=:folderId and f.deleted=false";
185 query = "select f from FileHeader f where f.folder.id=:folderId";
186 List<FileHeader> tempList = manager.createQuery(query).setParameter("folderId", folderId).getResultList();
187 List<FileHeader> retv = new ArrayList<FileHeader>();
188 for (FileHeader f: tempList)
189 if (f.hasReadPermission(user)) retv.add(f);
197 * @see gr.ebs.gss.server.ejb.GSSDAO#getUsers(java.lang.Long)
199 @SuppressWarnings("unchecked")
200 public List<User> getUsers(final Long groupId) throws ObjectNotFoundException {
202 throw new ObjectNotFoundException("No group specified");
203 return manager.createQuery("select u from User u join u.groupsMember g where g.id=:groupId").
204 setParameter("groupId", groupId).getResultList();
208 public boolean existsFolderOrFile(Long parentId, String name) throws ObjectNotFoundException {
209 if (parentId == null)
210 throw new ObjectNotFoundException("No parent folder specified");
211 if (StringUtils.isEmpty(name))
212 throw new IllegalArgumentException("No folder name specified");
215 manager .createQuery("select f from Folder f " +
216 "where f.parent.id=:parentId and f.name=:name")
217 .setParameter("parentId", parentId)
218 .setParameter("name", name)
221 } catch (NoResultException e) {
223 manager .createQuery("select f from FileHeader f " +
224 "where f.folder.id=:parentId and f.name=:name")
225 .setParameter("parentId", parentId)
226 .setParameter("name", name)
229 } catch (NoResultException e1) {
238 * @see gr.ebs.gss.server.ejb.GSSDAO#existsGroup(java.lang.Long,
241 public boolean existsGroup(final Long userId, final String name) throws ObjectNotFoundException {
243 throw new ObjectNotFoundException("No user specified");
244 if (StringUtils.isEmpty(name))
245 throw new ObjectNotFoundException("No group name specified");
247 manager .createQuery("select g from Group g where g.owner.id=:userId and g.name=:name")
248 .setParameter("userId", userId)
249 .setParameter("name", name)
252 } catch (final NoResultException e) {
258 * @see gr.ebs.gss.server.ejb.GSSDAO#getUserTags(java.lang.Long)
260 public Set<String> getUserTags(final Long userId) throws ObjectNotFoundException {
262 throw new ObjectNotFoundException("No user specified");
263 return new HashSet(manager.createQuery("select t.tag from FileTag t where t.user.id=:userId order by t.tag")
264 .setParameter("userId", userId)
269 * @see gr.ebs.gss.server.ejb.GSSDAO#flush()
271 public void flush() {
276 * @see gr.ebs.gss.server.ejb.GSSDAO#getFile(java.lang.Long, java.lang.String)
278 public FileHeader getFile(Long folderId, String name) throws ObjectNotFoundException {
279 if (folderId == null)
280 throw new ObjectNotFoundException("No parent folder specified");
281 if (StringUtils.isEmpty(name))
282 throw new IllegalArgumentException("No file name specified");
285 return (FileHeader) manager.createQuery("select f from FileHeader f where f.folder.id=:parentId and f.name=:name")
286 .setParameter("parentId", folderId)
287 .setParameter("name", name)
289 } catch (final NoResultException e1) {
290 throw new ObjectNotFoundException("File not found");
295 public Folder getFolder(Long parentId, String name) throws ObjectNotFoundException {
296 if (parentId == null)
297 throw new ObjectNotFoundException("No parent folder specified");
298 if (StringUtils.isEmpty(name))
299 throw new IllegalArgumentException("No folder name specified");
302 return (Folder) manager.createQuery("select f from Folder f where f.parent.id=:parentId and f.name=:name")
303 .setParameter("parentId", parentId)
304 .setParameter("name", name)
306 } catch (NoResultException e) {
307 throw new ObjectNotFoundException("Folder not found");
312 * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedFiles(java.lang.Long)
314 public List<FileHeader> getDeletedFiles(Long userId) throws ObjectNotFoundException {
316 throw new ObjectNotFoundException("No User specified");
317 User user = getEntityById(User.class, userId);
319 List<FileHeader> tempList = manager.createQuery("select f from FileHeader f where f.owner.id=:userId and " +
320 "f.deleted=true and f.folder.deleted=false").
321 setParameter("userId", userId).getResultList();
322 List<FileHeader> retv = new ArrayList<FileHeader>();
323 for (FileHeader f: tempList)
324 if (f.hasReadPermission(user)) retv.add(f);
330 * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedRootFolders(java.lang.Long)
332 public List<Folder> getDeletedRootFolders(Long userId) throws ObjectNotFoundException {
334 throw new ObjectNotFoundException("No User specified");
335 return manager.createQuery("select f from Folder f where f.owner.id=:userId and " +
336 "f.deleted=true and f.parent.deleted=false").
337 setParameter("userId", userId).getResultList();
341 public User findUser(String username) {
342 if (username == null)
344 List<User> results = manager.createQuery("select u from User u where u.username=:username").
345 setParameter("username", username).getResultList();
346 if (results.isEmpty()) return null;
347 return results.get(0);
351 public User findUserByEmail(String email) {
354 List<User> results = manager.createQuery("select u from User u where u.email=:email").
355 setParameter("email", email).getResultList();
356 if (results.isEmpty()) return null;
357 return results.get(0);
361 public List<User> getUsersByUserNameLike(String username) {
362 return manager.createQuery("select u from User u where u.username like :username").
363 setParameter("username", username+"%").getResultList();
367 public List<Folder> getSharedRootFolders(Long userId) {
368 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
369 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
370 "and (p.group.id != null or p.user.id != f.owner.id) ").
371 setParameter("userId", userId).getResultList();
372 List<Folder> result = new ArrayList<Folder>();
373 for(Folder f : folders)
374 if(!folders.contains(f.getParent()))
380 public List<Folder> getFoldersPermittedForGroup(Long userId, Long groupId) {
381 return manager.createQuery("select distinct f from Folder f LEFT JOIN f.permissions p " +
382 "where f.owner.id=:userId and f.deleted = false and p.group.id=:groupId ").
383 setParameter("userId", userId).setParameter("groupId", groupId).getResultList();
387 public List<User> getUsersSharingFoldersForUser(Long userId) {
388 return manager.createQuery("select distinct f.owner from Folder f " +
389 "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
390 "and (p.user.id=:userId or p.group.id in (select distinct gg.id " +
391 "from Group gg join gg.members memb where memb.id=:userId))) ").
392 setParameter("userId", userId).getResultList();
396 public List<User> getUsersSharingFilesForUser(Long userId) {
397 List<User> users = manager.createQuery("select distinct f.owner from FileHeader f " +
398 "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
399 "and (p.user.id=:userId or p.group.id in (select distinct gg.id from Group gg " +
400 "join gg.members memb where memb.id=:userId)))").
401 setParameter("userId", userId).getResultList();
407 public List<FileHeader> getSharedFilesNotInSharedFolders(Long userId) throws ObjectNotFoundException {
409 throw new ObjectNotFoundException("No user specified");
410 User user = getEntityById(User.class, userId);
411 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
412 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
413 "and (f.readForAll=true or p.group.id != null or p.user.id != f.owner.id)" +
414 " and f.folder.id not in (select distinct fo.id from Folder fo LEFT JOIN " +
415 "fo.permissions po where fo.owner.id=:userId and fo.deleted=false and " +
416 "(po.group.id != null or po.user.id != fo.owner.id))").
417 setParameter("userId", userId).getResultList();
418 List<FileHeader> retv = new ArrayList<FileHeader>();
419 for (FileHeader f: tempList)
420 if (f.hasReadPermission(user)) retv.add(f);
426 public List<FileHeader> getSharedFiles(Long userId) throws ObjectNotFoundException {
428 throw new ObjectNotFoundException("No user specified");
429 User user = getEntityById(User.class, userId);
430 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
431 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
432 "and (p.group.id != null or p.user.id != f.owner.id)").
433 setParameter("userId", userId).getResultList();
434 List<FileHeader> retv = new ArrayList<FileHeader>();
435 for (FileHeader f: tempList)
436 if (f.hasReadPermission(user)) retv.add(f);
442 public List<Folder> getSharedFolders(Long userId) {
443 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
444 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
445 "and (p.group.id != null or p.user.id != f.owner.id)").
446 setParameter("userId", userId).getResultList();
451 * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedFiles(java.lang.Long, java.lang.Long)
454 public List<FileHeader> getSharedFiles(Long userId, Long callingUserId) throws ObjectNotFoundException {
456 throw new ObjectNotFoundException("No user specified");
457 User user = getEntityById(User.class, userId);
458 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
459 "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
460 "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
461 "(select distinct gg.id from Group gg join gg.members memb " +
462 "where memb.id=:cuserId)) and f.folder.id not in (select distinct fo.id " +
463 "from Folder fo LEFT JOIN fo.permissions po where fo.owner.id = :userId " +
464 "and fo.deleted=false and po.read=true and (po.user.id=:cuserId " +
465 "or po.group.id in (select distinct ggo.id from Group ggo " +
466 "join ggo.members membo where membo.id=:cuserId)))").
467 setParameter("userId", userId).setParameter("cuserId", callingUserId).getResultList();
468 List<FileHeader> retv = new ArrayList<FileHeader>();
469 for (FileHeader f: tempList)
470 if (f.hasReadPermission(user)) retv.add(f);
476 * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedRootFolders(java.lang.Long, java.lang.Long)
479 public List<Folder> getSharedRootFolders(Long userId, Long callingUserId) {
480 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
481 "LEFT JOIN f.permissions p where f.owner.id = :userId and f.deleted=false " +
482 "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
483 "(select distinct gg.id from Group gg join gg.members memb " +
484 "where memb.id=:cuserId))) ").
485 setParameter("userId", userId).
486 setParameter("cuserId", callingUserId).
488 List<Folder> result = new ArrayList<Folder>();
489 for(Folder f : folders)
490 if(!folders.contains(f.getParent()))
497 * @see gr.ebs.gss.server.ejb.GSSDAO#searchFiles(java.lang.Long, java.lang.String)
500 public List<FileHeader> searchFiles(Long userId, String query) {
501 return manager.createQuery("select f from FileHeader f where f.owner.id=:userId and f.name like :query").
502 setParameter("query", "%"+query+"%").setParameter("userId",userId).getResultList();
506 public Nonce getNonce(String nonce, Long userId) throws ObjectNotFoundException {
507 List<Nonce> results = manager.createQuery("select n from Nonce n where n.userId=:userId and n.encodedNonce=:nonce").
508 setParameter("userId", userId).setParameter("nonce", nonce).getResultList();
509 if (results.isEmpty())
510 throw new ObjectNotFoundException("No nonce found");
511 return results.get(0);
515 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileForIndexing(java.lang.Long)
518 public FileHeader getFileForIndexing(Long id) throws ObjectNotFoundException {
519 FileHeader h = getEntityById(FileHeader.class, id);
520 h.getFileTags().size();
525 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileCount(java.lang.Long)
528 public Long getFileCount(Long userId) {
529 Long singleResult = (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.id=:ownerId")
530 .setParameter("ownerId", userId)
536 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileSize(java.lang.Long)
539 public Long getFileSize(Long userId) {
540 Long singleResult = (Long) manager.createQuery("select sum(f.fileSize) from FileBody f where f.header.owner.id=:ownerId")
541 .setParameter("ownerId", userId)
543 if(singleResult == null)
544 singleResult = new Long(0L);
550 * @see gr.ebs.gss.server.ejb.GSSDAO#getAllFileIds()
553 public List<Long> getAllFileIds() {
554 List<Long> ids = manager.createQuery("select f.id from FileHeader f").getResultList();
559 * @see gr.ebs.gss.server.ejb.GSSDAO#getFileUploadStatus(java.lang.Long, java.lang.String)
562 public FileUploadStatus getFileUploadStatus(Long userId, String fileName) {
563 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();
570 public FileBody getFileVersion(Long fileId, int version) throws ObjectNotFoundException {
572 return (FileBody) manager.createQuery("select f from FileBody f " +
573 "where f.header.id=:fileId and f.version=:version")
574 .setParameter("fileId", fileId).setParameter("version", version)
576 } catch (NoResultException e) {
577 throw new ObjectNotFoundException("No version " + version + " found for file #" + fileId);
582 public void updateAccounting(User user, Date date, long bandwidthDiff) {
583 AccountingInfo ai = null;
585 ai = (AccountingInfo) manager.createQuery("select ai from AccountingInfo ai " +
586 "where ai.user=:user and ai.dateFrom<=:date and ai.dateTo>:date")
587 .setParameter("user", user)
588 .setParameter("date", date)
591 catch (NoResultException e) {
596 // The right entry does not exist; must be created.
597 // This is where we set the initial time period.
598 // We now start from the user's creation, we can change this to something else.
599 Calendar creationDate = new GregorianCalendar();
600 creationDate.setTime(user.getAuditInfo().getCreationDate());
604 long timeInMillis = date.getTime();
606 dateFrom = (Calendar) creationDate.clone();
607 dateFrom.add(BANDWIDTH_TIME_PERIOD_FIELD, offset);
608 dateTo = (Calendar) dateFrom.clone();
609 dateTo.add(BANDWIDTH_TIME_PERIOD_FIELD, 1);
610 offset += BANDWIDTH_TIME_PERIOD_AMOUNT;
612 while (!(dateFrom.getTimeInMillis()<=timeInMillis && dateTo.getTimeInMillis()>timeInMillis));
614 ai = new AccountingInfo(user, dateFrom.getTime(), dateTo.getTime());
619 ai.updateBandwidth(bandwidthDiff);