]> 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
Update headers
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.hibernate / src / main / java / org / argeo / slc / hibernate / process / SlcExecutionDaoHibernate.java
index 5cfde101eff9de9f78a46c5e55cf93c77439b1bd..f581f9261de1203f9381f339ee60963836c4a5ad 100644 (file)
@@ -1,20 +1,38 @@
+/*\r
+ * Copyright (C) 2007-2012 Mathieu Baudier\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
 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
@@ -33,6 +51,7 @@ public class SlcExecutionDaoHibernate extends HibernateDaoSupport implements
                                uuid);\r
        }\r
 \r
+       @SuppressWarnings("unchecked")\r
        public List<SlcExecution> listSlcExecutions() {\r
                return (List<SlcExecution>) getHibernateTemplate().loadAll(\r
                                SlcExecution.class);\r
@@ -44,13 +63,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
@@ -59,4 +73,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