001: /*
002: * This file is part of the WfMOpen project.
003: * Copyright (C) 2001-2003 Danet GmbH (www.danet.de), GS-AN.
004: * All rights reserved.
005: *
006: * This program is free software; you can redistribute it and/or modify
007: * it under the terms of the GNU General Public License as published by
008: * the Free Software Foundation; either version 2 of the License, or
009: * (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * $Id: ProcessDataStore.java,v 1.3 2006/09/29 12:32:10 drmlipp Exp $
021: *
022: * $Log: ProcessDataStore.java,v $
023: * Revision 1.3 2006/09/29 12:32:10 drmlipp
024: * Consistently using WfMOpen as projct name now.
025: *
026: * Revision 1.2 2005/04/22 15:11:04 drmlipp
027: * Merged changes from 1.3 branch up to 1.3p15.
028: *
029: * Revision 1.1.1.2.6.1 2005/04/13 16:14:08 drmlipp
030: * Optimized db access.
031: *
032: * Revision 1.1.1.2 2004/08/18 15:17:38 drmlipp
033: * Update to 1.2
034: *
035: * Revision 1.7 2004/02/19 13:02:00 schlue
036: * Released version 1.1 (after review)
037: *
038: * Revision 1.6 2004/02/09 15:15:29 lipp
039: * Support for looking up processes by the value of a data item.
040: *
041: * Revision 1.5 2003/06/27 08:51:45 lipp
042: * Fixed copyright/license information.
043: *
044: * Revision 1.4 2003/04/24 20:50:13 lipp
045: * Fixed some warnings.
046: *
047: * Revision 1.3 2003/03/31 16:50:28 huaiyang
048: * Logging using common-logging.
049: *
050: * Revision 1.2 2002/08/19 15:28:46 lipp
051: * Added logger.
052: *
053: * Revision 1.1 2002/08/17 19:02:05 lipp
054: * Added process data.
055: *
056: */
057: package de.danet.an.workflow.ejbs.core;
058:
059: import java.io.IOException;
060:
061: import java.util.ArrayList;
062: import java.util.Collection;
063:
064: import java.sql.Connection;
065: import java.sql.PreparedStatement;
066: import java.sql.ResultSet;
067: import java.sql.SQLException;
068:
069: import javax.sql.DataSource;
070:
071: import de.danet.an.util.JDBCUtil;
072: import de.danet.an.util.persistentmaps.JDBCPersistentMap;
073:
074: import de.danet.an.workflow.omgcore.ProcessData;
075:
076: /**
077: * This class extends <code>JDBCPersistentMap</code> in order to implement
078: * <code>ProcessData</code>.
079: *
080: * @author <a href="mailto:lipp@danet.de">Michael Lipp</a>
081: * @version $Revision: 1.3 $
082: */
083:
084: public class ProcessDataStore extends JDBCPersistentMap implements
085: ProcessData {
086:
087: private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
088: .getLog(ProcessDataStore.class);
089:
090: /**
091: * Creates an instance of <code>ProcessDataStore</code>
092: * with all attributes initialized to default values.
093: * @param dataSource the data source that will be used to obtain
094: * connections from
095: * @throws SQLException if a database related error occurs
096: */
097: public ProcessDataStore(DataSource dataSource) throws SQLException {
098: super (dataSource, new Long(-1), "PROCESSDATA");
099: }
100:
101: /**
102: * Find all processes of a given type that have a given value in a
103: * particular process data item. Note that this method may only be
104: * used for data items of type string.
105: *
106: * @param con the database connection to use
107: * @param processMgr the process type
108: * @param itemName the item name
109: * @param itemValue the item value
110: * @return the process keys found
111: * @throws SQLException if a database error occurs
112: * @throws IOException if an object cannot be deserialized
113: */
114: public Collection findProcessesByTypeAndDataItem(Connection con,
115: String processMgr, String itemName, String itemValue)
116: throws SQLException, IOException {
117: PreparedStatement prepStmt = null;
118: ResultSet rs = null;
119: try {
120: Collection processes = new ArrayList();
121: // null needs special handling
122: if (itemValue == null) {
123: prepStmt = con
124: .prepareStatement("SELECT MapId FROM Process INNER JOIN ProcessData "
125: + " ON DBId = MapId WHERE ProcessMgr = ? "
126: + " AND Item = ? AND SValue IS NULL AND BValue IS NULL");
127: prepStmt.setString(1, processMgr);
128: prepStmt.setString(2, itemName);
129: rs = prepStmt.executeQuery();
130: while (rs.next()) {
131: processes.add(new Long(rs.getString(1)));
132: }
133: return processes;
134: }
135: setConnection(con);
136: if (isSValue(itemValue)) {
137: prepStmt = con
138: .prepareStatement("SELECT MapId FROM Process INNER JOIN ProcessData "
139: + " ON DBId = MapId WHERE ProcessMgr = ? "
140: + " AND Item = ? AND SValue = ?");
141: prepStmt.setString(1, processMgr);
142: prepStmt.setString(2, itemName);
143: prepStmt.setString(3, itemValue);
144: rs = prepStmt.executeQuery();
145: while (rs.next()) {
146: processes.add(new Long(rs.getString(1)));
147: }
148: } else {
149: prepStmt = con
150: .prepareStatement("SELECT BValue, MapId FROM Process INNER JOIN ProcessData "
151: + " ON DBId = MapId WHERE ProcessMgr = ? AND Item = ? "
152: + " AND SValue IS NULL AND NOT BValue IS NULL");
153: prepStmt.setString(1, processMgr);
154: prepStmt.setString(2, itemName);
155: rs = prepStmt.executeQuery();
156: while (rs.next()) {
157: Object value = JDBCUtil.getBinary(rs, 1);
158: if ((value instanceof String)
159: && ((String) value).equals(itemValue)) {
160: processes.add(new Long(rs.getString(2)));
161: }
162: }
163: }
164: return processes;
165: } catch (ClassNotFoundException e) {
166: logger.error(e.getMessage(), e);
167: throw new IOException(e.getMessage());
168: } finally {
169: setConnection(null);
170: JDBCUtil.closeAll(rs, prepStmt, null);
171: }
172: }
173:
174: }
|