KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > opencms > db > generic > CmsWorkflowDriver


1 /*
2  * File : $Source: /usr/local/cvs/opencms/src/org/opencms/db/generic/CmsWorkflowDriver.java,v $
3  * Date : $Date: 2006/03/27 14:52:54 $
4  * Version: $Revision: 1.56 $
5  *
6  * This library is part of OpenCms -
7  * the Open Source Content Mananagement System
8  *
9  * Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * For further information about Alkacon Software GmbH, please see the
22  * company website: http://www.alkacon.com
23  *
24  * For further information about OpenCms, please see the
25  * project website: http://www.opencms.org
26  *
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  */

31
32 package org.opencms.db.generic;
33
34 import org.opencms.configuration.CmsConfigurationManager;
35 import org.opencms.db.CmsDbContext;
36 import org.opencms.db.CmsDbEntryNotFoundException;
37 import org.opencms.db.CmsDbSqlException;
38 import org.opencms.db.CmsDbUtil;
39 import org.opencms.db.CmsDriverManager;
40 import org.opencms.db.I_CmsDriver;
41 import org.opencms.db.I_CmsWorkflowDriver;
42 import org.opencms.file.CmsDataAccessException;
43 import org.opencms.file.CmsGroup;
44 import org.opencms.file.CmsProject;
45 import org.opencms.file.CmsUser;
46 import org.opencms.main.CmsLog;
47 import org.opencms.main.OpenCms;
48 import org.opencms.util.CmsUUID;
49 import org.opencms.workflow.CmsTask;
50 import org.opencms.workflow.CmsTaskLog;
51 import org.opencms.workflow.CmsTaskService;
52
53 import java.sql.Connection JavaDoc;
54 import java.sql.PreparedStatement JavaDoc;
55 import java.sql.ResultSet JavaDoc;
56 import java.sql.SQLException JavaDoc;
57 import java.sql.Statement JavaDoc;
58 import java.util.ArrayList JavaDoc;
59 import java.util.List JavaDoc;
60 import java.util.Map JavaDoc;
61
62 import org.apache.commons.logging.Log;
63
64 /**
65  * Generic (ANSI-SQL) database server implementation of the workflow driver methods.<p>
66  *
67  * @author Thomas Weckert
68  * @author Michael Emmerich
69  *
70  * @version $Revision: 1.56 $
71  *
72  * @since 6.0.0
73  */

74 public class CmsWorkflowDriver implements I_CmsDriver, I_CmsWorkflowDriver {
75
76     /** Table key for tasks. */
77     protected static final String JavaDoc TABLE_TASK = "CMS_TASKS";
78
79     /** Table key for task logs. */
80     protected static final String JavaDoc TABLE_TASKLOG = "CMS_TASKLOG";
81
82     /** Table key for task par(ameter). */
83     protected static final String JavaDoc TABLE_TASKPAR = "CMS_TASKPAR";
84
85     /** Table key for task type. */
86     protected static final String JavaDoc TABLE_TASKTYPE = "CMS_TASKTYPE";
87
88     /** The log object for this class. */
89     private static final Log LOG = CmsLog.getLog(org.opencms.db.generic.CmsWorkflowDriver.class);
90
91     /** The driver manager. */
92     protected CmsDriverManager m_driverManager;
93
94     /** The SQL manager. */
95     protected org.opencms.db.generic.CmsSqlManager m_sqlManager;
96
97     /**
98      * @see org.opencms.db.I_CmsWorkflowDriver#createTask(org.opencms.db.CmsDbContext, int, int, int, org.opencms.util.CmsUUID, org.opencms.util.CmsUUID, org.opencms.util.CmsUUID, java.lang.String, java.sql.Timestamp, java.sql.Timestamp, int)
99      */

100     public CmsTask createTask(
101         CmsDbContext dbc,
102         int rootId,
103         int parentId,
104         int tasktype,
105         CmsUUID ownerId,
106         CmsUUID agentId,
107         CmsUUID roleId,
108         String JavaDoc taskname,
109         java.sql.Timestamp JavaDoc wakeuptime,
110         java.sql.Timestamp JavaDoc timeout,
111         int priority) throws CmsDataAccessException {
112
113         // fetch new task id
114
int newId = m_sqlManager.nextId(TABLE_TASK);
115         // create the task id entry in the DB
116
PreparedStatement JavaDoc stmt = null;
117         Connection JavaDoc conn = null;
118         try {
119             conn = m_sqlManager.getConnection(dbc);
120             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_CREATE");
121             stmt.setInt(1, newId);
122             stmt.executeUpdate();
123
124         } catch (SQLException JavaDoc e) {
125             throw new CmsDbSqlException(Messages.get().container(
126                 Messages.ERR_GENERIC_SQL_1,
127                 CmsDbSqlException.getErrorQuery(stmt)), e);
128         } finally {
129             m_sqlManager.closeAll(dbc, conn, stmt, null);
130         }
131         // create the task object, note that this does not user the "task type" table
132
// because the generic SQL does not work with MySQL 4
133
CmsTask task = new CmsTask(
134             newId,
135             taskname,
136             CmsTaskService.TASK_STATE_STARTED,
137             tasktype,
138             rootId,
139             parentId,
140             ownerId,
141             roleId,
142             agentId,
143             agentId,
144             new java.sql.Timestamp JavaDoc(System.currentTimeMillis()),
145             wakeuptime,
146             timeout,
147             null,
148             0,
149             "30308",
150             priority,
151             0,
152             "../taskforms/adhoc.asp",
153             0,
154             1);
155         // write task
156
task = writeTask(dbc, task);
157         return task;
158     }
159
160     /**
161      * @see org.opencms.db.I_CmsWorkflowDriver#destroy()
162      */

163     public void destroy() throws Throwable JavaDoc {
164
165         finalize();
166         if (CmsLog.INIT.isInfoEnabled()) {
167             CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_SHUTDOWN_DRIVER_1, getClass().getName()));
168         }
169     }
170
171     /**
172      * @see org.opencms.db.I_CmsWorkflowDriver#endTask(org.opencms.db.CmsDbContext, int)
173      */

