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: ThreadInfo.java,v 1.2 2007/05/25 11:04:35 drmlipp Exp $
021: *
022: * $Log: ThreadInfo.java,v $
023: * Revision 1.2 2007/05/25 11:04:35 drmlipp
024: * Old threadInfo resurrected for backward compatibility.
025: *
026: * Revision 1.1 2007/05/03 21:58:20 mlipp
027: * Internal refactoring for making better use of local EJBs.
028: *
029: */
030: package de.danet.an.workflow.internalapi;
031:
032: import java.io.Serializable;
033:
034: import java.util.Collection;
035: import java.util.HashMap;
036: import java.util.HashSet;
037: import java.util.Iterator;
038: import java.util.Map;
039: import java.util.Set;
040:
041: /**
042: * This class provides information about the predecessors of an
043: * activity, i.e. about the execution thread.
044: *
045: * @author <a href="mailto:lipp@danet.de"></a>
046: * @version $Revision: 1.2 $
047: */
048:
049: public class ThreadInfo implements Serializable {
050:
051: /** Serial version UID. */
052: private static final long serialVersionUID = 8225837740462510970L;
053:
054: private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
055: .getLog(ThreadInfo.class);
056:
057: private Map preMap;
058: private Set preSet;
059:
060: /**
061: * Creates an instance of <code>ThreadInfo</code> that includes
062: * the given predecessor activities.
063: * @param predecessors the collection of {@link
064: * de.danet.an.workflow.localapi.ActivityLocal <code>Activities</code>} that
065: * are to be registered as predecessors (my be <code>null</code>).
066: */
067: public ThreadInfo(Collection predecessors) {
068: preMap = new HashMap();
069: preSet = new HashSet();
070: if (predecessors == null) {
071: return;
072: }
073: for (Iterator i = predecessors.iterator(); i.hasNext();) {
074: ExtActivityLocal preAct = (ExtActivityLocal) i.next();
075: String preKey = preAct.key();
076: preSet.add(preKey);
077: if (!preMap.containsKey(preKey)) {
078: preMap.put(preKey, new HashSet());
079: }
080: ((Set) preMap.get(preKey)).add(preKey);
081: for (Iterator j = preAct.threadInfo().allPredecessors()
082: .iterator(); j.hasNext();) {
083: String transKey = (String) j.next();
084: if (!preMap.containsKey(transKey)) {
085: preMap.put(transKey, new HashSet());
086: }
087: ((Set) preMap.get(transKey)).add(preKey);
088: }
089: }
090: }
091:
092: /**
093: * This constructor is solemnly used by
094: * {@link de.danet.an.workflow.apix.ThreadInfo <code>apix.ThreadInfo</code>}
095: * to provide backward compatibility.
096: *
097: * @param preMap
098: * @param preSet
099: */
100: public ThreadInfo(Map preMap, Set preSet) {
101: this .preMap = preMap;
102: this .preSet = preSet;
103: }
104:
105: /**
106: * Returns the keys of all predecessor activities.
107: * @return the keys.
108: */
109: public Set allPredecessors() {
110: return preMap.keySet();
111: }
112:
113: /**
114: * Returns the keys of all immediate predecessor activities.
115: * @return the keys.
116: */
117: public Set predecessors() {
118: return preSet;
119: }
120:
121: /**
122: * Returns the keys of all immediate predecessors that are
123: * successors of the given activity.
124: * @param origin the activity we are heading back to.
125: * @return the keys.
126: */
127: public Set predecessorsFor(String origin) {
128: return (Set) preMap.get(origin);
129: }
130:
131: /**
132: * Verifies if the given key is among the predecessors.
133: * @param key the activity to be looked for.
134: * @return <code>true</code> if the given key is among the
135: * predecessors.
136: */
137: public boolean includes(String key) {
138: return preMap.keySet().contains(key);
139: }
140:
141: /**
142: * Return string representation for debugging purposes.
143: * @return a string representation.
144: */
145: public String toString() {
146: String s = "ThreadInfo[";
147: boolean first = true;
148: for (Iterator i = preMap.keySet().iterator(); i.hasNext();) {
149: String pre = (String) i.next();
150: if (!first) {
151: s += ",";
152: }
153: first = false;
154: s += (pre + "->(");
155: boolean first2 = true;
156: for (Iterator j = ((Set) preMap.get(pre)).iterator(); j
157: .hasNext();) {
158: String p = (String) j.next();
159: if (!first2) {
160: s += ",";
161: }
162: first2 = false;
163: s += p;
164: }
165: s += ")";
166: }
167: s += "]";
168: return s;
169: }
170:
171: }
|