/*
- * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd.
+ * Copyright 2007, 2008, 2009, 2010 Electronic Business Systems Ltd.
*
* This file is part of GSS.
*
*/
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;
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;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;
@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)
}
}
- /*
- * (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)
}
}
- /*
- * (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");
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)
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)
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)
}
}
- /*
- * (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");
}
}
- /* (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");
.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");
}
}
- /* (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");
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");
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)
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
"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)
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)
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 " +
}
- /* (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").
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")
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")
}
- /* (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();
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;
+ }
+
+
}