174     public void endTask(CmsDbContext dbc, int taskId) throws CmsDataAccessException {
175
176         Connection JavaDoc conn = null;
177         PreparedStatement JavaDoc stmt = null;
178         try {
179             conn = m_sqlManager.getConnection(dbc);
180             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_END");
181             stmt.setInt(1, 100);
182             stmt.setTimestamp(2, new java.sql.Timestamp JavaDoc(System.currentTimeMillis()));
183             stmt.setInt(3, taskId);
184             stmt.executeUpdate();
185
186         } catch (SQLException JavaDoc e) {
187             throw new CmsDbSqlException(Messages.get().container(
188                 Messages.ERR_GENERIC_SQL_1,
189                 CmsDbSqlException.getErrorQuery(stmt)), e);
190         } finally {
191             m_sqlManager.closeAll(dbc, conn, stmt, null);
192         }
193     }
194
195     /**
196      * @see org.opencms.db.I_CmsWorkflowDriver#forwardTask(org.opencms.db.CmsDbContext, int, org.opencms.util.CmsUUID, org.opencms.util.CmsUUID)
197      */

198     public void forwardTask(CmsDbContext dbc, int taskId, CmsUUID newRoleId, CmsUUID newUserId)
199     throws CmsDataAccessException {
200
201         Connection JavaDoc conn = null;
202         PreparedStatement JavaDoc stmt = null;
203         try {
204             conn = m_sqlManager.getConnection(dbc);
205             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_FORWARD");
206             stmt.setString(1, newRoleId.toString());
207             stmt.setString(2, newUserId.toString());
208             stmt.setInt(3, taskId);
209             stmt.executeUpdate();
210         } catch (SQLException JavaDoc e) {
211             throw new CmsDbSqlException(Messages.get().container(
212                 Messages.ERR_GENERIC_SQL_1,
213                 CmsDbSqlException.getErrorQuery(stmt)), e);
214         } finally {
215             m_sqlManager.closeAll(dbc, conn, stmt, null);
216         }
217     }
218
219     /**
220      * @see org.opencms.db.I_CmsWorkflowDriver#getSqlManager()
221      */

222     public CmsSqlManager getSqlManager() {
223
224         return m_sqlManager;
225     }
226
227     /**
228      * @see org.opencms.db.I_CmsDriver#init(org.opencms.db.CmsDbContext, org.opencms.configuration.CmsConfigurationManager, java.util.List, org.opencms.db.CmsDriverManager)
229      */

230     public void init(
231         CmsDbContext dbc,
232         CmsConfigurationManager configurationManager,
233         List JavaDoc successiveDrivers,
234         CmsDriverManager driverManager) {
235
236         Map JavaDoc configuration = configurationManager.getConfiguration();
237         String JavaDoc poolUrl = (String JavaDoc)configuration.get("db.workflow.pool");
238         String JavaDoc classname = (String JavaDoc)configuration.get("db.workflow.sqlmanager");
239         m_sqlManager = this.initSqlManager(classname);
240         m_sqlManager.init(I_CmsWorkflowDriver.DRIVER_TYPE_ID, poolUrl);
241
242         m_driverManager = driverManager;
243
244         if (CmsLog.INIT.isInfoEnabled()) {
245             CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_ASSIGNED_POOL_1, poolUrl));
246         }
247
248         if (successiveDrivers != null && !successiveDrivers.isEmpty()) {
249             if (LOG.isWarnEnabled()) {
250                 LOG.warn(Messages.get().getBundle().key(
251                     Messages.LOG_SUCCESSIVE_DRIVERS_UNSUPPORTED_1,
252                     getClass().getName()));
253             }
254         }
255     }
256
257     /**
258      * @see org.opencms.db.I_CmsWorkflowDriver#initSqlManager(String)
259      */

260     public org.opencms.db.generic.CmsSqlManager initSqlManager(String JavaDoc classname) {
261
262         return CmsSqlManager.getInstance(classname);
263     }
264
265     /**
266      * @see org.opencms.db.I_CmsWorkflowDriver#readAgent(org.opencms.db.CmsDbContext, org.opencms.util.CmsUUID)
267      */

268     public CmsUUID readAgent(CmsDbContext dbc, CmsUUID roleId) throws CmsDataAccessException {
269
270         CmsUUID result = CmsUUID.getNullUUID();
271         Connection JavaDoc conn = null;
272         PreparedStatement JavaDoc stmt = null;
273         ResultSet JavaDoc res = null;
274
275         try {
276             conn = m_sqlManager.getConnection(dbc);
277             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_FIND_AGENT");
278             stmt.setString(1, roleId.toString());
279             res = stmt.executeQuery();
280
281             if (res.next()) {
282                 result = new CmsUUID(res.getString(1));
283             }
284         } catch (SQLException JavaDoc e) {
285             throw new CmsDbSqlException(Messages.get().container(
286                 Messages.ERR_GENERIC_SQL_1,
287                 CmsDbSqlException.getErrorQuery(stmt)), e);
288         } catch (Exception JavaDoc exc) {
289             throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_AGENT_0), exc);
290         } finally {
291             m_sqlManager.closeAll(dbc, conn, stmt, res);
292         }
293         return result;
294     }
295
296     /**
297      * @see org.opencms.db.I_CmsWorkflowDriver#readProject(org.opencms.db.CmsDbContext, org.opencms.workflow.CmsTask)
298      */

