📄 cmsworkflowdriver.java
字号:
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/db/generic/CmsWorkflowDriver.java,v $
* Date : $Date: 2006/03/27 14:52:54 $
* Version: $Revision: 1.56 $
*
* This library is part of OpenCms -
* the Open Source Content Mananagement System
*
* Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.db.generic;
import org.opencms.configuration.CmsConfigurationManager;
import org.opencms.db.CmsDbContext;
import org.opencms.db.CmsDbEntryNotFoundException;
import org.opencms.db.CmsDbSqlException;
import org.opencms.db.CmsDbUtil;
import org.opencms.db.CmsDriverManager;
import org.opencms.db.I_CmsDriver;
import org.opencms.db.I_CmsWorkflowDriver;
import org.opencms.file.CmsDataAccessException;
import org.opencms.file.CmsGroup;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsUser;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.util.CmsUUID;
import org.opencms.workflow.CmsTask;
import org.opencms.workflow.CmsTaskLog;
import org.opencms.workflow.CmsTaskService;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
/**
* Generic (ANSI-SQL) database server implementation of the workflow driver methods.<p>
*
* @author Thomas Weckert
* @author Michael Emmerich
*
* @version $Revision: 1.56 $
*
* @since 6.0.0
*/
public class CmsWorkflowDriver implements I_CmsDriver, I_CmsWorkflowDriver {
/** Table key for tasks. */
protected static final String TABLE_TASK = "CMS_TASKS";
/** Table key for task logs. */
protected static final String TABLE_TASKLOG = "CMS_TASKLOG";
/** Table key for task par(ameter). */
protected static final String TABLE_TASKPAR = "CMS_TASKPAR";
/** Table key for task type. */
protected static final String TABLE_TASKTYPE = "CMS_TASKTYPE";
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(org.opencms.db.generic.CmsWorkflowDriver.class);
/** The driver manager. */
protected CmsDriverManager m_driverManager;
/** The SQL manager. */
protected org.opencms.db.generic.CmsSqlManager m_sqlManager;
/**
* @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)
*/
public CmsTask createTask(
CmsDbContext dbc,
int rootId,
int parentId,
int tasktype,
CmsUUID ownerId,
CmsUUID agentId,
CmsUUID roleId,
String taskname,
java.sql.Timestamp wakeuptime,
java.sql.Timestamp timeout,
int priority) throws CmsDataAccessException {
// fetch new task id
int newId = m_sqlManager.nextId(TABLE_TASK);
// create the task id entry in the DB
PreparedStatement stmt = null;
Connection conn = null;
try {
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_CREATE");
stmt.setInt(1, newId);
stmt.executeUpdate();
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} finally {
m_sqlManager.closeAll(dbc, conn, stmt, null);
}
// create the task object, note that this does not user the "task type" table
// because the generic SQL does not work with MySQL 4
CmsTask task = new CmsTask(
newId,
taskname,
CmsTaskService.TASK_STATE_STARTED,
tasktype,
rootId,
parentId,
ownerId,
roleId,
agentId,
agentId,
new java.sql.Timestamp(System.currentTimeMillis()),
wakeuptime,
timeout,
null,
0,
"30308",
priority,
0,
"../taskforms/adhoc.asp",
0,
1);
// write task
task = writeTask(dbc, task);
return task;
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#destroy()
*/
public void destroy() throws Throwable {
finalize();
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_SHUTDOWN_DRIVER_1, getClass().getName()));
}
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#endTask(org.opencms.db.CmsDbContext, int)
*/
public void endTask(CmsDbContext dbc, int taskId) throws CmsDataAccessException {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_END");
stmt.setInt(1, 100);
stmt.setTimestamp(2, new java.sql.Timestamp(System.currentTimeMillis()));
stmt.setInt(3, taskId);
stmt.executeUpdate();
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} finally {
m_sqlManager.closeAll(dbc, conn, stmt, null);
}
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#forwardTask(org.opencms.db.CmsDbContext, int, org.opencms.util.CmsUUID, org.opencms.util.CmsUUID)
*/
public void forwardTask(CmsDbContext dbc, int taskId, CmsUUID newRoleId, CmsUUID newUserId)
throws CmsDataAccessException {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_FORWARD");
stmt.setString(1, newRoleId.toString());
stmt.setString(2, newUserId.toString());
stmt.setInt(3, taskId);
stmt.executeUpdate();
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} finally {
m_sqlManager.closeAll(dbc, conn, stmt, null);
}
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#getSqlManager()
*/
public CmsSqlManager getSqlManager() {
return m_sqlManager;
}
/**
* @see org.opencms.db.I_CmsDriver#init(org.opencms.db.CmsDbContext, org.opencms.configuration.CmsConfigurationManager, java.util.List, org.opencms.db.CmsDriverManager)
*/
public void init(
CmsDbContext dbc,
CmsConfigurationManager configurationManager,
List successiveDrivers,
CmsDriverManager driverManager) {
Map configuration = configurationManager.getConfiguration();
String poolUrl = (String)configuration.get("db.workflow.pool");
String classname = (String)configuration.get("db.workflow.sqlmanager");
m_sqlManager = this.initSqlManager(classname);
m_sqlManager.init(I_CmsWorkflowDriver.DRIVER_TYPE_ID, poolUrl);
m_driverManager = driverManager;
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_ASSIGNED_POOL_1, poolUrl));
}
if (successiveDrivers != null && !successiveDrivers.isEmpty()) {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(
Messages.LOG_SUCCESSIVE_DRIVERS_UNSUPPORTED_1,
getClass().getName()));
}
}
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#initSqlManager(String)
*/
public org.opencms.db.generic.CmsSqlManager initSqlManager(String classname) {
return CmsSqlManager.getInstance(classname);
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#readAgent(org.opencms.db.CmsDbContext, org.opencms.util.CmsUUID)
*/
public CmsUUID readAgent(CmsDbContext dbc, CmsUUID roleId) throws CmsDataAccessException {
CmsUUID result = CmsUUID.getNullUUID();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet res = null;
try {
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_TASK_FIND_AGENT");
stmt.setString(1, roleId.toString());
res = stmt.executeQuery();
if (res.next()) {
result = new CmsUUID(res.getString(1));
}
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} catch (Exception exc) {
throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_AGENT_0), exc);
} finally {
m_sqlManager.closeAll(dbc, conn, stmt, res);
}
return result;
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#readProject(org.opencms.db.CmsDbContext, org.opencms.workflow.CmsTask)
*/
public CmsProject readProject(CmsDbContext dbc, CmsTask task) throws CmsDataAccessException {
PreparedStatement stmt = null;
CmsProject project = null;
ResultSet res = null;
Connection conn = null;
try {
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_PROJECTS_READ_BYTASK");
stmt.setInt(1, task.getId());
res = stmt.executeQuery();
if (res.next()) {
project = new CmsProject(res, m_sqlManager);
} else {
// project not found!
throw new CmsDbEntryNotFoundException(Messages.get().container(
Messages.ERR_TASK_PROJECT_NOT_FOUND_1,
task));
}
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} finally {
// close all db-resources
m_sqlManager.closeAll(dbc, conn, stmt, res);
}
return project;
}
/**
* @see org.opencms.db.I_CmsWorkflowDriver#readProjectLogs(org.opencms.db.CmsDbContext, int)
*/
public List readProjectLogs(CmsDbContext dbc, int projectid) throws CmsDataAccessException {
ResultSet res = null;
Connection conn = null;
CmsTaskLog tasklog = null;
List logs = new ArrayList();
PreparedStatement stmt = null;
String comment = null;
java.sql.Timestamp starttime = null;
int id = CmsDbUtil.UNKNOWN_ID;
CmsUUID user = CmsUUID.getNullUUID();
int type = CmsDbUtil.UNKNOWN_ID;
try {
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_TASKLOG_READ_PPROJECTLOGS");
stmt.setInt(1, projectid);
res = stmt.executeQuery();
while (res.next()) {
comment = res.getString(m_sqlManager.readQuery("C_LOG_COMMENT"));
id = res.getInt(m_sqlManager.readQuery("C_LOG_ID"));
starttime = CmsDbUtil.getTimestamp(res, m_sqlManager.readQuery("C_LOG_STARTTIME"));
user = new CmsUUID(res.getString(m_sqlManager.readQuery("C_LOG_USER")));
type = res.getInt(m_sqlManager.readQuery("C_LOG_TYPE"));
tasklog = new CmsTaskLog(id, comment, user, starttime, type);
logs.add(tasklog);
}
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} catch (Exception exc) {
throw new CmsDataAccessException(Messages.get().container(Messages.ERR_READ_TASK_LOGS_0), exc);
} finally {
// close all db-resources
m_sqlManager.closeAll(dbc, conn, stmt, res);
}
return logs;
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -