package pt.estgp.estgweb.domain.dao.impl;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoUtils;
import pt.estgp.estgweb.services.common.ISearchResults;
import pt.estgp.estgweb.services.common.SearchTypeEnum;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import static org.
hibernate.
criterion.
Restrictions.
*;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.Criteria;
import jomm.dao.impl.AbstractDao;
import jomm.utils.MyCalendar;
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class AnnouncementDaoImpl
extends AnnouncementDao
{
public static AnnouncementDaoImpl getInstance
()
{
if (myInstance ==
null)
myInstance =
new AnnouncementDaoImpl
();
return (AnnouncementDaoImpl
) myInstance
;
}
public List
<Announcement
> findAnnouncements
(int maxAnnouncements, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
if (roles ==
null)
{
roles =
new ArrayList
<String
>();
roles.
add("all");
}
Criteria criteria = createCriteria
();
Criterion co =
null;
for (1.5.0/docs/api/java/lang/String.html">String role : roles
)
{
Criterion cor = like
("targetRoles",
"%" + role +
"%");
if (co ==
null)
co = cor
;
else
co = or
(co, cor
);
}
Criterion coSubTargets =
null;
if (subTarget ==
null)
{
coSubTargets = isNull
("subTargets");
}
else
{
coSubTargets = eq
("subTargets", subTarget
);
}
if (!internal
)
criteria.
add(eq
("internal",
false));
MyCalendar cNow =
new MyCalendar
();
MyCalendar calendarWithOutTime =
new MyCalendar
(cNow.
getYear(), cNow.
getMonth(), cNow.
getDay());
5+0%2Fdocs%2Fapi+Date">Date now = calendarWithOutTime.
getTime();
criteria.
add(co
)
.
add(or
(or
(lt
("startDate", now
), eq
("startDate", now
)), isNull
("startDate")))
.
add(or
(or
(gt
("expireDate", now
), eq
("expireDate", now
)), isNull
("expireDate")))
.
add(eq
("status",
true))
.
add(coSubTargets
)
.
setMaxResults(maxAnnouncements
)
.
addOrder(Order.
desc("saveDate"));
return criteria.
list();
}
public List
<Announcement
> findAnnouncements
(int maxAnnouncements, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String type,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
return findAnnouncements
(0, maxAnnouncements, roles, type, subTarget, internal
);
}
public List
<Announcement
> findAnnouncements
(int startPage,
int maxAnnouncements, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String type,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
Criteria criteria = createMaxAnnouncementsRolesTypeCriteria
(maxAnnouncements, roles, type, subTarget, internal
);
return criteria.
setFirstResult(maxAnnouncements
* startPage
).
list();
}
public int countAnnouncements
(int maxAnnouncements, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String type,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
Criteria criteria = createMaxAnnouncementsRolesTypeCriteria
(1.5.0/docs/api/java/lang/Integer.html">Integer.
MAX_VALUE, roles, type, subTarget, internal
);
return criteria.
list().
size();
}
private Criteria createMaxAnnouncementsRolesTypeCriteria
(int maxAnnouncements, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String type,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
return createMaxAnnouncementsPageRolesTypeCriteria
(0, maxAnnouncements, roles, type, subTarget, internal
);
}
private Criteria createMaxAnnouncementsPageRolesTypeCriteria
(int page,
int maxAnnouncements, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String type,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
return createRolesTypeCriteria
(roles, type, subTarget, internal
)
.
setFirstResult(page
* maxAnnouncements
)
.
setMaxResults(maxAnnouncements
);
}
private Criteria createRolesTypeCriteria
(List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String type,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
if (roles ==
null)
{
roles =
new ArrayList
<String
>();
}
roles.
add("all");
Criteria criteria = createCriteria
();
Criterion coRole =
null;
for (1.5.0/docs/api/java/lang/String.html">String role : roles
)
{
Criterion cor = like
("targetRoles",
"%" + role +
"%");
if (coRole ==
null)
coRole = cor
;
else
coRole = or
(coRole, cor
);
}
Criterion coSubTargets =
null;
if (subTarget ==
null)
{
coSubTargets = isNull
("subTargets");
}
else
{
coSubTargets = eq
("subTargets", subTarget
);
}
if (type
!=
null)
criteria.
add(eq
("type", type
));
if (!internal
)
criteria.
add(eq
("internal",
false));
MyCalendar cNow =
new MyCalendar
();
MyCalendar calendarWithOutTime =
new MyCalendar
(cNow.
getYear(), cNow.
getMonth(), cNow.
getDay());
5+0%2Fdocs%2Fapi+Date">Date now = calendarWithOutTime.
getTime();
criteria.
add(coRole
)
.
add(or
(or
(lt
("startDate", now
), eq
("startDate", now
)), isNull
("startDate")))
.
add(or
(or
(gt
("expireDate", now
), eq
("expireDate", now
)), isNull
("expireDate")))
.
add(eq
("status",
true))
.
add(coSubTargets
)
.
addOrder(Order.
desc("saveDate"));
return criteria
;
}
/* public static void main(String[] args)
{
AbstractDao.getCurrentSession().beginTransaction();
List<String> roles = new ArrayList<String>();
roles.add("student");
roles.add("teacher");
String typeNews="news";
List<Announcement> as = new AnnouncementDaoImpl().findAnnouncements(5,roles,typeNews);
for(Announcement a : as)
{
GenericUser us = a.getOwner();
List<String> userRoles=us.getOwnerRoles();
for(String role:userRoles){
System.out.println("--->"+role);
}
System.out.println(a.getSaveDate() + ":" + a.getTitle() + " " + a.getOwner().getName() );
}
AbstractDao.getCurrentSession().beginTransaction().commit();
}*/
public List
<Announcement
> searchAnnouncements
(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchTypeEnum,
int maxAnnouncements,
int page, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
Criterion c = createSearchQuery
(query, searchTypeEnum
);
Criteria criteria = createMaxAnnouncementsPageRolesTypeCriteria
(page, maxAnnouncements, roles,
null,
null, internal
);
criteria.
add(c
);
return criteria.
list();
}
public int countAnnouncements
(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchTypeEnum, List
<String
> roles,
1.5.0/docs/api/java/lang/String.html">String subTarget,
boolean internal
)
{
Criterion c = createSearchQuery
(query, searchTypeEnum
);
Criteria criteria = createRolesTypeCriteria
(roles,
null,
null, internal
);
criteria.
add(c
);
return criteria.
list().
size();
}
public Criterion createSearchQuery
(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchTypeEnum
)
{
return DaoUtils.
createSearchQuery(query,searchTypeEnum,
"text",
"title");
}
public List
<AnnouncementImpl
> loadOwnedAnnouncements
(long ownerId
)
{
return createCriteria
().
add(eq
("owner.id", ownerId
)).
addOrder(Order.
desc("updateDate")).
list();
}
public List
<Announcement
> loadInvalidAnnouncements
()
{
return createCriteria
()
.
add(eq
("status",
false))
.
add(isNull
("subTargets"))
.
addOrder(Order.
asc("id")).
list();
}
}