299     public CmsProject readProject(CmsDbContext dbc, CmsTask task) throws CmsDataAccessException {
300
301         PreparedStatement JavaDoc stmt = null;
302         CmsProject project = null;
303         ResultSet JavaDoc res = null;
304         Connection JavaDoc conn = null;
305
306         try {
307             conn = m_sqlManager.getConnection(dbc);
308             stmt = m_sqlManager.getPreparedStatement(conn, "C_PROJECTS_READ_BYTASK");
309
310             stmt.setInt(1, task.getId());
311             res = stmt.executeQuery();
312
313             if (res.next()) {
314                 project = new CmsProject(res, m_sqlManager);
315             } else {
316                 // project not found!
317
throw new CmsDbEntryNotFoundException(Messages.get().container(
318                     Messages.ERR_TASK_PROJECT_NOT_FOUND_1,
319                     task));
320             }
321         } catch (SQLException JavaDoc e) {
322             throw new CmsDbSqlException(Messages.get().container(
323                 Messages.ERR_GENERIC_SQL_1,
324                 CmsDbSqlException.getErrorQuery(stmt)), e);
325         } finally {
326             // close all db-resources
327
m_sqlManager.closeAll(dbc, conn, stmt, res);
328         }
329         return project;
330     }
331
332     /**
333      * @see org.opencms.db.I_CmsWorkflowDriver#readProjectLogs(org.opencms.db.CmsDbContext, int)
334      */

335     public List JavaDoc readProjectLogs(CmsDbContext dbc, int projectid) throws CmsDataAccessException {
336
337         ResultSet JavaDoc res = null;
338         Connection JavaDoc conn = null;
339
340         CmsTaskLog tasklog = null;
341         List JavaDoc logs = new ArrayList JavaDoc();
342         PreparedStatement JavaDoc stmt = null;
343         String JavaDoc comment = null;
344         java.sql.Timestamp JavaDoc starttime = null;
345         int id = CmsDbUtil.UNKNOWN_ID;
346         CmsUUID user = CmsUUID.getNullUUID();
347         int type = CmsDbUtil.UNKNOWN_ID;
348
349         try {
350             conn = m_sqlManager.getConnection(dbc);
351             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKLOG_READ_PPROJECTLOGS");
352             stmt.setInt(1, projectid);
353             res = stmt.executeQuery();
354             while (res.next()) {
355                 comment = res.getString(m_sqlManager.readQuery("C_LOG_COMMENT"));
356                 id = res.getInt(m_sqlManager.readQuery("C_LOG_ID"));
357                 starttime = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_LOG_STARTTIME"));
358                 user = new CmsUUID(res.getString(m_sqlManager.readQuery("C_LOG_USER")));
359                 type = res.getInt(m_sqlManager.readQuery("C_LOG_TYPE"));
360
361                 tasklog = new CmsTaskLog(id, comment, user, starttime, type);
362                 logs.add(tasklog);
363             }
364         } catch (SQLException JavaDoc e) {
365             throw new CmsDbSqlException(Messages.get().container(
366                 Messages.ERR_GENERIC_SQL_1,
367                 CmsDbSqlException.getErrorQuery(stmt)), e);
368         } catch (Exception JavaDoc exc) {
369             throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_TASK_LOGS_0), exc);
370         } finally {
371             // close all db-resources
372
m_sqlManager.closeAll(dbc, conn, stmt, res);
373         }
374         return logs;
375     }
376
377     /**
378      * @see org.opencms.db.I_CmsWorkflowDriver#readTask(org.opencms.db.CmsDbContext, int)
379      */

380     public CmsTask readTask(CmsDbContext dbc, int id) throws CmsDataAccessException {
381
382         ResultSet JavaDoc res = null;
383         CmsTask task = null;
384         PreparedStatement JavaDoc stmt = null;
385         Connection JavaDoc conn = null;
386         try {
387             conn = m_sqlManager.getConnection(dbc);
388             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_READ");
389             stmt.setInt(1, id);
390             res = stmt.executeQuery();
391
392             if (res.next()) {
393                 task = internalCreateTask(res);
394             }
395         } catch (SQLException JavaDoc e) {
396             throw new CmsDbSqlException(Messages.get().container(
397                 Messages.ERR_GENERIC_SQL_1,
398                 CmsDbSqlException.getErrorQuery(stmt)), e);
399         } catch (Exception JavaDoc exc) {
400             throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_TASK_1), exc);
401         } finally {
402             // close all db-resources
403
m_sqlManager.closeAll(dbc, conn, stmt, res);
404         }
405         return task;
406     }
407
408     /**
409      * @see org.opencms.db.I_CmsWorkflowDriver#readTaskLog(org.opencms.db.CmsDbContext, int)
410      */

411     public CmsTaskLog readTaskLog(CmsDbContext dbc, int id) throws CmsDataAccessException {
412
413         ResultSet JavaDoc res = null;
414         CmsTaskLog tasklog = null;
415         PreparedStatement JavaDoc stmt = null;
416         Connection JavaDoc conn = null;
417         try {
418             conn = m_sqlManager.getConnection(dbc);
419             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKLOG_READ");
420             stmt.setInt(1, id);
421             res = stmt.executeQuery();
422             if (res.next()) {
423                 String JavaDoc comment = res.getString(m_sqlManager.readQuery("C_LOG_COMMENT"));
424                 id = res.getInt(m_sqlManager.readQuery("C_LOG_ID"));
425                 java.sql.Timestamp JavaDoc starttime = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_LOG_STARTTIME"));
426                 CmsUUID user = new CmsUUID(res.getString(m_sqlManager.readQuery("C_LOG_USER")));
427                 int type = res.getInt(m_sqlManager.readQuery("C_LOG_TYPE"));
428
429                 tasklog = new CmsTaskLog(id, comment, user, starttime, type);
430             }
431         } catch (SQLException JavaDoc e) {
432             throw new CmsDbSqlException(Messages.get().container(
433                 Messages.ERR_GENERIC_SQL_1,
434                 CmsDbSqlException.getErrorQuery(stmt)), e);
435         } catch (Exception JavaDoc exc) {
436             throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_TASK_LOG_0), exc);
437         } finally {
438             // close all db-resources
439
m_sqlManager.closeAll(dbc, conn, stmt, res);
440         }
441
442         return tasklog;
443     }
444
445     /**
446      * @see org.opencms.db.I_CmsWorkflowDriver#readTaskLogs(org.opencms.db.CmsDbContext, int)
447      */

