package org.uengine.ui.tree.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.uengine.security.AclManager;
import org.uengine.ui.tree.model.Form;
import org.uengine.ui.tree.model.Item;
import org.uengine.util.ForLoop;
public class ProcessDefinitionListDAO {
protected JdbcTemplate jdbcTemplate = null;
public ProcessDefinitionListDAO(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// Only Folder
@SuppressWarnings("unchecked")
public List<Item> findAllFolder(final String endpoint) {
String sql = new StringBuffer(
"SELECT defid, parentfolder, name, objtype, prodver FROM bpm_procdef ").append(
"WHERE (isdeleted='0') AND (objtype = 'folder') ").toString();
final AclManager aclManager = AclManager.getInstance();
return this.jdbcTemplate.query(sql, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = null;
int defid = rs.getInt("defid");
Map<Character, Boolean> permission = aclManager.getPermission(defid, endpoint);
if (permission.containsKey(AclManager.PERMISSION_VIEW) ||
permission.containsKey(AclManager.PERMISSION_INITIATE) ) {
String parentFolder = rs.getString("parentfolder");
String name = rs.getString("name");
String objtype = rs.getString("objtype");
item = new Item();
item.setId(String.valueOf(defid));
item.setName(name);
item.setParent(parentFolder);
item.setObj(objtype);
}
return item;
}
});
}
// ForParticipant
@SuppressWarnings("unchecked")
public List<Item> findAllProcessDefinitionsForParticipant(final String endpoint) {
String sql = new StringBuffer(
"SELECT defid, parentfolder, name, objtype, prodver FROM bpm_procdef ").append(
"WHERE (isdeleted='0') AND ((objtype = 'process' AND prodver <> 0) OR (objtype = 'folder') )").toString();
final AclManager aclManager = AclManager.getInstance();
return this.jdbcTemplate.query(sql, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = null;
int defid = rs.getInt("defid");
Map<Character, Boolean> permission = aclManager.getPermission(defid, endpoint);
if (permission.containsKey(AclManager.PERMISSION_VIEW) ||
permission.containsKey(AclManager.PERMISSION_INITIATE) ) {
String parentFolder = rs.getString("parentfolder");
String name = rs.getString("name");
String objtype = rs.getString("objtype");
item = new Item();
item.setId(String.valueOf(defid));
item.setName(name);
item.setParent(parentFolder);
item.setObj(objtype);
}
return item;
}
});
}
// Process Definition
@SuppressWarnings("unchecked")
public List<Item> findAllProcessDefinitions(final String endpoint) {
String sql = "SELECT defid, parentfolder, name, objtype, prodver FROM bpm_procdef WHERE isdeleted='0'";
return this.jdbcTemplate.query(sql, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = null;
int defid = rs.getInt("defid");
String name = rs.getString("name");
String objtype = rs.getString("objtype");
String parentFolder = rs.getString("parentfolder");
item = new Item();
item.setId(String.valueOf(defid));
item.setName(name);
item.setParent(parentFolder);
item.setObj(objtype);
return item;
}
});
}
@SuppressWarnings("unchecked")
public List<Item> findAllAuthorityProcessDefinitions(final String endpoint, final String comCode, final char cPermission) {
String sql = "SELECT defid, parentfolder, name, objtype, prodver FROM bpm_procdef WHERE isdeleted='0' AND comcode = '" + comCode + "'";
final AclManager aclManager = AclManager.getInstance();
return this.jdbcTemplate.query(sql, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = null;
int defid = rs.getInt("defid");
Map<Character, Boolean> permission = aclManager.getPermission(defid, endpoint, true);
if (permission.containsKey(AclManager.PERMISSION_MANAGEMENT) || permission.containsKey(cPermission)) {
String name = rs.getString("name");
String objtype = rs.getString("objtype");
String parentFolder = rs.getString("parentfolder");
item = new Item();
item.setId(String.valueOf(defid));
item.setName(name);
item.setParent(parentFolder);
item.setObj(objtype);
Character[] permissions = null;
if (permission.size() > 0)
permissions = (Character[]) permission.keySet().toArray(new Character[permission.size()]);
item.setAuthority(permissions);
}
return item;
}
});
}
/**
* <pre>
* Definition List에서 type = folder 인것만 검색한다.
* </pre>
*
* @param endpoint
* @param comCode
* @param cPermission
* @return
*/
@SuppressWarnings("unchecked")
public List<Item> findFolderAuthorityProcessDefinitions(final String endpoint, final String comCode, final char cPermission) {
StringBuffer sql = new StringBuffer();
sql.append("SELECT defid ").append("\n")
.append(" ,parentfolder ").append("\n")
.append(" ,name ").append("\n")
.append(" ,objtype ").append("\n")
.append(" ,prodver ").append("\n")
.append(" FROM bpm_procdef ").append("\n")
.append(" WHERE isdeleted = 0 ").append("\n")
.append(" AND objtype = 'folder'").append("\n")
.append(" AND comcode = '").append(comCode).append("'").append("\n");
final AclManager aclManager = AclManager.getInstance();
return this.jdbcTemplate.query(sql.toString(), new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = null;
int defid = rs.getInt("defid");
//Map<Character, Boolean> permission = aclManager.getPermission(defid, endpoint);
Map<Character, Boolean> permission = aclManager.getPermission(defid, endpoint, comCode, rs.getString("parentfolder"));
if (permission.containsKey(AclManager.PERMISSION_MANAGEMENT) || permission.containsKey(cPermission)) {
String name = rs.getString("name");
String objtype = rs.getString("objtype");
String parentFolder = rs.getString("parentfolder");
item = new Item();
item.setId(String.valueOf(defid));
item.setName(name);
item.setParent(parentFolder);
item.setObj(objtype);
Character[] permissions = null;
if (permission.size() > 0)
permissions = (Character[]) permission.keySet().toArray(new Character[permission.size()]);
item.setAuthority(permissions);
}
return item;
}
});
}
// Form Definition
public int findFormProductionVersionId(int defId) {
String sql = "SELECT prodverid FROM bpm_procdef WHERE defid=?";
return this.jdbcTemplate.queryForInt(sql, new Object[] { defId });
}
@SuppressWarnings("unchecked")
public List<Form> findAllFormVersions(int defId) {
String sql = "SELECT defverid, ver FROM bpm_procdefver WHERE defid=? AND isdeleted=0";
return this.jdbcTemplate.query(sql, new Object[] { defId },
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Form form = new Form();
form.setDefVerId(rs.getInt("defVerId"));
form.setVer(rs.getString("ver"));
return form;
}
});
}
@SuppressWarnings("unchecked")
public List<Item> findAllFormListForParticipant(final String endpoint) {
String sql = new StringBuffer(
"SELECT defid, name, objtype, parentFolder FROM bpm_procdef").append(
" WHERE (isdeleted='0') AND (objtype = 'form' AND prodver <> 0) OR (objtype = 'folder')").toString();
final AclManager aclManager = AclManager.getInstance();
return this.jdbcTemplate.query(sql,
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = null;
int defid = rs.getInt("defid");
Map<Character, Boolean> permission = aclManager.getPermission(defid, endpoint);
if (permission.containsKey(AclManager.PERMISSION_INITIATE) ||
permission.containsKey(AclManager.PERMISSION_VIEW) ||
permission.containsKey(AclManager.PERMISSION_EDIT)) {
String name = rs.getString("name");
String objtype = rs.getString("objtype");
String parentFolder = rs.getString("parentfolder");
item = new Item();
item.setId(String.valueOf(defid));
item.setName(name);
item.setParent(parentFolder);
item.setObj(objtype);
}
return item;
}
});
}
@SuppressWarnings("unchecked")
public List<Item> findParentFolder(final String comCode, final String defid) {
StringBuffer sql = new StringBuffer();
sql.append("SELECT defid ").append("\n")
.append(" ,parentfolder ").append("\n")
.append(" ,name ").append("\n")
.append(" ,objtype ").append("\n")
.append(" ,prodver ").append("\n")
.append(" FROM bpm_procdef ").append("\n")
.append(" WHERE isdeleted = 0 ").append("\n")
.append(" AND objtype = 'folder'").append("\n")
.append(" AND comcode = '").append(comCode).append("'").append("\n");
final List<Item> itemList = this.jdbcTemplate.query(sql.toString(), new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = null;
int defid = rs.getInt("defid");
String name = rs.getString("name");
String objtype = rs.getString("objtype");
String parentFolder = rs.getString("parentfolder");
item = new Item();
item.setId(String.valueOf(defid));
item.setName(name);
item.setParent(parentFolder);
item.setObj(objtype);
return item;
}
});
FindParent.find(itemList, defid);
return FindParent.getResultItemList();
}
static class FindParent {
private static List<Item> _RESULT_ITEM_LIST;
public static List<Item> getResultItemList() {
return _RESULT_ITEM_LIST;
}
public static void find(List<Item> folderItem, String id) {
String parent = "";
Item item = null;
for(int i=0; i < folderItem.size(); i++) {
item = folderItem.get(i);
if (item.getId().equals(id)) {
parent = (String)item.getParent();
break;
}
}
for(int i=0; i < folderItem.size(); i++) {
item = folderItem.get(i);
if (item.getId().equals(parent)) {
_RESULT_ITEM_LIST.add(item);
if (item.getParent() != null && !item.getParent().equals("")) {
find(folderItem, item.getId());
}
break;
}
}
}
}
}