1 14 package org.compiere.model; 15 16 import java.util.*; 17 import java.sql.*; 18 19 import org.compiere.util.*; 20 21 27 public class MWorkflow extends X_AD_Workflow 28 { 29 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 ("Cannot create new Workflow"); 39 Log.trace(Log.l4_Data, "MWorkflow " + AD_WorkFlow_ID); 40 loadTrl(); 41 loadNodes(); 42 } 44 45 private ArrayList m_nodes = new ArrayList(); 46 47 private MWFNode[] m_nodeArray = null; 48 49 50 private String m_name_trl = null; 51 52 private String m_description_trl = null; 53 54 private String m_help_trl = null; 55 56 private boolean m_translated = false; 57 58 61 private void loadTrl() 62 { 63 if (Env.isBaseLanguage(getCtx(), "AD_Workflow") || getID() == 0) 64 return; 65 String 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 } 89 92 private void loadNodes() 93 { 94 String 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 } 112 113 114 118 public int getNodeCount() 119 { 120 return m_nodes.size(); 121 } 123 128 public MWFNode[] getNodes(boolean ordered) 129 { 130 if (ordered) 131 return getNodesInOrder(); 132 MWFNode[] retValue = new MWFNode [m_nodes.size()]; 134 m_nodes.toArray(retValue); 135 return retValue; 136 } 138 142 public MWFNode getFirstNode() 143 { 144 return getNode (getAD_WF_Node_ID()); 145 } 147 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 } 163 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 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 MWFNode[] retValue = new MWFNode [list.size()]; 185 list.toArray(retValue); 186 return retValue; 187 } 189 193 private MWFNode[] getNodesInOrder() 194 { 195 if (m_nodeArray == null) 196 { 197 ArrayList list = new ArrayList(); 198 addNode (list, getAD_WF_Node_ID()); if (m_nodes.size() != list.size()) 200 Log.error("MWorkflow.getNodesInOrder - sizes different: " + m_nodes.size() + "<->" + list.size()); 201 m_nodeArray = new MWFNode [list.size()]; 203 list.toArray(m_nodeArray); 204 } 205 return m_nodeArray; 206 } 208 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 } 225 226 227 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 } 248 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 } 268 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 } 281 286 public boolean isFirst (int AD_WF_Node_ID) 287 { 288 return AD_WF_Node_ID == getAD_WF_Node_ID(); 289 } 291 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 } 302 303 304 309 public String getName(boolean translated) 310 { 311 if (translated && m_translated) 312 return m_name_trl; 313 return getName(); 314 } 316 321 public String getDescription(boolean translated) 322 { 323 if (translated && m_translated) 324 return m_description_trl; 325 return getDescription(); 326 } 328 333 public String getHelp(boolean translated) 334 { 335 if (translated && m_translated) 336 return m_help_trl; 337 return getHelp(); 338 } 340 347 protected boolean saveComplete (boolean newRecord, boolean success) 348 { 349 Log.trace(Log.l4_Data, "MWorkflow.saveComplete", "Success=" + success); 350 MWFNode[] nodes = getNodesInOrder(); 352 for (int i = 0; i < nodes.length; i++) 353 nodes[i].save(); 354 return success; 355 } 357 } | Popular Tags |