448     public List JavaDoc readTaskLogs(CmsDbContext dbc, int taskId) throws CmsDataAccessException {
449
450         Connection JavaDoc conn = null;
451         ResultSet JavaDoc res = null;
452         CmsTaskLog tasklog = null;
453         List JavaDoc logs = new ArrayList JavaDoc();
454         PreparedStatement JavaDoc stmt = null;
455         String JavaDoc comment = null;
456         java.sql.Timestamp JavaDoc starttime = null;
457         int id = CmsDbUtil.UNKNOWN_ID;
458         CmsUUID user = CmsUUID.getNullUUID();
459         int type = CmsDbUtil.UNKNOWN_ID;
460
461         try {
462             conn = m_sqlManager.getConnection(dbc);
463             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKLOG_READ_LOGS");
464             stmt.setInt(1, taskId);
465             res = stmt.executeQuery();
466             while (res.next()) {
467                 comment = res.getString(m_sqlManager.readQuery("C_TASKLOG_COMMENT"));
468                 id = res.getInt(m_sqlManager.readQuery("C_TASKLOG_ID"));
469                 starttime = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_TASKLOG_STARTTIME"));
470                 user = new CmsUUID(res.getString(m_sqlManager.readQuery("C_TASKLOG_USER")));
471                 type = res.getInt(m_sqlManager.readQuery("C_TASKLOG_TYPE"));
472                 tasklog = new CmsTaskLog(id, comment, user, starttime, type);
473                 logs.add(tasklog);
474             }
475         } catch (SQLException JavaDoc e) {
476             throw new CmsDbSqlException(Messages.get().container(
477                 Messages.ERR_GENERIC_SQL_1,
478                 CmsDbSqlException.getErrorQuery(stmt)), e);
479         } catch (Exception JavaDoc exc) {
480             throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_TASK_LOGS_0), exc);
481         } finally {
482             // close all db-resources
483
m_sqlManager.closeAll(dbc, conn, stmt, res);
484         }
485         return logs;
486     }
487
488     /**
489      * @see org.opencms.db.I_CmsWorkflowDriver#readTaskParameter(org.opencms.db.CmsDbContext, int, java.lang.String)
490      */

491     public String JavaDoc readTaskParameter(CmsDbContext dbc, int taskId, String JavaDoc parname) throws CmsDataAccessException {
492
493         String JavaDoc result = null;
494         ResultSet JavaDoc res = null;
495         PreparedStatement JavaDoc stmt = null;
496         Connection JavaDoc conn = null;
497
498         try {
499             conn = m_sqlManager.getConnection(dbc);
500             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKPAR_GET");
501             stmt.setInt(1, taskId);
502             stmt.setString(2, parname);
503             res = stmt.executeQuery();
504             if (res.next()) {
505                 result = res.getString(m_sqlManager.readQuery("C_PAR_VALUE"));
506             }
507         } catch (SQLException JavaDoc e) {
508             throw new CmsDbSqlException(Messages.get().container(
509                 Messages.ERR_GENERIC_SQL_1,
510                 CmsDbSqlException.getErrorQuery(stmt)), e);
511         } finally {
512             // close all db-resources
513
m_sqlManager.closeAll(dbc, conn, stmt, res);
514         }
515         return result;
516     }
517
518     /**
519      * @see org.opencms.db.I_CmsWorkflowDriver#readTasks(org.opencms.db.CmsDbContext, org.opencms.file.CmsProject, org.opencms.file.CmsUser, org.opencms.file.CmsUser, org.opencms.file.CmsGroup, int, java.lang.String, java.lang.String)
520      */

