001: /*
002: * JBoss, Home of Professional Open Source
003: * Copyright 2005, JBoss Inc., and individual contributors as indicated
004: * by the @authors tag. See the copyright.txt in the distribution for a
005: * full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jbpm.db;
023:
024: import java.util.HashMap;
025: import java.util.Iterator;
026: import java.util.List;
027: import java.util.Map;
028:
029: import org.apache.commons.logging.Log;
030: import org.apache.commons.logging.LogFactory;
031: import org.hibernate.Query;
032: import org.hibernate.Session;
033: import org.jbpm.JbpmException;
034: import org.jbpm.graph.exe.ProcessInstance;
035: import org.jbpm.graph.exe.Token;
036: import org.jbpm.logging.log.ProcessLog;
037:
038: public class LoggingSession {
039:
040: JbpmSession jbpmSession;
041: Session session;
042:
043: public LoggingSession(JbpmSession jbpmSession) {
044: this .jbpmSession = jbpmSession;
045: this .session = jbpmSession.getSession();
046: }
047:
048: public LoggingSession(Session session) {
049: this .session = session;
050: this .jbpmSession = new JbpmSession(session);
051: }
052:
053: /**
054: * returns a map that maps {@link Token}s to {@link List}s. The lists contain the ordered
055: * logs for the given token. The lists are retrieved with {@link #findLogsByToken(long)}.
056: */
057: public Map findLogsByProcessInstance(long processInstanceId) {
058: Map tokenLogs = new HashMap();
059: try {
060: ProcessInstance processInstance = (ProcessInstance) session
061: .load(ProcessInstance.class, new Long(
062: processInstanceId));
063: collectTokenLogs(tokenLogs, processInstance.getRootToken());
064: } catch (Exception e) {
065: log.error(e);
066: jbpmSession.handleException();
067: throw new JbpmException(
068: "couldn't get logs for process instance '"
069: + processInstanceId + "'", e);
070: }
071: return tokenLogs;
072: }
073:
074: private void collectTokenLogs(Map tokenLogs, Token token) {
075: tokenLogs.put(token, findLogsByToken(token.getId()));
076: Map children = token.getChildren();
077: if ((children != null) && (!children.isEmpty())) {
078: Iterator iter = children.values().iterator();
079: while (iter.hasNext()) {
080: Token child = (Token) iter.next();
081: collectTokenLogs(tokenLogs, child);
082: }
083: }
084: }
085:
086: /**
087: * collects the logs for a given token, ordered by creation time.
088: */
089: public List findLogsByToken(long tokenId) {
090: List result = null;
091: try {
092: Token token = (Token) session.load(Token.class, new Long(
093: tokenId));
094: Query query = session
095: .getNamedQuery("LoggingSession.findLogsByToken");
096: query.setEntity("token", token);
097: result = query.list();
098: } catch (Exception e) {
099: log.error(e);
100: jbpmSession.handleException();
101: throw new JbpmException("couldn't get logs for token '"
102: + tokenId + "'", e);
103: }
104: return result;
105: }
106:
107: /**
108: * saves the given process log to the database.
109: */
110: public void saveProcessLog(ProcessLog processLog) {
111: try {
112: session.save(processLog);
113: } catch (Exception e) {
114: log.error(e);
115: jbpmSession.handleException();
116: throw new JbpmException("couldn't save process log '"
117: + processLog + "'", e);
118: }
119: }
120:
121: /**
122: * load the process log for a given id.
123: */
124: public ProcessLog loadProcessLog(long processLogId) {
125: ProcessLog processLog = null;
126: try {
127: processLog = (ProcessLog) session.load(ProcessLog.class,
128: new Long(processLogId));
129: } catch (Exception e) {
130: log.error(e);
131: jbpmSession.handleException();
132: throw new JbpmException("couldn't load process log '"
133: + processLogId + "'", e);
134: }
135: return processLog;
136: }
137:
138: /**
139: * get the process log for a given id.
140: */
141: public ProcessLog getProcessLog(long processLogId) {
142: ProcessLog processLog = null;
143: try {
144: processLog = (ProcessLog) session.get(ProcessLog.class,
145: new Long(processLogId));
146: } catch (Exception e) {
147: log.error(e);
148: jbpmSession.handleException();
149: throw new JbpmException("couldn't get process log '"
150: + processLogId + "'", e);
151: }
152: return processLog;
153: }
154:
155: private static final Log log = LogFactory
156: .getLog(LoggingSession.class);
157: }
|