diff --git a/base/src/org/compiere/wf/MWFActivity.java b/base/src/org/compiere/wf/MWFActivity.java index ff842c7f2a..3f6d349733 100644 --- a/base/src/org/compiere/wf/MWFActivity.java +++ b/base/src/org/compiere/wf/MWFActivity.java @@ -18,7 +18,6 @@ package org.compiere.wf; import java.io.File; import java.math.BigDecimal; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Savepoint; @@ -26,10 +25,12 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.List; import java.util.Properties; import java.util.StringTokenizer; import java.util.logging.Level; +import org.adempiere.exceptions.AdempiereException; import org.compiere.db.CConnection; import org.compiere.interfaces.Server; import org.compiere.model.MAttachment; @@ -49,13 +50,13 @@ import org.compiere.model.MTable; import org.compiere.model.MUser; import org.compiere.model.MUserRoles; import org.compiere.model.PO; +import org.compiere.model.Query; import org.compiere.model.X_AD_WF_Activity; import org.compiere.print.ReportEngine; import org.compiere.process.DocAction; import org.compiere.process.ProcessInfo; import org.compiere.process.StateEngine; import org.compiere.util.CLogger; -import org.compiere.util.DB; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.Msg; @@ -89,31 +90,19 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable */ public static MWFActivity[] get (Properties ctx, int AD_Table_ID, int Record_ID, boolean activeOnly) { - ArrayList list = new ArrayList(); - PreparedStatement pstmt = null; - ResultSet rs = null; - String sql = "SELECT * FROM AD_WF_Activity WHERE AD_Table_ID=? AND Record_ID=?"; + ArrayList params = new ArrayList(); + StringBuffer whereClause = new StringBuffer("AD_Table_ID=? AND Record_ID=?"); + params.add(AD_Table_ID); + params.add(Record_ID); if (activeOnly) - sql += " AND Processed<>'Y'"; - sql += " ORDER BY AD_WF_Activity_ID"; - try { - pstmt = DB.prepareStatement (sql, null); - pstmt.setInt (1, AD_Table_ID); - pstmt.setInt (2, Record_ID); - rs = pstmt.executeQuery (); - while (rs.next ()) - list.add(new MWFActivity (ctx, rs, null)); - } - catch (Exception e) - { - s_log.log(Level.SEVERE, sql, e); - } - finally - { - DB.close(rs, pstmt); - rs = null; pstmt = null; + whereClause.append(" AND Processed<>?"); + params.add(true); } + List list = new Query(ctx, Table_Name, whereClause.toString(), null) + .setParameters(params) + .setOrderBy(COLUMNNAME_AD_WF_Activity_ID) + .list(); MWFActivity[] retValue = new MWFActivity[list.size ()]; list.toArray (retValue); @@ -144,9 +133,6 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable return sb.toString(); } // getActivityInfo - /** Static Logger */ - private static CLogger s_log = CLogger.getCLogger (MWFActivity.class); - /************************************************************************** * Standard Constructor @@ -262,9 +248,12 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable } // getState /** - * Set Activity State - * @param WFState + * Set Activity State. + * It also validates the new state and if is valid, + * then create event audit and call {@link MWFProcess#checkActivities(String, PO)} + * @param WFState */ + @Override public void setWFState (String WFState) { if (m_state == null) @@ -297,6 +286,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable Trace.printStack(); setTextMsg(msg); save(); + // TODO: teo_sarca: throw exception ? please analyze the call hierarchy first } } // setWFState @@ -446,6 +436,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable * (Re)Set to Not Started * @param AD_WF_Node_ID now node */ + @Override public void setAD_WF_Node_ID (int AD_WF_Node_ID) { if (AD_WF_Node_ID == 0) @@ -1088,6 +1079,14 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable } } } + else if(resp.isOrganization()) + { + throw new AdempiereException("Support not implemented for "+resp); + } + else + { + throw new AdempiereException("@NotSupported@ "+resp); + } // end MZ } if (autoApproval @@ -1216,7 +1215,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable DocAction doc = (DocAction)m_po; try { - // Not pproved + // Not approved if (!"Y".equals(value)) { newState = StateEngine.STATE_Aborted; diff --git a/base/src/org/compiere/wf/MWFEventAudit.java b/base/src/org/compiere/wf/MWFEventAudit.java index aeb3fce222..10f6b84644 100644 --- a/base/src/org/compiere/wf/MWFEventAudit.java +++ b/base/src/org/compiere/wf/MWFEventAudit.java @@ -16,15 +16,13 @@ *****************************************************************************/ package org.compiere.wf; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; +import java.util.List; import java.util.Properties; -import java.util.logging.Level; +import org.compiere.model.Query; import org.compiere.model.X_AD_WF_EventAudit; -import org.compiere.util.CLogger; -import org.compiere.util.DB; import org.compiere.util.Env; /** @@ -68,32 +66,18 @@ public class MWFEventAudit extends X_AD_WF_EventAudit */ public static MWFEventAudit[] get (Properties ctx, int AD_WF_Process_ID, int AD_WF_Node_ID, String trxName) { - ArrayList list = new ArrayList(); - String sql = "SELECT * FROM AD_WF_EventAudit " - + "WHERE AD_WF_Process_ID=?"; + ArrayList params = new ArrayList(); + StringBuffer whereClause = new StringBuffer("AD_WF_Process_ID=?"); + params.add(AD_WF_Process_ID); if (AD_WF_Node_ID > 0) - sql += " AND AD_WF_Node_ID=?"; - sql += " ORDER BY AD_WF_EventAudit_ID"; - PreparedStatement pstmt = null; - ResultSet rs = null; - try { - pstmt = DB.prepareStatement (sql, trxName); - pstmt.setInt (1, AD_WF_Process_ID); - if (AD_WF_Node_ID > 0) - pstmt.setInt (2, AD_WF_Node_ID); - rs = pstmt.executeQuery (); - while (rs.next ()) - list.add (new MWFEventAudit (ctx, rs, trxName)); - } - catch (Exception e) - { - s_log.log(Level.SEVERE, "get", e); - } - finally { - DB.close(rs, pstmt); - rs = null; pstmt = null; + whereClause.append(" AND AD_WF_Node_ID=?"); + params.add(AD_WF_Node_ID); } + List list = new Query(ctx, Table_Name, whereClause.toString(), trxName) + .setParameters(params) + .setOrderBy(COLUMNNAME_AD_WF_EventAudit_ID) + .list(); // MWFEventAudit[] retValue = new MWFEventAudit[list.size()]; list.toArray (retValue); @@ -125,10 +109,6 @@ public class MWFEventAudit extends X_AD_WF_EventAudit } // get - /** Static Logger */ - private static CLogger s_log = CLogger.getCLogger (MWFEventAudit.class); - - /************************************************************************** * Standard Constructor * @param ctx context diff --git a/base/src/org/compiere/wf/MWFNode.java b/base/src/org/compiere/wf/MWFNode.java index 804587c0b5..752fb9fc32 100644 --- a/base/src/org/compiere/wf/MWFNode.java +++ b/base/src/org/compiere/wf/MWFNode.java @@ -49,7 +49,7 @@ public class MWFNode extends X_AD_WF_Node /** * */ - private static final long serialVersionUID = -7541139807980623316L; + private static final long serialVersionUID = 4330589837679937718L; /** @@ -533,6 +533,7 @@ public class MWFNode extends X_AD_WF_Node * @param newRecord new * @return true if can be saved */ + @Override protected boolean beforeSave (boolean newRecord) { if(MWorkflow.WORKFLOWTYPE_Manufacturing.equals(getWorkflow().getWorkflowType())) @@ -632,6 +633,7 @@ public class MWFNode extends X_AD_WF_Node * @param success success * @return saved */ + @Override protected boolean afterSave (boolean newRecord, boolean success) { if (!success) @@ -644,6 +646,7 @@ public class MWFNode extends X_AD_WF_Node * @param success success * @return deleted */ + @Override protected boolean afterDelete (boolean success) { return success; diff --git a/base/src/org/compiere/wf/MWFNodeNext.java b/base/src/org/compiere/wf/MWFNodeNext.java index 3d338a7c3a..4d02baa2a6 100644 --- a/base/src/org/compiere/wf/MWFNodeNext.java +++ b/base/src/org/compiere/wf/MWFNodeNext.java @@ -16,16 +16,15 @@ *****************************************************************************/ package org.compiere.wf; -import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.util.ArrayList; +import java.util.List; import java.util.Properties; -import java.util.logging.Level; +import org.compiere.model.MRefList; import org.compiere.model.PO; +import org.compiere.model.Query; import org.compiere.model.X_AD_WF_NodeNext; import org.compiere.process.DocAction; -import org.compiere.util.DB; /** * Workflow Node Next - Transition @@ -128,34 +127,12 @@ public class MWFNodeNext extends X_AD_WF_NodeNext if (!requery && m_conditions != null) return m_conditions; // - ArrayList list = new ArrayList(); - String sql = "SELECT * FROM AD_WF_NextCondition WHERE AD_WF_NodeNext_ID=? AND IsActive='Y' ORDER BY SeqNo"; - PreparedStatement pstmt = null; - try - { - pstmt = DB.prepareStatement (sql, get_TrxName()); - pstmt.setInt (1, getAD_WF_NodeNext_ID()); - ResultSet rs = pstmt.executeQuery (); - while (rs.next ()) - list.add(new MWFNextCondition(getCtx(), rs, get_TrxName())); - rs.close (); - pstmt.close (); - pstmt = null; - } - catch (Exception e) - { - log.log(Level.SEVERE, sql, e); - } - try - { - if (pstmt != null) - pstmt.close (); - pstmt = null; - } - catch (Exception e) - { - pstmt = null; - } + final String whereClause = MWFNextCondition.COLUMNNAME_AD_WF_NodeNext_ID+"=?"; + List list = new Query(getCtx(), MWFNextCondition.Table_Name, whereClause, get_TrxName()) + .setParameters(new Object[]{getAD_WF_NodeNext_ID()}) + .setOnlyActiveRecords(true) + .setOrderBy(MWFNextCondition.COLUMNNAME_SeqNo) + .list(); m_conditions = new MWFNextCondition[list.size()]; list.toArray (m_conditions); return m_conditions; diff --git a/base/src/org/compiere/wf/MWFNodePara.java b/base/src/org/compiere/wf/MWFNodePara.java index 24137b6a58..6ce96acd56 100644 --- a/base/src/org/compiere/wf/MWFNodePara.java +++ b/base/src/org/compiere/wf/MWFNodePara.java @@ -16,16 +16,13 @@ *****************************************************************************/ package org.compiere.wf; -import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.util.ArrayList; +import java.util.List; import java.util.Properties; -import java.util.logging.Level; import org.compiere.model.MProcessPara; +import org.compiere.model.Query; import org.compiere.model.X_AD_WF_Node_Para; -import org.compiere.util.CLogger; -import org.compiere.util.DB; /** @@ -50,43 +47,15 @@ public class MWFNodePara extends X_AD_WF_Node_Para */ public static MWFNodePara[] getParameters (Properties ctx, int AD_WF_Node_ID) { - ArrayList list = new ArrayList(); - String sql = "SELECT * FROM AD_WF_Node_Para " - + "WHERE AD_WF_Node_ID=?"; - PreparedStatement pstmt = null; - try - { - pstmt = DB.prepareStatement (sql, null); - pstmt.setInt (1, AD_WF_Node_ID); - ResultSet rs = pstmt.executeQuery (); - while (rs.next ()) - list.add(new MWFNodePara (ctx, rs, null)); - rs.close (); - pstmt.close (); - pstmt = null; - } - catch (Exception e) - { - s_log.log(Level.SEVERE, "getParameters", e); - } - try - { - if (pstmt != null) - pstmt.close (); - pstmt = null; - } - catch (Exception e) - { - pstmt = null; - } + + List list = new Query(ctx, Table_Name, "AD_WF_Node_ID=?", null) + .setParameters(new Object[]{AD_WF_Node_ID}) + .list(); MWFNodePara[] retValue = new MWFNodePara[list.size ()]; list.toArray (retValue); return retValue; } // getParameters - /** Static Logger */ - private static CLogger s_log = CLogger.getCLogger (MWFNodePara.class); - /************************************************************************** * Standard Constructor diff --git a/base/src/org/compiere/wf/MWFProcess.java b/base/src/org/compiere/wf/MWFProcess.java index 4f76453261..0f9f9ac637 100644 --- a/base/src/org/compiere/wf/MWFProcess.java +++ b/base/src/org/compiere/wf/MWFProcess.java @@ -16,15 +16,16 @@ *****************************************************************************/ package org.compiere.wf; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; +import java.util.List; import java.util.Properties; import java.util.logging.Level; import org.compiere.model.MRole; import org.compiere.model.MTable; import org.compiere.model.PO; +import org.compiere.model.Query; import org.compiere.model.X_AD_WF_Process; import org.compiere.process.DocAction; import org.compiere.process.ProcessInfo; @@ -167,30 +168,17 @@ public class MWFProcess extends X_AD_WF_Process if (!requery && m_activities != null) return m_activities; // - ArrayList list = new ArrayList(); - PreparedStatement pstmt = null; - ResultSet rs = null; - String sql = "SELECT * FROM AD_WF_Activity WHERE AD_WF_Process_ID=?"; + ArrayList params = new ArrayList(); + StringBuffer whereClause = new StringBuffer("AD_WF_Process_ID=?"); + params.add(getAD_WF_Process_ID()); if (onlyActive) - sql += " AND Processed='N'"; - try { - pstmt = DB.prepareStatement (sql, trxName); - pstmt.setInt (1, getAD_WF_Process_ID()); - rs = pstmt.executeQuery (); - while (rs.next ()) - list.add (new MWFActivity(getCtx(), rs, trxName)); - } - catch (Exception e) - { - log.log(Level.SEVERE, sql, e); + whereClause.append(" AND Processed=?"); + params.add(false); } - finally - { - DB.close(rs, pstmt); - rs = null; pstmt = null; - } - + List list = new Query(getCtx(), MWFActivity.Table_Name, whereClause.toString(), trxName) + .setParameters(params) + .list(); m_activities = new MWFActivity[list.size ()]; list.toArray (m_activities); return m_activities; @@ -392,7 +380,7 @@ public class MWFProcess extends X_AD_WF_Process */ public void setAD_WF_Responsible_ID () { - int AD_WF_Responsible_ID = DB.getSQLValue(null, + int AD_WF_Responsible_ID = DB.getSQLValueEx(null, MRole.getDefault(getCtx(), false).addAccessSQL( "SELECT AD_WF_Responsible_ID FROM AD_WF_Responsible " + "WHERE ResponsibleType='H' AND COALESCE(AD_User_ID,0)=0 " diff --git a/base/src/org/compiere/wf/MWorkflow.java b/base/src/org/compiere/wf/MWorkflow.java index 03bcb41d21..fd67c84085 100644 --- a/base/src/org/compiere/wf/MWorkflow.java +++ b/base/src/org/compiere/wf/MWorkflow.java @@ -482,7 +482,7 @@ public class MWorkflow extends X_AD_Workflow } return null; } // getNext - + /** * Get (first) Previous Node of ID * @param AD_WF_Node_ID id @@ -936,7 +936,7 @@ public class MWorkflow extends X_AD_Workflow int AD_Client_ID = Env.getAD_Client_ID(product.getCtx()); String sql = "SELECT AD_Workflow_ID FROM AD_Workflow " +" WHERE Value = ? AND AD_Client_ID = ?"; - return DB.getSQLValue(null, sql, product.getValue(), AD_Client_ID); + return DB.getSQLValueEx(null, sql, product.getValue(), AD_Client_ID); } /** diff --git a/base/src/org/compiere/wf/MWorkflowProcessor.java b/base/src/org/compiere/wf/MWorkflowProcessor.java index 33cecc3a8d..c3e6cff50e 100644 --- a/base/src/org/compiere/wf/MWorkflowProcessor.java +++ b/base/src/org/compiere/wf/MWorkflowProcessor.java @@ -16,17 +16,15 @@ *****************************************************************************/ package org.compiere.wf; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; -import java.util.ArrayList; +import java.util.List; import java.util.Properties; -import java.util.logging.Level; import org.compiere.model.AdempiereProcessor; import org.compiere.model.AdempiereProcessorLog; +import org.compiere.model.Query; import org.compiere.model.X_AD_WorkflowProcessor; -import org.compiere.util.CLogger; import org.compiere.util.DB; @@ -52,37 +50,15 @@ public class MWorkflowProcessor extends X_AD_WorkflowProcessor */ public static MWorkflowProcessor[] getActive (Properties ctx) { - ArrayList list = new ArrayList(); - String sql = "SELECT * FROM AD_WorkflowProcessor WHERE IsActive='Y'"; - PreparedStatement pstmt = null; - ResultSet rs = null; - try - { - pstmt = DB.prepareStatement (sql, null); - rs = pstmt.executeQuery (); - while (rs.next ()) - list.add (new MWorkflowProcessor (ctx, rs, null)); - } - catch (Exception e) - { - s_log.log(Level.SEVERE, sql, e); - } - finally - { - DB.close(rs, pstmt); - rs = null; pstmt = null; - } - + List list = new Query(ctx, Table_Name, null, null) + .setOnlyActiveRecords(true) + .list(); MWorkflowProcessor[] retValue = new MWorkflowProcessor[list.size ()]; list.toArray (retValue); return retValue; } // getActive - /** Static Logger */ - private static CLogger s_log = CLogger.getCLogger (MWorkflowProcessor.class); - - /************************************************************************** * Standard Constructor * @param ctx context @@ -132,31 +108,10 @@ public class MWorkflowProcessor extends X_AD_WorkflowProcessor */ public AdempiereProcessorLog[] getLogs () { - ArrayList list = new ArrayList(); - String sql = "SELECT * " - + "FROM AD_WorkflowProcessorLog " - + "WHERE AD_WorkflowProcessor_ID=? " - + "ORDER BY Created DESC"; - PreparedStatement pstmt = null; - ResultSet rs = null; - try - { - pstmt = DB.prepareStatement (sql, get_TrxName()); - pstmt.setInt (1, getAD_WorkflowProcessor_ID()); - rs = pstmt.executeQuery (); - while (rs.next ()) - list.add (new MWorkflowProcessorLog (getCtx(), rs, get_TrxName())); - } - catch (Exception e) - { - log.log(Level.SEVERE, sql, e); - } - finally - { - DB.close(rs, pstmt); - rs = null; pstmt = null; - } - + List list = new Query(getCtx(), MWorkflowProcessorLog.Table_Name, "AD_WorkflowProcessor_ID=?", get_TrxName()) + .setParameters(new Object[]{getAD_WorkflowProcessor_ID()}) + .setOrderBy("Created DESC") + .list(); MWorkflowProcessorLog[] retValue = new MWorkflowProcessorLog[list.size ()]; list.toArray (retValue); return retValue; diff --git a/base/src/org/compiere/wf/WFProcessManage.java b/base/src/org/compiere/wf/WFProcessManage.java index 01ce1081c1..346b9177fd 100644 --- a/base/src/org/compiere/wf/WFProcessManage.java +++ b/base/src/org/compiere/wf/WFProcessManage.java @@ -107,7 +107,7 @@ public class WFProcessManage extends SvrProcess msg += " - " + msg1; } // - process.save(); + process.saveEx(); return "OK"; } // doIt diff --git a/extend/src/test/functional/WorkflowTest.java b/extend/src/test/functional/WorkflowTest.java new file mode 100644 index 0000000000..d050bde38b --- /dev/null +++ b/extend/src/test/functional/WorkflowTest.java @@ -0,0 +1,97 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 2008 SC ARHIPAC SERVICE SRL. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package test.functional; + +import org.compiere.model.MRequisition; +import org.compiere.model.Query; +import org.compiere.util.Env; +import org.compiere.wf.MWFActivity; +import org.compiere.wf.MWFEventAudit; +import org.compiere.wf.MWFNode; +import org.compiere.wf.MWFNodeNext; +import org.compiere.wf.MWFNodePara; +import org.compiere.wf.MWFProcess; +import org.compiere.wf.MWorkflow; +import org.compiere.wf.MWorkflowProcessor; + +import test.AdempiereTestCase; + +/** + * Test Workflow related classes + * @author Teo Sarca, www.arhipac.ro + */ +public class WorkflowTest extends AdempiereTestCase +{ + + @Override + protected void setUp() throws Exception + { + super.setUp(); + assertEquals("Client is not GardenWorld", 11, Env.getAD_Client_ID(getCtx())); + } + + public void testQuery() throws Exception + { + // + // Check MWFActivity + int AD_Table_ID = MRequisition.Table_ID; + int Record_ID = 1; // dummy; + MWFActivity.get(getCtx(), AD_Table_ID, Record_ID, false); + MWFActivity.get(getCtx(), AD_Table_ID, Record_ID, true); + // + // Check MWFEventAudit + int AD_WF_Process_ID = 1; // dummy + int AD_WF_Node_ID = 1; // dummy + MWFEventAudit.get(getCtx(), AD_WF_Process_ID, AD_WF_Node_ID, getTrxName()); + MWFEventAudit.get(getCtx(), AD_WF_Process_ID, getTrxName()); + // + // Check MWFProcess + MWFProcess proc = new Query(getCtx(), MWFProcess.Table_Name, null, getTrxName()) + .setClient_ID() + .setOrderBy(MWFProcess.COLUMNNAME_AD_WF_Process_ID) + .first(); + if (proc != null) + { + proc.getActivities(true, false, getTrxName()); + proc.getActivities(true, true, getTrxName()); + } + else + { + // TODO: check MWFProcess - need better test + } + // + // Check MWorkflow, MWFNode, MWFNodeNext etc + int AD_Client_ID = getAD_Client_ID(); + int AD_Workflow_ID = 115; // Process_Requisition + MWorkflow wf = MWorkflow.get(getCtx(), AD_Workflow_ID); + for (MWFNode node : wf.getNodes(false, AD_Client_ID)) + { + MWFNodePara.getParameters(node.getCtx(), node.getAD_WF_Node_ID()); + + for (MWFNodeNext next : node.getTransitions(AD_Client_ID)) + { + next.getConditions(true); + next.getConditions(false); + } + } + // + // Check MWorkflowProcessor + for (MWorkflowProcessor processor : MWorkflowProcessor.getActive(getCtx())) + { + processor.getLogs(); + } + // + // + } +}