521     public List JavaDoc readTasks(
522         CmsDbContext dbc,
523         CmsProject project,
524         CmsUser agent,
525         CmsUser owner,
526         CmsGroup role,
527         int tasktype,
528         String JavaDoc orderBy,
529         String JavaDoc sort) throws CmsDataAccessException {
530
531         boolean first = true;
532         List JavaDoc tasks = new ArrayList JavaDoc(); // vector for the return result
533
CmsTask task = null; // tmp task for adding to vector
534
ResultSet JavaDoc res = null;
535         Connection JavaDoc conn = null;
536
537         // create the sql string depending on parameters
538
// handle the project for the SQL String
539
String JavaDoc sqlstr = "SELECT * FROM " + m_sqlManager.readQuery("C_TABLENAME_TASK") + " WHERE ";
540         if (project != null) {
541             sqlstr = sqlstr + m_sqlManager.readQuery("C_TASK_ROOT") + "=" + project.getTaskId();
542             first = false;
543         } else {
544             sqlstr = sqlstr
545                 + m_sqlManager.readQuery("C_TASK_ROOT")
546                 + "<> 0 AND "
547                 + m_sqlManager.readQuery("C_TASK_PARENT")
548                 + "<> 0";
549             first = false;
550         }
551
552         // handle the agent for the SQL String
553
if (agent != null) {
554             if (!first) {
555                 sqlstr = sqlstr + " AND ";
556             }
557             sqlstr = sqlstr + m_sqlManager.readQuery("C_TASK_AGENTUSER") + "='" + agent.getId() + "'";
558             first = false;
559         }
560
561         // handle the owner for the SQL String
562
if (owner != null) {
563             if (!first) {
564                 sqlstr = sqlstr + " AND ";
565             }
566             sqlstr = sqlstr + m_sqlManager.readQuery("C_TASK_INITIATORUSER") + "='" + owner.getId() + "'";
567             first = false;
568         }
569
570         // handle the role for the SQL String
571
if (role != null) {
572             if (!first) {
573                 sqlstr = sqlstr + " AND ";
574             }
575             sqlstr = sqlstr + m_sqlManager.readQuery("C_TASK_ROLE") + "='" + role.getId() + "'";
576             first = false;
577         }
578
579         sqlstr = sqlstr + internalReadTaskTypeCondition(first, tasktype);
580
581         // handel the order and sort parameter for the SQL String
582
if (orderBy != null) {
583             if (!orderBy.equals("")) {
584                 sqlstr = sqlstr + " ORDER BY " + orderBy;
585                 if (orderBy != null) {
586                     if (!orderBy.equals("")) {
587                         sqlstr = sqlstr + " " + sort;
588                     }
589                 }
590             }
591         }
592
593         Statement JavaDoc stmt = null;
594
595         try {
596             conn = m_sqlManager.getConnection(dbc);
597             stmt = conn.createStatement();
598             res = stmt.executeQuery(sqlstr);
599
600             // if resultset exists - return vector of tasks
601
while (res.next()) {
602                 task = internalCreateTask(res);
603                 tasks.add(task);
604             }
605
606         } catch (SQLException JavaDoc e) {
607             throw new CmsDbSqlException(Messages.get().container(
608                 Messages.ERR_GENERIC_SQL_1,
609                 CmsDbSqlException.getErrorQuery(stmt)), e);
610         } catch (Exception JavaDoc exc) {
611             throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_TASKS_0), exc);
612         } finally {
613             // close all db-resources
614
m_sqlManager.closeAll(dbc, conn, stmt, res);
615         }
616
617         return tasks;
618     }
619
620     /**
621      * @see org.opencms.db.I_CmsWorkflowDriver#readTaskType(org.opencms.db.CmsDbContext, java.lang.String)
622      */

623     public int readTaskType(CmsDbContext dbc, String JavaDoc taskName) throws CmsDataAccessException {
624
625         int result = 1;
626
627         PreparedStatement JavaDoc stmt = null;
628         ResultSet JavaDoc res = null;
629         Connection JavaDoc conn = null;
630
631         try {
632             conn = m_sqlManager.getConnection(dbc);
633             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_GET_TASKTYPE");
634             stmt.setString(1, taskName);
635             res = stmt.executeQuery();
636             if (res.next()) {
637                 result = res.getInt("id");
638             }
639         } catch (SQLException JavaDoc e) {
640             throw new CmsDbSqlException(Messages.get().container(
641                 Messages.ERR_GENERIC_SQL_1,
642                 CmsDbSqlException.getErrorQuery(stmt)), e);
643         } finally {
644             // close all db-resources
645
m_sqlManager.closeAll(dbc, conn, stmt, res);
646         }
647         return result;
648     }
649
650     /**
651      * @see org.opencms.db.I_CmsWorkflowDriver#writeSystemTaskLog(org.opencms.db.CmsDbContext, int, java.lang.String)
652      */

653     public void writeSystemTaskLog(CmsDbContext dbc, int taskid, String JavaDoc comment) throws CmsDataAccessException {
654
655         this.writeTaskLog(
656             dbc,
657             taskid,
658             CmsUUID.getNullUUID(),
659             new java.sql.Timestamp JavaDoc(System.currentTimeMillis()),
660             comment,
661             CmsTaskService.TASKLOG_USER);
662     }
663
664     /**
665      * @see org.opencms.db.I_CmsWorkflowDriver#writeTask(org.opencms.db.CmsDbContext, org.opencms.workflow.CmsTask)
666      */

667     public CmsTask writeTask(CmsDbContext dbc, CmsTask task) throws CmsDataAccessException {
668
669         PreparedStatement JavaDoc stmt = null;
670         Connection JavaDoc conn = null;
671
672         try {
673             conn = m_sqlManager.getConnection(dbc);
674             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_UPDATE");
675             stmt.setString(1, task.getName());
676             stmt.setInt(2, task.getState());
677             stmt.setInt(3, task.getTaskType());
678             stmt.setInt(4, task.getRoot());
679             stmt.setInt(5, task.getParent());
680             stmt.setString(6, task.getInitiatorUser().toString());
681             stmt.setString(7, task.getRole().toString());
682             stmt.setString(8, task.getAgentUser().toString());
683             stmt.setString(9, task.getOriginalUser().toString());
684             stmt.setTimestamp(10, task.getStartTime());
685             stmt.setTimestamp(11, task.getWakeupTime());
686             stmt.setTimestamp(12, task.getTimeOut());
687             stmt.setTimestamp(13, task.getEndTime());
688             stmt.setInt(14, task.getPercentage());
689             stmt.setString(15, task.getPermission());
690             stmt.setInt(16, task.getPriority());
691             stmt.setInt(17, task.getEscalationType());
692             stmt.setString(18, task.getHtmlLink());
693             stmt.setInt(19, task.getMilestone());
694             stmt.setInt(20, task.getAutoFinish());
695             stmt.setInt(21, task.getId());
696             stmt.executeUpdate();
697
698         } catch (SQLException JavaDoc e) {
699             throw new CmsDbSqlException(Messages.get().container(
700                 Messages.ERR_GENERIC_SQL_1,
701                 CmsDbSqlException.getErrorQuery(stmt)), e);
702         } finally {
703             m_sqlManager.closeAll(dbc, conn, stmt, null);
704         }
705         return (readTask(dbc, task.getId()));
706     }
707
708     /**
709      * @see org.opencms.db.I_CmsWorkflowDriver#writeTaskLog(org.opencms.db.CmsDbContext, int, org.opencms.util.CmsUUID, java.sql.Timestamp, java.lang.String, int)
710      */

