001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.bpmscript.jbi.tasklist.db;
018:
019: import java.io.ByteArrayInputStream;
020: import java.io.IOException;
021: import java.io.ObjectInputStream;
022: import java.sql.SQLException;
023: import java.sql.Timestamp;
024: import java.util.ArrayList;
025: import java.util.List;
026:
027: import javax.jbi.messaging.MessageExchange;
028:
029: import org.bpmscript.IMarshaler;
030: import org.bpmscript.IPagedResult;
031: import org.bpmscript.IQuery;
032: import org.bpmscript.PagedResult;
033: import org.bpmscript.XStreamMarshaler;
034: import org.bpmscript.jbi.tasklist.ITask;
035: import org.bpmscript.jbi.tasklist.ITaskListStore;
036: import org.bpmscript.jbi.tasklist.ITaskRequest;
037: import org.bpmscript.jbi.tasklist.Task;
038: import org.bpmscript.jbi.tasklist.TaskListException;
039: import org.bpmscript.jbi.tasklist.TaskState;
040: import org.hibernate.HibernateException;
041: import org.hibernate.Query;
042: import org.hibernate.Session;
043: import org.springframework.orm.hibernate3.HibernateCallback;
044: import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
045:
046: public class HibernateTaskListStore extends HibernateDaoSupport
047: implements ITaskListStore {
048:
049: private IMarshaler marshaler = new XStreamMarshaler();
050:
051: public void closeTask(String taskId) throws TaskListException {
052: DbTask task = (DbTask) getHibernateTemplate().get(DbTask.class,
053: taskId);
054: task.setLastModified(new Timestamp(System.currentTimeMillis()));
055: task.setState(TaskState.CLOSED.name());
056: getHibernateTemplate().update(task);
057: }
058:
059: /**
060: * Create a task
061: */
062: public String createTask(MessageExchange exchange,
063: ITaskRequest request) throws TaskListException {
064: DbTask dbTask = new DbTask();
065: Timestamp now = new Timestamp(System.currentTimeMillis());
066: dbTask.setCreationDate(now);
067: dbTask.setLastModified(now);
068: dbTask.setExchange(exchange);
069: dbTask.setSerializedTaskRequest(marshaler.marshal(request));
070: dbTask.setState(TaskState.OPEN.name());
071: dbTask.setProcessInstanceId(request.getProcessInstanceId());
072: getHibernateTemplate().save(dbTask);
073: return dbTask.getId();
074: }
075:
076: public MessageExchange getMessageExchange(String taskId)
077: throws TaskListException {
078: List list = getHibernateTemplate()
079: .findByNamedParam(
080: "select task.exchangeBytes from org.bpmscript.jbi.tasklist.db.DbTask task where task.id = :taskId",
081: "taskId", taskId);
082: if (list.size() == 1) {
083: Object bytesObject = list.get(0);
084: if (bytesObject instanceof byte[]) {
085: byte[] eb = (byte[]) bytesObject;
086: MessageExchange exchange = getExchange(eb);
087: return exchange;
088: } else {
089: return null;
090: }
091: } else {
092: return null;
093: }
094: }
095:
096: private MessageExchange getExchange(byte[] exchangeBytes)
097: throws TaskListException {
098: MessageExchange exchange = null;
099: try {
100: ObjectInputStream in = new ObjectInputStream(
101: new ByteArrayInputStream(exchangeBytes));
102: exchange = (MessageExchange) in.readObject();
103: in.close();
104: } catch (IOException e) {
105: throw new TaskListException(e);
106: } catch (ClassNotFoundException e) {
107: throw new TaskListException(e);
108: }
109: return exchange;
110: }
111:
112: public ITask getTask(String taskId) throws TaskListException {
113: List list = getHibernateTemplate()
114: .findByNamedParam(
115: "select task.state, task.serializedTaskRequest, task.creationDate, task.lastModified from org.bpmscript.jbi.tasklist.db.DbTask task where task.id = :taskId",
116: "taskId", taskId);
117: if (list.size() == 1) {
118: Object[] row = (Object[]) list.get(0);
119: Task task = new Task();
120: task.setId(taskId);
121: task.setTaskState(TaskState.valueOf((String) row[0]));
122: task.setTaskRequest((ITaskRequest) marshaler
123: .unmarshal((String) row[1]));
124: task.setCreationDate((Timestamp) row[2]);
125: task.setLastModified((Timestamp) row[3]);
126: return task;
127: } else {
128: return null;
129: }
130: }
131:
132: @SuppressWarnings("unchecked")
133: public IPagedResult<ITask> getTasks(final IQuery query)
134: throws TaskListException {
135:
136: List<ITask> tasks = (List<ITask>) getHibernateTemplate()
137: .execute(new HibernateCallback() {
138: public Object doInHibernate(Session session)
139: throws HibernateException, SQLException {
140: Query hibernateQuery = null;
141: hibernateQuery = session
142: .createQuery("select task.id, task.state, task.serializedTaskRequest, task.creationDate, task.lastModified from org.bpmscript.jbi.tasklist.db.DbTask task");
143: if (query.getFirstResult() >= 0) {
144: hibernateQuery.setFirstResult(query
145: .getFirstResult());
146: }
147: if (query.getMaxResults() >= 0) {
148: hibernateQuery.setMaxResults(query
149: .getMaxResults() + 1);
150: }
151: List<Object[]> rows = hibernateQuery.list();
152:
153: List<ITask> result = new ArrayList<ITask>();
154:
155: for (Object[] row : rows) {
156: Task task = new Task();
157: task.setId((String) row[0]);
158: task.setTaskState(TaskState
159: .valueOf((String) row[1]));
160: task
161: .setTaskRequest((ITaskRequest) marshaler
162: .unmarshal((String) row[2]));
163: task.setCreationDate((Timestamp) row[3]);
164: task.setLastModified((Timestamp) row[4]);
165: result.add(task);
166: }
167:
168: return result;
169: }
170: });
171: boolean more = false;
172: if (query.getMaxResults() >= 0) {
173: if (tasks.size() > query.getMaxResults()) {
174: tasks.remove(tasks.size() - 1);
175: more = true;
176: }
177: }
178: return new PagedResult<ITask>(tasks, more, -1);
179: }
180:
181: @SuppressWarnings("unchecked")
182: public List<ITask> getTasksForInstance(
183: final String processInstanceId) throws TaskListException {
184:
185: List<ITask> tasks = (List<ITask>) getHibernateTemplate()
186: .execute(new HibernateCallback() {
187: public Object doInHibernate(Session session)
188: throws HibernateException, SQLException {
189: Query hibernateQuery = null;
190: hibernateQuery = session
191: .createQuery("select task.id, task.state, task.serializedTaskRequest, task.creationDate, task.lastModified from org.bpmscript.jbi.tasklist.db.DbTask as task where task.processInstanceId = :processInstanceId");
192: hibernateQuery.setString("processInstanceId",
193: processInstanceId);
194:
195: List<Object[]> rows = hibernateQuery.list();
196:
197: List<ITask> result = new ArrayList<ITask>();
198:
199: for (Object[] row : rows) {
200: Task task = new Task();
201: task.setId((String) row[0]);
202: task.setTaskState(TaskState
203: .valueOf((String) row[1]));
204: task
205: .setTaskRequest((ITaskRequest) marshaler
206: .unmarshal((String) row[2]));
207: task.setCreationDate((Timestamp) row[3]);
208: task.setLastModified((Timestamp) row[4]);
209: result.add(task);
210: }
211:
212: return result;
213: }
214: });
215: return tasks;
216: }
217:
218: }
|