]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/process/SlcExecutionDaoHibernate.java
Introduce H
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.hibernate / src / main / java / org / argeo / slc / hibernate / process / SlcExecutionDaoHibernate.java
index 303443d02c88746c6eeac591d4d2bb8d5d4a29ad..84c5d215c3d48db932491051e7d1ec11dc36a17d 100644 (file)
@@ -1,20 +1,39 @@
+/*\r
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
 package org.argeo.slc.hibernate.process;\r
 \r
 import java.sql.SQLException;\r
 import java.util.List;\r
 \r
-import org.springframework.orm.hibernate3.HibernateCallback;\r
-import org.springframework.orm.hibernate3.support.HibernateDaoSupport;\r
-\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
 import org.argeo.slc.SlcException;\r
 import org.argeo.slc.dao.process.SlcExecutionDao;\r
 import org.argeo.slc.process.SlcExecution;\r
 import org.argeo.slc.process.SlcExecutionStep;\r
 import org.hibernate.HibernateException;\r
 import org.hibernate.Session;\r
+import org.springframework.orm.hibernate3.HibernateCallback;\r
+import org.springframework.orm.hibernate3.support.HibernateDaoSupport;\r
 \r
 public class SlcExecutionDaoHibernate extends HibernateDaoSupport implements\r
                SlcExecutionDao {\r
+       private final static Log log = LogFactory\r
+                       .getLog(SlcExecutionDaoHibernate.class);\r
 \r
        public void create(SlcExecution slcExecution) {\r
                getHibernateTemplate().save(slcExecution);\r
@@ -45,13 +64,8 @@ public class SlcExecutionDaoHibernate extends HibernateDaoSupport implements
 \r
                        public Object doInHibernate(Session session)\r
                                        throws HibernateException, SQLException {\r
-                               SlcExecution slcExecution = (SlcExecution) session.get(\r
-                                               SlcExecution.class, slcExecutionId);\r
-\r
-                               if (slcExecution == null)\r
-                                       throw new SlcException("Could not find SLC execution "\r
-                                                       + slcExecutionId);\r
-\r
+                               SlcExecution slcExecution = getSlcExecution(session,\r
+                                               slcExecutionId);\r
                                slcExecution.getSteps().addAll(additionalSteps);\r
                                session.update(slcExecution);\r
                                return slcExecution;\r
@@ -60,4 +74,58 @@ public class SlcExecutionDaoHibernate extends HibernateDaoSupport implements
 \r
        }\r
 \r
+       @SuppressWarnings("unchecked")\r
+       public List<SlcExecutionStep> tailSteps(final String slcExecutionId,\r
+                       final Integer nbrOfSteps) {\r
+               return (List<SlcExecutionStep>) getHibernateTemplate().execute(\r
+                               new HibernateCallback() {\r
+\r
+                                       public Object doInHibernate(Session session)\r
+                                                       throws HibernateException, SQLException {\r
+                                               SlcExecution slcExecution = getSlcExecution(session,\r
+                                                               slcExecutionId);\r
+                                               // TODO: do a query count() instead?\r
+                                               int stepCount = slcExecution.getSteps().size();\r
+                                               if (stepCount > nbrOfSteps) {\r
+                                                       return session.createFilter(\r
+                                                                       slcExecution.getSteps(), "")\r
+                                                                       .setFirstResult(stepCount - nbrOfSteps)\r
+                                                                       .setMaxResults(nbrOfSteps).list();\r
+                                               } else {\r
+                                                       return slcExecution.getSteps();\r
+                                               }\r
+                                       }\r
+                               });\r
+       }\r
+\r
+       @SuppressWarnings("unchecked")\r
+       public List<SlcExecutionStep> tailSteps(final String slcExecutionId,\r
+                       final String slcExecutionStepId) {\r
+               Object[] values = { slcExecutionStepId, slcExecutionId };\r
+               List<Integer> indexes = getHibernateTemplate().findByNamedQuery(\r
+                               SlcExecutionStep.class.getName() + ".stepIndex", values);\r
+\r
+               Integer index = indexes.get(0);\r
+               if (log.isTraceEnabled()){\r
+                       log.trace(indexes.size());\r
+                       log.trace("Index " + index + " for step " + slcExecutionStepId\r
+                                       + " in process " + slcExecutionId);\r
+               }\r
+               Object[] values2 = { slcExecutionId, index };\r
+               return getHibernateTemplate().findByNamedQuery(\r
+                               SlcExecutionStep.class.getName() + ".stepsAfter", values2);\r
+       }\r
+\r
+       protected SlcExecution getSlcExecution(Session session,\r
+                       String slcExecutionId) {\r
+               SlcExecution slcExecution = (SlcExecution) session.get(\r
+                               SlcExecution.class, slcExecutionId);\r
+\r
+               if (slcExecution == null)\r
+                       throw new SlcException("Could not find SLC execution "\r
+                                       + slcExecutionId);\r
+\r
+               return slcExecution;\r
+       }\r
+\r
 }\r