711     public void writeTaskLog(
712         CmsDbContext dbc,
713         int taskId,
714         CmsUUID userId,
715         java.sql.Timestamp JavaDoc starttime,
716         String JavaDoc comment,
717         int type) throws CmsDataAccessException {
718
719         PreparedStatement JavaDoc stmt = null;
720         Connection JavaDoc conn = null;
721         try {
722             conn = m_sqlManager.getConnection(dbc);
723             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKLOG_WRITE");
724
725             stmt.setInt(1, m_sqlManager.nextId(TABLE_TASKLOG));
726             stmt.setInt(2, taskId);
727             if (!userId.isNullUUID()) {
728                 stmt.setString(3, userId.toString());
729             } else {
730                 // no user is specified so set to system user is only valid for system task log
731
stmt.setString(3, m_driverManager.readUser(
732                     dbc,
733                     OpenCms.getDefaultUsers().getUserGuest(),
734                     CmsUser.USER_TYPE_SYSTEMUSER).getId().toString());
735             }
736             stmt.setTimestamp(4, starttime);
737             stmt.setString(5, m_sqlManager.validateEmpty(comment));
738             stmt.setInt(6, type);
739
740             stmt.executeUpdate();
741         } catch (SQLException JavaDoc e) {
742             throw new CmsDbSqlException(Messages.get().container(
743                 Messages.ERR_GENERIC_SQL_1,
744                 CmsDbSqlException.getErrorQuery(stmt)), e);
745         } finally {
746             m_sqlManager.closeAll(dbc, conn, stmt, null);
747         }
748     }
749
750     /**
751      * @see org.opencms.db.I_CmsWorkflowDriver#writeTaskParameter(org.opencms.db.CmsDbContext, int, java.lang.String, java.lang.String)
752      */

753     public void writeTaskParameter(CmsDbContext dbc, int taskId, String JavaDoc parname, String JavaDoc parvalue)
754     throws CmsDataAccessException {
755
756         ResultSet JavaDoc res = null;
757         Connection JavaDoc conn = null;
758         PreparedStatement JavaDoc stmt = null;
759
760         try {
761             conn = m_sqlManager.getConnection(dbc);
762             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKPAR_TEST");
763             // test if the parameter already exists for this task
764
stmt.setInt(1, taskId);
765             stmt.setString(2, parname);
766             res = stmt.executeQuery();
767
768             if (res.next()) {
769                 //Parameter exisits, so make an update
770
internalWriteTaskParameter(dbc, res.getInt(m_sqlManager.readQuery("C_PAR_ID")), parvalue);
771             } else {
772                 //Parameter is not exisiting, so make an insert
773
internalWriteTaskParameter(dbc, taskId, parname, parvalue);
774
775             }
776         } catch (SQLException JavaDoc e) {
777             throw new CmsDbSqlException(Messages.get().container(
778                 Messages.ERR_GENERIC_SQL_1,
779                 CmsDbSqlException.getErrorQuery(stmt)), e);
780         } finally {
781             // close all db-resources
782
m_sqlManager.closeAll(dbc, conn, stmt, res);
783         }
784     }
785
786     /**
787      * @see org.opencms.db.I_CmsWorkflowDriver#writeTaskType(org.opencms.db.CmsDbContext, int, int, java.lang.String, java.lang.String, java.lang.String, int, int)
788      */

789     public void writeTaskType(
790         CmsDbContext dbc,
791         int autofinish,
792         int escalationtyperef,
793         String JavaDoc htmllink,
794         String JavaDoc name,
795         String JavaDoc permission,
796         int priorityref,
797         int roleref) throws CmsDataAccessException {
798
799         ResultSet JavaDoc res = null;
800         PreparedStatement JavaDoc stmt = null;
801         Connection JavaDoc conn = null;
802
803         try {
804             conn = m_sqlManager.getConnection(dbc);
805             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_GET_TASKTYPE");
806             // test if the parameter already exists for this task
807
stmt.setString(1, name);
808             res = stmt.executeQuery();
809
810             if (res.next()) {
811                 //Parameter exists, so make an update
812
internalWriteTaskType(
813                     dbc,
814                     res.getInt(m_sqlManager.readQuery("C_PAR_ID")),
815                     autofinish,
816                     escalationtyperef,
817                     htmllink,
818                     name,
819                     permission,
820                     priorityref,
821                     roleref);
822
823             } else {
824                 //Parameter is not existing, so make an insert
825
internalWriteTaskType(
826                     dbc,
827                     autofinish,
828                     escalationtyperef,
829                     htmllink,
830                     name,
831                     permission,
832                     priorityref,
833                     roleref);
834
835             }
836         } catch (SQLException JavaDoc e) {
837             throw new CmsDbSqlException(Messages.get().container(
838                 Messages.ERR_GENERIC_SQL_1,
839                 CmsDbSqlException.getErrorQuery(stmt)), e);
840         } finally {
841             // close all db-resources
842
m_sqlManager.closeAll(dbc, conn, stmt, res);
843         }
844     }
845
846     /**
847      * @see java.lang.Object#finalize()
848      */

