KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > compiere > model > MWorkflow


1 /******************************************************************************
2  * The contents of this file are subject to the Compiere License Version 1.1
3  * ("License"); You may not use this file except in compliance with the License
4  * You may obtain a copy of the License at http://www.compiere.org/license.html
5  * Software distributed under the License is distributed on an "AS IS" basis,
6  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
7  * the specific language governing rights and limitations under the License.
8  * The Original Code is Compiere ERP & CRM Business Solution
9  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
10  * Portions created by Jorg Janke are Copyright (C) 1999-2002 Jorg Janke, parts
11  * created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
12  * Contributor(s): ______________________________________.
13  *****************************************************************************/

14 package org.compiere.model;
15
16 import java.util.*;
17 import java.sql.*;
18
19 import org.compiere.util.*;
20
21 /**
22  * WorkFlow
23  *
24  * @author Jorg Janke
25  * @version $Id: MWorkflow.java,v 1.2 2003/07/06 18:39:44 jjanke Exp $
26  */

27 public class MWorkflow extends X_AD_Workflow
28 {
29     /**
30      * Load Workflow
31      * @param ctx Context
32      * @param AD_WorkFlow_ID ID
33      */

34     public MWorkflow (Properties ctx, int AD_WorkFlow_ID)
35     {
36         super(ctx, AD_WorkFlow_ID);
37         if (AD_WorkFlow_ID < 1)
38             throw new IllegalArgumentException JavaDoc ("Cannot create new Workflow");
39         Log.trace(Log.l4_Data, "MWorkflow " + AD_WorkFlow_ID);
40         loadTrl();
41         loadNodes();
42     } // MWorkflow
43

44     /** WF Nodes */
45     private ArrayList m_nodes = new ArrayList();
46     /** Ordered Nodes in Array */
47     private MWFNode[] m_nodeArray = null;
48
49     /** Translated Name */
50     private String JavaDoc m_name_trl = null;
51     /** Translated Description */
52     private String JavaDoc m_description_trl = null;
53     /** Translated Help */
54     private String JavaDoc m_help_trl = null;
55     /** Translation Flag */
56     private boolean m_translated = false;
57
58     /**
59      * Load Translation
60      */

61     private void loadTrl()
62     {
63         if (Env.isBaseLanguage(getCtx(), "AD_Workflow") || getID() == 0)
64             return;
65         String JavaDoc sql = "SELECT Name, Description, Help FROM AD_Workflow_Trl WHERE AD_Workflow_ID=? AND AD_Language=?";
66         try
67         {
68             PreparedStatement pstmt = DB.prepareStatement(sql);
69             pstmt.setInt(1, getID());
70             pstmt.setString(2, Env.getAD_Language(getCtx()));
71             ResultSet rs = pstmt.executeQuery();
72             if (rs.next())
73             {
74                 m_name_trl = rs.getString(1);
75                 m_description_trl = rs.getString(2);
76                 m_help_trl = rs.getString(3);
77                 m_translated = true;
78             }
79             rs.close();
80             pstmt.close();
81         }
82         catch (SQLException e)
83         {
84             Log.error("MWorkflow.loadTrl", e);
85         }
86         Log.trace(Log.l5_DData, "MWorkflow.loadTrl " + m_translated);
87     } // loadTrl
88

89     /**
90      * Load Nodes
91      */

92     private void loadNodes()
93     {
94         String JavaDoc sql = "SELECT * FROM AD_WF_Node WHERE AD_WorkFlow_ID=? AND IsActive='Y'";
95         try
96         {
97             PreparedStatement pstmt = DB.prepareStatement(sql);
98             pstmt.setInt(1, getID());
99             ResultSet rs = pstmt.executeQuery();
100             while (rs.next())
101                 m_nodes.add (new MWFNode (getCtx(), rs));
102             rs.close();
103             pstmt.close();
104         }
105         catch (SQLException e)
106         {
107             Log.error("MWorkflow.loadNodes", e);
108         }
109         Log.trace(Log.l5_DData, "MWorkflow.loadNodes #" + m_nodes.size());
110     } // loadNodes
111

112     /*************************************************************************/
113
114     /**
115      * Get Number of Nodes
116      * @return number of nodes
117      */

118     public int getNodeCount()
119     {
120         return m_nodes.size();
121     } // getNextNodeCount
122

123     /**
124      * Get the nodes
125      * @param ordered ordered array
126      * @return array of nodes
127      */

128     public MWFNode[] getNodes(boolean ordered)
129     {
130         if (ordered)
131             return getNodesInOrder();
132         //
133
MWFNode[] retValue = new MWFNode [m_nodes.size()];
134         m_nodes.toArray(retValue);
135         return retValue;
136     } // getNodes
137

138     /**
139      * Get the first node
140      * @return array of next nodes
141      */

142     public MWFNode getFirstNode()
143     {
144         return getNode (getAD_WF_Node_ID());
145     } // getFirstNode
146

147     /**
148      * Get Node with ID
149      * @param AD_WF_Node_ID ID
150      * @return node or null
151      */

152     private MWFNode getNode (int AD_WF_Node_ID)
153     {
154         for (int i = 0; i < m_nodes.size(); i++)
155         {
156             MWFNode node = (MWFNode)m_nodes.get(i);
157             if (node.getAD_WF_Node_ID() == AD_WF_Node_ID)
158                 return node;
159         }
160         return null;
161     } // getNode
162

163     /**
164      * Get the next nodes
165      * @param AD_WF_Node_ID ID
166      * @return array of next nodes or null
167      */

168     public MWFNode[] getNextNodes (int AD_WF_Node_ID)
169     {
170         MWFNode node = getNode(AD_WF_Node_ID);
171         if (node == null || node.getNextNodeCount() == 0)
172             return null;
173         //
174
MWFNodeNext[] nexts = node.getNextNodes();
175         ArrayList list = new ArrayList();
176         for (int i = 0; i < nexts.length; i++)
177         {
178             MWFNode next = getNode (nexts[i].getAD_WF_Next_ID());
179             if (next != null)
180                 list.add(next);
181         }
182
183         // Return Nodes
184
MWFNode[] retValue = new MWFNode [list.size()];
185         list.toArray(retValue);
186         return retValue;
187     } // getNextNodes
188

189     /**
190      * Get The Nodes in Sequence Order
191      * @return Nodes in sequence
192      */

193     private MWFNode[] getNodesInOrder()
194     {
195         if (m_nodeArray == null)
196         {
197             ArrayList list = new ArrayList();
198             addNode (list, getAD_WF_Node_ID()); // first
199
if (m_nodes.size() != list.size())
200                 Log.error("MWorkflow.getNodesInOrder - sizes different: " + m_nodes.size() + "<->" + list.size());
201             //
202
m_nodeArray = new MWFNode [list.size()];
203             list.toArray(m_nodeArray);
204         }
205         return m_nodeArray;
206     } // getNodesInOrder
207

208     /**
209      * Add Node to Ordered List
210      * @param list lsit tro add to
211      * @param AD_WF_Node_ID node id
212      */

213     private void addNode (ArrayList list, int AD_WF_Node_ID)
214     {
215         MWFNode node = getNode (AD_WF_Node_ID);
216         if (!list.contains(node))
217         {
218             list.add(node);
219             MWFNodeNext[] nexts = node.getNextNodes();
220             for (int i = 0; i < nexts.length; i++)
221                 addNode (list, nexts[i].getAD_WF_Next_ID());
222         }
223     } // addNode
224

225     /*************************************************************************/
226
227     /**
228      * Get (first) Next Node of ID
229      * @param AD_WF_Node_ID id
230      * @return next AD_WF_Node_ID or 0
231      */

232     public int getNext (int AD_WF_Node_ID)
233     {
234         MWFNode[] nodes = getNodesInOrder();
235         for (int i = 0; i < nodes.length; i++)
236         {
237             if (nodes[i].getAD_WF_Node_ID() == AD_WF_Node_ID)
238             {
239                 MWFNodeNext[] nexts = nodes[i].getNextNodes();
240                 if (nexts.length > 0)
241                     return nexts[0].getAD_WF_Next_ID();
242                 return 0;
243             }
244         }
245         return 0;
246     } // getNext
247

248     /**
249      * Get (first) Previous Node of ID
250      * @param AD_WF_Node_ID id
251      * @return next AD_WF_Node_ID or 0
252      */

253     public int getPrevious (int AD_WF_Node_ID)
254     {
255         MWFNode[] nodes = getNodesInOrder();
256         for (int i = 0; i < nodes.length; i++)
257         {
258             if (nodes[i].getAD_WF_Node_ID() == AD_WF_Node_ID)
259             {
260                 if (i > 0)
261                     return nodes[i-1].getAD_WF_Node_ID();
262                 return 0;
263             }
264         }
265         return 0;
266     } // getPrevious
267

268     /**
269      * Get very Last Node
270      * @param AD_WF_Node_ID ignored
271      * @return next AD_WF_Node_ID or 0
272      */

273     public int getLast (int AD_WF_Node_ID)
274     {
275         MWFNode[] nodes = getNodesInOrder();
276         if (nodes.length > 0)
277             return nodes[nodes.length-1].getAD_WF_Node_ID();
278         return 0;
279     } // getLast
280

281     /**
282      * Is this the first Node
283      * @param AD_WF_Node_ID id
284      * @return true if first node
285      */

286     public boolean isFirst (int AD_WF_Node_ID)
287     {
288         return AD_WF_Node_ID == getAD_WF_Node_ID();
289     } // isFirst
290

291     /**
292      * Is this the last Node
293      * @param AD_WF_Node_ID id
294      * @return true if last node
295      */

296     public boolean isLast (int AD_WF_Node_ID)
297     {
298         MWFNode[] nodes = getNodesInOrder();
299         return AD_WF_Node_ID == nodes[nodes.length-1].getAD_WF_Node_ID();
300     } // isLast
301

302     /*************************************************************************/
303
304     /**
305      * Get Name
306      * @param translated translated
307      * @return Name
308      */

309     public String JavaDoc getName(boolean translated)
310     {
311         if (translated && m_translated)
312             return m_name_trl;
313         return getName();
314     } // getName
315

316     /**
317      * Get Description
318      * @param translated translated
319      * @return Description
320      */

321     public String JavaDoc getDescription(boolean translated)
322     {
323         if (translated && m_translated)
324             return m_description_trl;
325         return getDescription();
326     } // getDescription
327

328     /**
329      * Get Help
330      * @param translated translated
331      * @return Name
332      */

333     public String JavaDoc getHelp(boolean translated)
334     {
335         if (translated && m_translated)
336             return m_help_trl;
337         return getHelp();
338     } // getHelp
339

340     /**
341      * Save new or update complete.
342      * To be extended by sub-classes
343      * @param newRecord new record
344      * @param success success
345      * @return true if save complete (if not overwritten true)
346      */

347     protected boolean saveComplete (boolean newRecord, boolean success)
348     {
349         Log.trace(Log.l4_Data, "MWorkflow.saveComplete", "Success=" + success);
350         // save all nodes
351
MWFNode[] nodes = getNodesInOrder();
352         for (int i = 0; i < nodes.length; i++)
353             nodes[i].save();
354         return success;
355     } // saveComplete
356

357 } // MWorkflow_ID
Popular Tags