--- /dev/null
+/*****************************************************************************
+ * Copyright Igor Barma, Eric Brun, Alexandre Desoubeaux, Christian Martel,
+ * (2 décembre 2008)
+ *
+ * Ce logiciel est un programme informatique servant à l'évaluation des
+ * compétences.
+ *
+ * Ce logiciel est régi par la licence CeCILL soumise au droit français et
+ * respectant les principes de diffusion des logiciels libres. Vous pouvez
+ * utiliser, modifier et/ou redistribuer ce programme sous les conditions
+ * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
+ * sur le site "http://www.cecill.info".
+ *
+ * En contrepartie de l'accessibilité au code source et des droits de copie,
+ * de modification et de redistribution accordés par cette licence, il n'est
+ * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
+ * seule une responsabilité restreinte pèse sur l'auteur du programme, le
+ * titulaire des droits patrimoniaux et les concédants successifs.
+ *
+ * A cet égard l'attention de l'utilisateur est attirée sur les risques
+ * associés au chargement, à l'utilisation, à la modification et/ou au
+ * développement et à la reproduction du logiciel par l'utilisateur étant
+ * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
+ * manipuler et qui le réserve donc à des développeurs et des professionnels
+ * avertis possédant des connaissances informatiques approfondies. Les
+ * utilisateurs sont donc invités à charger et tester l'adéquation du
+ * logiciel à leurs besoins dans des conditions permettant d'assurer la
+ * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
+ * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
+ *
+ * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
+ * pris connaissance de la licence CeCILL, et que vous en avez accepté les
+ * termes.
+ *******************************************************************************/
+package com.pentila.evalcomp.dao.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.pentila.evalcomp.dao.IScenarioInstanceDAO;
+import com.pentila.evalcomp.domain.Event;
+import com.pentila.evalcomp.domain.definition.EvaluationDefinition;
+import com.pentila.evalcomp.domain.definition.EventActivity;
+import com.pentila.evalcomp.domain.instance.ScenarioInstance;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class ScenarioInstanceDAOImpl.
+ */
+public class ScenarioInstanceDAOImpl extends
+GenericDAOImpl<ScenarioInstance, Long> implements IScenarioInstanceDAO {
+
+ /** The HQL get Filtered SI for a user. */
+ static String HQLfilteredSI = "select SI "
+ + "from ScenarioInstance as SI "
+ + "inner join SI.evaluationInstance as EI "
+ + "inner join EI.evaluationDefinition as ED "
+ + "where SI.id in (:ssi) "
+ + "and ED.state=:state "
+ + "and :date between ED.dateStart and addDate(ED.dateEnd, SI.delay)";
+
+ /** The HQL get Filtered Activity for a user. */
+ static String HQLfilteredActivity = "select act.activityId "
+ + "from EventActivity as act "
+ + "inner join act.evaluationSubject as ES, "
+ + "ScenarioInstance as SI "
+ + "inner join SI.evaluationSubjectInstance as ESI "
+ + "inner join ESI.evaluationSubject as ES2 "
+ + "where ES.Id = ES2.Id "
+ + "and SI = :si "
+ + "and :date > addDate(act.endDate, SI.delay)";
+
+ /**
+ * The HQL get alerts. sid : Array of Long id of ScenarioInstance or the
+ * user state : State of ED date : Date of now
+ */
+ static String HQLgetAlerts = "select "
+ + "SI, EA "
+ + "from "
+ + "ScenarioInstance as SI "
+ + "inner join "
+ + "SI.evaluationInstance as EI "
+ + "inner join "
+ + "EI.evaluationDefinition as ED, "
+ + "EventActivity as EA inner join "
+ + "EA.evaluationSubject as ES inner join "
+ + "ES.evaluationDefinition as ED2, "
+ + "EvaluationSubjectInstance as ESI inner join "
+ + "ESI.evaluationSubject as ES2 "
+ + "where "
+ + "SI.id in (:sid) "
+ + "and SI.id||EA.activityId in (:acts) "
+ + "and ED.state=:state "
+ + "and (:date between ED.dateStart and addDate(ED.dateEnd, SI.delay)) "
+ + "and ED2.id=ED.id "
+ + "and ES.id = ES2.id "
+ + "and ESI.id= SI.evaluationSubjectInstance "
+ + "and EA.activityId not in ( "
+ + "select AC.activityId "
+ + "from Acquitment as AC "
+ + "where AC.scenarioInstance = SI.id) "
+ + "and :date between EA.startDate and addDate(EA.endDate, SI.delay)";
+
+
+ /** The HQ lget all alerts. */
+ static String HQLgetAllAlerts = "select "
+ + "SI, EA "
+ + "from "
+ + "ScenarioInstance as SI "
+ + "inner join "
+ + "SI.evaluationInstance as EI "
+ + "inner join "
+ + "EI.evaluationDefinition as ED, "
+ + "EventActivity as EA inner join "
+ + "EA.evaluationSubject as ES inner join "
+ + "ES.evaluationDefinition as ED2, "
+ + "EvaluationSubjectInstance as ESI inner join "
+ + "ESI.evaluationSubject as ES2 "
+ + "where "
+ + "ED.state=:state "
+ + "and (:date between ED.dateStart and addDate(ED.dateEnd, SI.delay)) "
+ + "and ED2.id=ED.id "
+ + "and ES.id = ES2.id "
+ + "and ESI.id= SI.evaluationSubjectInstance "
+ + "and EA.activityId not in ( "
+ + "select AC.activityId "
+ + "from Acquitment as AC "
+ + "where AC.scenarioInstance = SI.id) "
+ + "and :date between EA.startDate and addDate(EA.endDate, SI.delay) ";
+
+
+ /** The HQL get user ScenarioInstance. */
+ static String HQLgetUserSI = "select SI "
+ + "from ScenarioInstance as SI inner join SI.localroles as lr "
+ + "where lr like :role||'!_'||:login escape '!' ";
+
+
+ /** The errors. */
+ static String errors = "select sia1 from ScenarioInstance as sia1,ScenarioInstance as sia2 where sia1.id < sia2.id and sia1.id != sia2.id and sia1.processInstanceId=sia2.processInstanceId";
+
+ /** The HQ lget scenario instance. */
+ static String HQLgetScenarioInstance = "select si from ScenarioInstance as si where si.processInstanceId=:puuid";
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.dao.IScenarioInstanceDAO#filteredTodos(java.util
+ * .Set)
+ */
+ public Set<ScenarioInstance> filteredTodos(Set<Long> foundedWFTodo) {
+
+ Set<ScenarioInstance> SSI = new HashSet<ScenarioInstance>();
+ List<ScenarioInstance> lsi = null;
+ if (foundedWFTodo != null && !foundedWFTodo.isEmpty()) {
+
+ List<Long> ll = new ArrayList<Long>(foundedWFTodo);
+
+ Collections.sort(ll);
+
+ lsi = getCachableHibernateTemplate().findByNamedParam(
+ HQLfilteredSI,
+ new String[] { "ssi", "state", "date" },
+ new Object[] { ll.toArray(),
+ EvaluationDefinition.RUNNING, new Date() });
+
+ if (lsi != null) {
+ SSI = new HashSet<ScenarioInstance>(lsi);
+ }
+ }
+ return SSI;
+ }
+
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.dao.IScenarioInstanceDAO#filteredActivity(com.pentila.evalcomp.domain.instance.ScenarioInstance)
+ */
+ public List<String> filteredActivity(ScenarioInstance si) {
+
+ List<String> activities = null;
+ Date date = new Date();
+
+ activities = getCachableHibernateTemplate().findByNamedParam(
+ HQLfilteredActivity,
+ new String[] { "si", "date" },
+ new Object[] { si, date });
+
+ return activities;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.dao.IScenarioInstanceDAO#getAlerts(java.lang.String,
+ * int)
+ */
+ public List<Event> getAlerts(Set<Long> sid, Set<String> activities, int size) {
+ List<Event> le = new ArrayList<Event>();
+
+ /* Set<ScenarioInstance> ssi = getUserScenarioInstances(login, null); */
+ if (sid != null && !sid.isEmpty()) {
+ /*
+ * Set<Long> sid = new HashSet<Long>(); for (ScenarioInstance si :
+ * ssi) { sid.add(si.getId()); }
+ */
+ int state = EvaluationDefinition.RUNNING;
+ Date date = new Date();
+
+ List<Long> ll = new ArrayList<Long>(sid);
+ Collections.sort(ll);
+
+ List<String> ll2 = new ArrayList<String>(activities);
+ Collections.sort(ll2);
+
+
+
+ List<Object[]> lo = getCachableHibernateTemplate().findByNamedParam(
+ HQLgetAlerts, new String[] { "sid", "acts", "state", "date" },
+ new Object[] { ll.toArray(), ll2.toArray(), state, date });
+ if (lo != null) {
+ for (Object[] ao : lo) {
+ ScenarioInstance SI = (ScenarioInstance) ao[0];
+ EventActivity EA = (EventActivity) ao[1];
+
+ Event e = new Event();
+ e.setDescription(EA.getActivityId());
+ e.setEndDate(EA.getEndDate());
+ e.setStartDate(EA.getStartDate());
+ e.setCreationDate(date);
+ e.setScenarioInstanceAbstract(SI);
+ e.setType(Event.TYPE_ALERT);
+
+ le.add(e);
+ }
+ }
+ }
+
+ return le;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.dao.IScenarioInstanceDAO#getUserScenarioInstances
+ * (java.lang.String, java.lang.String)
+ */
+ public Set<ScenarioInstance> getUserScenarioInstances(String login,
+ String role) {
+
+ Set<ScenarioInstance> ssi = new HashSet<ScenarioInstance>();
+
+ String r = "%";
+ if (role != null) {
+ r = role;
+ }
+
+ List<ScenarioInstance> lsi = getCachableHibernateTemplate().findByNamedParam(
+ HQLgetUserSI, new String[] { "role", "login" },
+ new Object[] { r, login });
+
+ if (lsi != null) {
+ ssi.addAll(lsi);
+ }
+
+ return ssi;
+
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.dao.IScenarioInstanceDAO#getAlerts()
+ */
+ public List<Event> getAlerts() {
+ List<Event> le = new ArrayList<Event>();
+
+ /* Set<ScenarioInstance> ssi = getUserScenarioInstances(login, null); */
+
+ /*
+ * Set<Long> sid = new HashSet<Long>(); for (ScenarioInstance si :
+ * ssi) { sid.add(si.getId()); }
+ */
+ int state = EvaluationDefinition.RUNNING;
+ Date date = new Date();
+
+ List<Object[]> lo = getCachableHibernateTemplate().findByNamedParam(
+ HQLgetAllAlerts, new String[] { "state", "date" },
+ new Object[] { state, date });
+ if (lo != null) {
+ for (Object[] ao : lo) {
+ ScenarioInstance SI = (ScenarioInstance) ao[0];
+ EventActivity EA = (EventActivity) ao[1];
+
+ Event e = new Event();
+ e.setDescription(EA.getActivityId());
+ e.setEndDate(EA.getEndDate());
+ e.setStartDate(EA.getStartDate());
+ e.setCreationDate(date);
+ e.setScenarioInstanceAbstract(SI);
+ e.setType(Event.TYPE_ALERT);
+
+ le.add(e);
+ }
+ }
+
+ return le;
+ }
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.dao.IScenarioInstanceDAO#getErrors()
+ */
+ public List<ScenarioInstance> getErrors(){
+
+ return getCachableHibernateTemplate().find(errors);
+
+
+ }
+
+
+ /* (non-Javadoc)
+ * @see com.pentila.evalcomp.dao.IScenarioInstanceDAO#getScenarioInstance(java.lang.String)
+ */
+ public ScenarioInstance getScenarioInstance(String processInstanceId) {
+
+ List<ScenarioInstance> lsi = getCachableHibernateTemplate().findByNamedParam(
+ HQLgetScenarioInstance, new String[] { "puuid"},
+ new Object[] {processInstanceId});
+
+ if (lsi != null && !lsi.isEmpty()){
+ return lsi.get(0);
+ }
+
+ return null;
+ }
+
+}