849     protected void finalize() throws Throwable JavaDoc {
850
851         try {
852             m_sqlManager = null;
853             m_driverManager = null;
854         } catch (Throwable JavaDoc t) {
855             // ignore
856
}
857         super.finalize();
858     }
859
860     /**
861      * Semi-constructor to create a CmsTask instance from a JDBC result set.
862      *
863      * @param res the result set from the query
864      * @return the CmsTash created from the data
865      * @throws SQLException if something goes wrong
866      */

867     protected CmsTask internalCreateTask(ResultSet JavaDoc res) throws SQLException JavaDoc {
868
869         int autofinish = res.getInt(m_sqlManager.readQuery("C_TASK_AUTOFINISH"));
870         java.sql.Timestamp JavaDoc endtime = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_TASK_ENDTIME"));
871         int escalationtype = res.getInt(m_sqlManager.readQuery("C_TASK_ESCALATIONTYPE"));
872         int id = res.getInt(m_sqlManager.readQuery("C_TASK_ID"));
873         CmsUUID initiatoruser = new CmsUUID(res.getString(m_sqlManager.readQuery("C_TASK_INITIATORUSER")));
874         int milestone = res.getInt(m_sqlManager.readQuery("C_TASK_MILESTONE"));
875         String JavaDoc name = res.getString(m_sqlManager.readQuery("C_TASK_NAME"));
876         CmsUUID originaluser = new CmsUUID(res.getString(m_sqlManager.readQuery("C_TASK_ORIGINALUSER")));
877         CmsUUID agentuser = new CmsUUID(res.getString(m_sqlManager.readQuery("C_TASK_AGENTUSER")));
878         int parent = res.getInt(m_sqlManager.readQuery("C_TASK_PARENT"));
879         int percentage = res.getInt(m_sqlManager.readQuery("C_TASK_PERCENTAGE"));
880         String JavaDoc permission = res.getString(m_sqlManager.readQuery("C_TASK_PERMISSION"));
881         int priority = res.getInt(m_sqlManager.readQuery("C_TASK_PRIORITY"));
882         CmsUUID role = new CmsUUID(res.getString(m_sqlManager.readQuery("C_TASK_ROLE")));
883         int root = res.getInt(m_sqlManager.readQuery("C_TASK_ROOT"));
884         java.sql.Timestamp JavaDoc starttime = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_TASK_STARTTIME"));
885         int state = res.getInt(m_sqlManager.readQuery("C_TASK_STATE"));
886         int tasktype = res.getInt(m_sqlManager.readQuery("C_TASK_TASKTYPE"));
887         java.sql.Timestamp JavaDoc timeout = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_TASK_TIMEOUT"));
888         java.sql.Timestamp JavaDoc wakeuptime = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_TASK_WAKEUPTIME"));
889         String JavaDoc htmllink = res.getString(m_sqlManager.readQuery("C_TASK_HTMLLINK"));
890
891         return new CmsTask(
892             id,
893             name,
894             state,
895             tasktype,
896             root,
897             parent,
898             initiatoruser,
899             role,
900             agentuser,
901             originaluser,
902             starttime,
903             wakeuptime,
904             timeout,
905             endtime,
906             percentage,
907             permission,
908             priority,
909             escalationtype,
910             htmllink,
911             milestone,
912             autofinish);
913     }
914
915     /**
916      * Constructs a sql condition for the given task type.<p>
917      *
918      * @param first flag to indicate the first condition
919      * @param tasktype the type to query
920      * @return the sql condition
921      */

922     protected String JavaDoc internalReadTaskTypeCondition(boolean first, int tasktype) {
923
924         String JavaDoc result = "";
925         // handle the tasktype for the SQL String
926
if (!first) {
927             result = result + " AND ";
928         }
929
930         switch (tasktype) {
931             case CmsTaskService.TASKS_ALL:
932                 result = result + m_sqlManager.readQuery("C_TASK_ROOT") + "<>0";
933                 break;
934
935             case CmsTaskService.TASKS_OPEN:
936                 result = result + m_sqlManager.readQuery("C_TASK_STATE") + "=" + CmsTaskService.TASK_STATE_STARTED;
937                 break;
938
939             case CmsTaskService.TASKS_ACTIVE:
940                 result = result + m_sqlManager.readQuery("C_TASK_STATE") + "=" + CmsTaskService.TASK_STATE_STARTED;
941                 break;
942
943             case CmsTaskService.TASKS_DONE:
944                 result = result + m_sqlManager.readQuery("C_TASK_STATE") + "=" + CmsTaskService.TASK_STATE_ENDED;
945                 break;
946
947             case CmsTaskService.TASKS_NEW:
948                 result = result
949                     + m_sqlManager.readQuery("C_TASK_PERCENTAGE")
950                     + "='0' AND "
951                     + m_sqlManager.readQuery("C_TASK_STATE")
952                     + "="
953                     + CmsTaskService.TASK_STATE_STARTED;
954                 break;
955
956             default:
957         }
958
959         return result;
960     }
961
962     /**
963      * Updates a task parameter.<p>
964      *
965      * @param dbc the current database context
966      * @param parid the id of the parameter
967      * @param parvalue the value of the parameter
968      *
969      * @throws CmsDataAccessException if something goes wrong
970      */

