package pt.estgp.estgweb.domain.dao.impl;
import jomm.dao.DaoException;
import jomm.utils.DesUtils;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.Teacher;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.dao.DaoUtils;
import pt.estgp.estgweb.services.common.SearchTypeEnum;
import pt.estgp.estgweb.utils.RoleManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import static org.
hibernate.
criterion.
Restrictions.
*;
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class UserDaoImpl
extends UserDao
{
private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger =
1.5.0/docs/api/java/util/logging/Logger.html">Logger.
getLogger(UserDaoImpl.
class);
public static UserDaoImpl getInstance
()
{
if (myInstance ==
null)
myInstance =
new UserDaoImpl
();
return (UserDaoImpl
) myInstance
;
}
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @param username to load
* @return a user
*/
public final User loadByUsername
(1.5.0/docs/api/java/lang/String.html">String username
)
{
try
{
5+0%2Fdocs%2Fapi+List">List list =
createCriteria
()
.
add(eq
("username", username
))
.
setMaxResults(1
)
.
list();
if (list.
size() == 0
)
return null;
return (User
) list.
get(0
);
}
catch (HibernateException e
)
{
throw new DaoException
(e
);
}
}
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @param email to load
* @return a user
*/
public final User loadByEmail
(1.5.0/docs/api/java/lang/String.html">String email
)
{
try
{
return (User
) createCriteria
()
.
add(eq
("email", email
))
.
uniqueResult();
}
catch (HibernateException e
)
{
throw new DaoException
(e
);
}
}
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @param ID to load
* @return a user
*/
public final User loadByID
(1.5.0/docs/api/java/lang/String.html">String ID
)
{
try
{
return (User
) createCriteria
()
.
add(eq
("id",
1.5.0/docs/api/java/lang/Long.html">Long.
parseLong(ID
)))
.
uniqueResult();
}
catch (HibernateException e
)
{
throw new DaoException
(e
);
}
}
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @param username to load
* @param password to load
* @return a user
*/
public final User loadByUsernameAndPassword
(1.5.0/docs/api/java/lang/String.html">String username,
1.5.0/docs/api/java/lang/String.html">String password
)
{
try
{
return (User
) createCriteria
()
.
add(eq
("username", username
))
.
add(or
(
eq
("password", jomm.
utils.
BytesUtils.
getDigestMD5Hex(password
)),
eq
("pop3password",DesUtils.
getInstance().
encrypt(password
))
)
)
.
uniqueResult();
}
catch (HibernateException e
)
{
throw new DaoException
(e
);
}
}
public final User loadByUsernameAndChaveAppsMoveis
(1.5.0/docs/api/java/lang/String.html">String username,
1.5.0/docs/api/java/lang/String.html">String chaveAppsMoveis
)
{
try
{
List
<User
> users = createCriteria
()
.
add(eq
("username", username
))
.
add(eq
("chaveAppsMoveis", chaveAppsMoveis
))
.
list();
if(users.
size() == 1
)
{
return users.
get(0
);
}
else if(users.
size() > 1)
{
logger.
fatal("Atencao existe mais de um user com username: " + username
);
}
return null;
}
catch (HibernateException e
)
{
throw new DaoException
(e
);
}
}
public List
<User
> loadRoleUsers
(1.5.0/docs/api/java/lang/String.html">String role,
int maxResults,
int firstResult
)
{
Criteria c = createCriteria
()
.
add(like
("roles",
"%" + role + RoleManager.
ROLE_SEPARATOR +
"%"))
.
addOrder(Order.
asc("name"))
.
setMaxResults(maxResults
)
.
setFirstResult(firstResult
);
return c.
list();
}
public List
<User
> loadRoleUsers
(1.5.0/docs/api/java/lang/String.html">String role
)
{
if(role ==
null || role.
trim().
length() == 0
)
return new ArrayList
<User
>();
List
<User
> users = createCriteria
().
add(like
("roles",
"%" + role +
"%")).
addOrder(Order.
asc("name")).
list();
Iterator
<User
> iter = users.
iterator();
while(iter.
hasNext())
{
User u = iter.
next();
if(!u.
hasRole(role
))
iter.
remove();
}
return users
;
}
public List
<Teacher
> loadRoleTeachers
(1.5.0/docs/api/java/lang/String.html">String role
)
{
if(role ==
null || role.
trim().
length() == 0
)
return new ArrayList
<Teacher
>();
List
<Teacher
> users = createCriteria
(Teacher.
class).
add(like
("roles",
"%" + role +
",%")).
addOrder(Order.
asc("name")).
list();
return users
;
}
public List
<User
> loadRoleAreaUsers
(1.5.0/docs/api/java/lang/String.html">String role,
1.5.0/docs/api/java/lang/String.html">String area
)
{
Criteria c = createCriteria
().
add(like
("roles",
"%" + role +
"%")).
addOrder(Order.
asc("name"));
if(area
!=
null && area.
trim().
length() > 0)
c.
add(eq
("mainArea",area
));
List
<User
> users = c.
list();
Iterator
<User
> iter = users.
iterator();
while(iter.
hasNext())
{
User u = iter.
next();
if(!u.
hasRole(role
))
iter.
remove();
}
return users
;
}
public List
<User
> findUsers
(1.5.0/docs/api/java/lang/String.html">String textToSearch
)
{
return findUsers
(textToSearch,
null);
}
public List
<User
> findUsersFromClassUserAndTeacherOnly
()
{
return createCriteria
().
add(or
(eq
("class",
"UserImpl"),eq
("class",
"TeacherImpl"))).
list();
}
public List
<User
> findUsers
(1.5.0/docs/api/java/lang/String.html">String textToSearch,
1.5.0/docs/api/java/lang/String.html">String typeToSearch
)
{
Criteria criteria
;
if (typeToSearch
!=
null && typeToSearch.
trim().
length() != 0
)
try
{
criteria = createCriteria
(1.5.0/docs/api/java/lang/Class.html">Class.
forName(typeToSearch
));
}
catch (1.5.0/docs/api/java/lang/ClassNotFoundException.html">ClassNotFoundException e
)
{
logger.
error(e, e
);
return null;
}
else
criteria = createCriteria
();
Criterion textSearch = DaoUtils.
createSearchQuery(textToSearch, SearchTypeEnum.
AllWords,
"name",
"username");
Criterion text2Search = DaoUtils.
createSearchQuery(textToSearch, SearchTypeEnum.
AllWords,
"email");
Criterion fields = or
(textSearch, text2Search
);
try{
1.5.0/docs/api/java/lang/Integer.html">Integer siges =
1.5.0/docs/api/java/lang/Integer.html">Integer.
parseInt(textToSearch
);
fields = or
(fields,eq
("sigesCode",siges
));
}catch(1.5.0/docs/api/java/lang/Exception.html">Exception e
){}
return criteria.
add(fields
)
.
addOrder(Order.
desc("name"))
.
list();
}
public 1.5.0/docs/api/java/io/Serializable.html">Serializable save
(User obj
)
{
try
{
obj.
setSaveDate(new 5+0%2Fdocs%2Fapi+Date">Date());
return super.
save(obj
);
}
catch (HibernateException e
)
{
throw new DaoException
(e
);
}
}
public int countUsers
(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchType
)
{
Criterion c = DaoUtils.
createSearchQuery(query, searchType,
"name",
"username");
return createCriteria
()
.
add(c
)
.
list().
size();
}
public List
<User
> search
(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchTypeEnum,
int maxResults,
int page
)
{
Criterion c = DaoUtils.
createSearchQuery(query, searchTypeEnum,
"name",
"username");
Criteria criteria = createCriteria
();
criteria.
add(c
)
.
addOrder(Order.
asc("name"))
.
setMaxResults(maxResults
)
.
setFirstResult(page
* maxResults
);
return criteria.
list();
}
public List
<User
> findByEmail
(1.5.0/docs/api/java/lang/String.html">String email
)
{
return createCriteria
().
add(or
(or
(or
(eq
("email",email
),eq
("outEmail",email
)),eq
("gmail",email
)),eq
("msn",email
))).
list();
}
public User loadByUsernameOrSigesCode
(int sigesCode
)
{
return (User
) createCriteria
().
add(or
(eq
("sigesCode",sigesCode
),eq
("username",
"a" + sigesCode
))).
uniqueResult();
}
public User loadBySigesCode
(int sigesCode
)
{
return (User
) createCriteria
().
add(eq
("sigesCode", sigesCode
)).
uniqueResult();
}
public List
<User
> loadBySigesCodeUsernameEmailsBiSiges
(1.5.0/docs/api/java/lang/String.html">String identifier
)
{
1.5.0/docs/api/java/lang/Integer.html">Integer sigesCode =
null;
try{ sigesCode =
1.5.0/docs/api/java/lang/Integer.html">Integer.
parseInt(identifier
); }catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e
){}
1.5.0/docs/api/javax/management/Query.html">Query q = getCurrentSession
().
createQuery(
"select u from u in class " + User.
class.
getName() +
" " +
"where " +
"u.username = :identifier or " +
"u.bi = :identifier or " +
"u.email = :identifier or " +
"u.outEmail = :identifier or " +
"u.preferrefEmail = :identifier " +
(sigesCode
!=
null ? " or u.sigesCode = :sigesCode ":
"")
);
q.
setString("identifier",identifier
);
if(sigesCode
!=
null)
q.
setInteger("sigesCode", sigesCode
);
return q.
list();
}
public List
<User
> loadByCertificate
(1.5.0/docs/api/java/lang/String.html">String certificate
)
{
return createCriteria
()
.
add(eq
("authenticationCertificate", certificate
))
.
add(gt
("authenticationCertificateExpire",
new 5+0%2Fdocs%2Fapi+Date">Date()))
.
list();
}
// Duarte Santos
public List
<User
> loadRolesUsers
(List
<String
> roles
)
{
if(roles ==
null || roles.
size() == 0
)
return new ArrayList
<User
>();
Criteria criteria = createCriteria
();
Criterion co =
null;
for (1.5.0/docs/api/java/lang/String.html">String role : roles
)
{
if(role.
trim().
length() == 0
)
continue;
Criterion cor = like
("roles",
"%" + role +
"%");
if (co ==
null)
co = cor
;
else
co = or
(co, cor
);
}
criteria.
add(co
);
List
<User
> users = criteria.
list();
Iterator
<User
> iter = users.
iterator();
while(iter.
hasNext())
{
boolean hasIt =
false;
User u = iter.
next();
for(1.5.0/docs/api/java/lang/String.html">String role: roles
)
{
if(u.
hasRole(role
))
{
hasIt =
true;
break;
}
}
if(!hasIt
)
iter.
remove();
}
return users
;
}
}