971     protected void internalWriteTaskParameter(CmsDbContext dbc, int parid, String JavaDoc parvalue)
972     throws CmsDataAccessException {
973
974         PreparedStatement JavaDoc stmt = null;
975         Connection JavaDoc conn = null;
976         try {
977             conn = m_sqlManager.getConnection(dbc);
978             stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKPAR_UPDATE");
979             stmt.setString(1, parvalue);
980             stmt.setInt(2, parid);
981             stmt.executeUpdate();
982         } catch (SQLException JavaDoc e) {
983             throw new CmsDbSqlException(Messages.get().container(
984                 Messages.ERR_GENERIC_SQL_1,
985                 CmsDbSqlException.getErrorQuery(stmt)), e);
986         } finally {
987             m_sqlManager.closeAll(dbc, conn, stmt, null);
988         }
989     }
990
991     /**
992      * Adds a task parameter to a task.<p>
993      *
994      * @param dbc the current database context
995      * @param taskId the id of the task
996      * @param parname the name of the parameter
997      * @param parvalue the value of the parameter
998      *
999      * @return the id of the new parameter
1000     * @throws CmsDataAccessException if something goes wrong
1001     */

1002    protected int internalWriteTaskParameter(CmsDbContext dbc, int taskId, String JavaDoc parname, String JavaDoc parvalue)
1003    throws CmsDataAccessException {
1004
1005        PreparedStatement JavaDoc stmt = null;
1006        Connection JavaDoc conn = null;
1007        int newId = CmsDbUtil.UNKNOWN_ID;
1008        try {
1009            conn = m_sqlManager.getConnection(dbc);
1010            stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKPAR_INSERT");
1011            newId = m_sqlManager.nextId(TABLE_TASKPAR);
1012            stmt.setInt(1, newId);
1013            stmt.setInt(2, taskId);
1014            stmt.setString(3, m_sqlManager.validateEmpty(parname));
1015            stmt.setString(4, m_sqlManager.validateEmpty(parvalue));
1016            stmt.executeUpdate();
1017        } catch (SQLException JavaDoc e) {
1018            throw new CmsDbSqlException(Messages.get().container(
1019                Messages.ERR_GENERIC_SQL_1,
1020                CmsDbSqlException.getErrorQuery(stmt)), e);
1021        } finally {
1022            // close all db-resources
1023
m_sqlManager.closeAll(dbc, conn, stmt, null);
1024        }
1025        return newId;
1026    }
1027
1028    /**
1029     * Updates a task.<p>
1030     *
1031     * @param dbc the current database context
1032     * @param taskId the id of the task
1033     * @param autofinish tbd
1034     * @param escalationtyperef tbd
1035     * @param htmllink tbd
1036     * @param name tbd
1037     * @param permission tbd
1038     * @param priorityref tbd
1039     * @param roleref tbd
1040     *
1041     * @throws CmsDataAccessException if something goes wrong
1042     */

1043    protected void internalWriteTaskType(
1044        CmsDbContext dbc,
1045        int taskId,
1046        int autofinish,
1047        int escalationtyperef,
1048        String JavaDoc htmllink,
1049        String JavaDoc name,
1050        String JavaDoc permission,
1051        int priorityref,
1052        int roleref) throws CmsDataAccessException {
1053
1054        PreparedStatement JavaDoc stmt = null;
1055        Connection JavaDoc conn = null;
1056        try {
1057            conn = m_sqlManager.getConnection(dbc);
1058            stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKTYPE_UPDATE");
1059            stmt.setInt(1, autofinish);
1060            stmt.setInt(2, escalationtyperef);
1061            stmt.setString(3, htmllink);
1062            stmt.setString(4, name);
1063            stmt.setString(5, permission);
1064            stmt.setInt(6, priorityref);
1065            stmt.setInt(7, roleref);
1066            stmt.setInt(8, taskId);
1067            stmt.executeUpdate();
1068        } catch (SQLException JavaDoc e) {
1069            throw new CmsDbSqlException(Messages.get().container(
1070                Messages.ERR_GENERIC_SQL_1,
1071                CmsDbSqlException.getErrorQuery(stmt)), e);
1072        } finally {
1073            m_sqlManager.closeAll(dbc, conn, stmt, null);
1074        }
1075    }
1076
1077    /**
1078     * Inserts a new task.<p>
1079     *
1080     * @param dbc the current database context
1081     * @param autofinish tbd
1082     * @param escalationtyperef tbd
1083     * @param htmllink tbd
1084     * @param name tbd
1085     * @param permission tbd
1086     * @param priorityref tbd
1087     * @param roleref tbd
1088     *
1089     * @return tbd
1090     * @throws CmsDataAccessException tbd
1091     */

1092    protected int internalWriteTaskType(
1093        CmsDbContext dbc,
1094        int autofinish,
1095        int escalationtyperef,
1096        String JavaDoc htmllink,
1097        String JavaDoc name,
1098        String JavaDoc permission,
1099        int priorityref,
1100        int roleref) throws CmsDataAccessException {
1101
1102        PreparedStatement JavaDoc stmt = null;
1103        Connection JavaDoc conn = null;
1104
1105        int newId = CmsDbUtil.UNKNOWN_ID;
1106
1107        try {
1108            conn = m_sqlManager.getConnection(dbc);
1109            stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKTYPE_INSERT");
1110            newId = m_sqlManager.nextId(TABLE_TASKPAR);
1111            stmt.setInt(1, autofinish);
1112            stmt.setInt(2, escalationtyperef);
1113            stmt.setString(3, htmllink);
1114            stmt.setInt(4, newId);
1115            stmt.setString(5, name);
1116            stmt.setString(6, permission);
1117            stmt.setInt(7, priorityref);
1118            stmt.setInt(8, roleref);
1119            stmt.executeUpdate();
1120        } catch (SQLException JavaDoc e) {
1121            throw new CmsDbSqlException(Messages.get().container(
1122                Messages.ERR_GENERIC_SQL_1,
1123                CmsDbSqlException.getErrorQuery(stmt)), e);
1124        } finally {
1125            // close all db-resources
1126
m_sqlManager.closeAll(dbc, conn, stmt, null);
1127        }
1128        return newId;
1129    }
1130}
Popular Tags