📄 mwfactivity.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.wf;
import java.io.*;
import java.math.*;
import java.rmi.*;
import java.sql.*;
import java.text.*;
import java.util.*;
import java.util.logging.*;
import org.compiere.db.*;
import org.compiere.interfaces.*;
import org.compiere.model.*;
import org.compiere.print.*;
import org.compiere.process.*;
import org.compiere.util.*;
/**
* Workflow Activity Model.
* Controlled by WF Process:
* set Node - startWork
*
* @author Jorg Janke
* @version $Id: MWFActivity.java,v 1.51 2006/02/09 01:02:57 jjanke Exp $
*/
public class MWFActivity extends X_AD_WF_Activity implements Runnable
{
/**
* Get Activities for table/tecord
* @param ctx context
* @param AD_Table_ID table
* @param Record_ID record
* @param activeOnly if true only not processed records are returned
* @return activity
*/
public static MWFActivity[] get (Properties ctx, int AD_Table_ID, int Record_ID, boolean activeOnly)
{
ArrayList<MWFActivity> list = new ArrayList<MWFActivity>();
PreparedStatement pstmt = null;
String sql = "SELECT * FROM AD_WF_Activity WHERE AD_Table_ID=? AND 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);
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
list.add(new MWFActivity (ctx, rs, null));
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
MWFActivity[] retValue = new MWFActivity[list.size ()];
list.toArray (retValue);
return retValue;
} // get
/**
* Get Active Info
* @param ctx context
* @param AD_Table_ID table
* @param Record_ID record
* @return activity summary
*/
public static String getActiveInfo (Properties ctx, int AD_Table_ID, int Record_ID)
{
MWFActivity[] acts = get (ctx, AD_Table_ID, Record_ID, true);
if (acts == null || acts.length == 0)
return null;
//
StringBuffer sb = new StringBuffer();
for (int i = 0; i < acts.length; i++)
{
if (i > 0)
sb.append("\n");
MWFActivity activity = acts[i];
sb.append(activity.toStringX());
}
return sb.toString();
} // getActivityInfo
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MWFActivity.class);
/**************************************************************************
* Standard Constructor
* @param ctx context
* @param AD_WF_Activity_ID id
*/
public MWFActivity (Properties ctx, int AD_WF_Activity_ID, String trxName)
{
super (ctx, AD_WF_Activity_ID, trxName);
if (AD_WF_Activity_ID == 0)
throw new IllegalArgumentException ("Cannot create new WF Activity directly");
m_state = new StateEngine (getWFState());
} // MWFActivity
/**
* Load Constructor
* @param ctx context
* @param rs result set
*/
public MWFActivity (Properties ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
m_state = new StateEngine (getWFState());
} // MWFActivity
/**
* Parent Contructor
* @param process process
* @param AD_WF_Node_ID start node
*/
public MWFActivity (MWFProcess process, int AD_WF_Node_ID)
{
super (process.getCtx(), 0, process.get_TrxName());
setAD_WF_Process_ID (process.getAD_WF_Process_ID());
setPriority(process.getPriority());
// Document Link
setAD_Table_ID(process.getAD_Table_ID());
setRecord_ID(process.getRecord_ID());
// Status
super.setWFState(WFSTATE_NotStarted);
m_state = new StateEngine (getWFState());
setProcessed (false);
// Set Workflow Node
setAD_Workflow_ID (process.getAD_Workflow_ID());
setAD_WF_Node_ID (AD_WF_Node_ID);
// Node Priority & End Duration
MWFNode node = MWFNode.get(getCtx(), AD_WF_Node_ID);
int priority = node.getPriority();
if (priority != 0 && priority != getPriority())
setPriority (priority);
long limitMS = node.getLimitMS();
if (limitMS != 0)
setEndWaitTime(new Timestamp(limitMS + System.currentTimeMillis()));
// Responsible
setResponsible(process);
save();
//
m_audit = new MWFEventAudit(this);
m_audit.save();
//
m_process = process;
} // MWFActivity
/** State Machine */
private StateEngine m_state = null;
/** Workflow Node */
private MWFNode m_node = null;
/** Audit */
private MWFEventAudit m_audit = null;
/** Persistent Object */
private PO m_po = null;
/** New Value to save in audit */
private String m_newValue = null;
/** Process */
private MWFProcess m_process = null;
/** Post Immediate Candidate */
private DocAction m_postImmediate = null;
/** List of email recipients */
private ArrayList<String> m_emails = new ArrayList<String>();
/**************************************************************************
* Get State
* @return state
*/
public StateEngine getState()
{
return m_state;
} // getState
/**
* Set Activity State
* @param WFState
*/
public void setWFState (String WFState)
{
if (m_state == null)
m_state = new StateEngine (getWFState());
if (m_state.isClosed())
return;
if (getWFState().equals(WFState))
return;
//
if (m_state.isValidNewState(WFState))
{
String oldState = getWFState();
log.fine(oldState + "->"+ WFState + ", Msg=" + getTextMsg());
super.setWFState (WFState);
m_state = new StateEngine (getWFState());
save(); // closed in MWFProcess.checkActivities()
updateEventAudit();
// Inform Process
if (m_process == null)
m_process = new MWFProcess (getCtx(), getAD_WF_Process_ID(), null);
m_process.checkActivities();
}
else
{
String msg = "Set WFState - Ignored Invalid Transformation - New="
+ WFState + ", Current=" + getWFState();
log.log(Level.SEVERE, msg);
Trace.printStack();
setTextMsg(msg);
save();
}
} // setWFState
/**
* Is Activity closed
*/
public boolean isClosed()
{
return m_state.isClosed();
} // isClosed
/**************************************************************************
* Update Event Audit
*/
private void updateEventAudit()
{
// log.fine("updateEventAudit");
getEventAudit();
m_audit.setTextMsg(getTextMsg());
m_audit.setWFState(getWFState());
if (m_newValue != null)
m_audit.setNewValue(m_newValue);
if (m_state.isClosed())
{
m_audit.setEventType(MWFEventAudit.EVENTTYPE_ProcessCompleted);
long ms = System.currentTimeMillis() - m_audit.getCreated().getTime();
m_audit.setElapsedTimeMS(new BigDecimal(ms));
}
else
m_audit.setEventType(MWFEventAudit.EVENTTYPE_StateChanged);
m_audit.save();
} // updateEventAudit
/**
* Get/Create Event Audit
* @return event
*/
public MWFEventAudit getEventAudit()
{
if (m_audit != null)
return m_audit;
MWFEventAudit[] events = MWFEventAudit.get(getCtx(), getAD_WF_Process_ID(), getAD_WF_Node_ID());
if (events == null || events.length == 0)
m_audit = new MWFEventAudit(this);
else
m_audit = events[events.length-1]; // last event
return m_audit;
} // getEventAudit
/**************************************************************************
* Get Persistent Object in Transaction
* @return po
*/
public PO getPO(Trx trx)
{
if (m_po != null)
return m_po;
M_Table table = M_Table.get (getCtx(), getAD_Table_ID());
if (trx != null)
m_po = table.getPO(getRecord_ID(), trx.getTrxName());
else
m_po = table.getPO(getRecord_ID(), null);
return m_po;
} // getPO
/**
* Get Persistent Object
* @return po
*/
public PO getPO()
{
return getPO(null);
} // getPO
/**
* Get PO AD_Client_ID
* @return client of PO
*/
public int getPO_AD_Client_ID()
{
if (m_po == null)
getPO(null);
if (m_po != null)
return m_po.getAD_Client_ID();
return 0;
} // getPO_AD_Client_ID
/**
* Get Attribute Value (based on Node) of PO
* @return Attribute Value or null
*/
public Object getAttributeValue()
{
MWFNode node = getNode();
if (node == null)
return null;
int AD_Column_ID = node.getAD_Column_ID();
if (AD_Column_ID == 0)
return null;
PO po = getPO();
if (po.get_ID() == 0)
return null;
return po.get_ValueOfColumn(AD_Column_ID);
} // getAttributeValue
/**
* Is SO Trx
* @return SO Trx or of not found true
*/
public boolean isSOTrx()
{
PO po = getPO();
if (po.get_ID() == 0)
return true;
// Is there a Column?
int index = po.get_ColumnIndex("IsSOTrx");
if (index < 0)
{
if (po.get_TableName().startsWith("M_"))
return false;
return true;
}
// we have a column
try
{
Boolean IsSOTrx = (Boolean)po.get_Value(index);
return IsSOTrx.booleanValue();
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
}
return true;
} // isSOTrx
/**************************************************************************
* Set AD_WF_Node_ID.
* (Re)Set to Not Started
* @param AD_WF_Node_ID now node
*/
public void setAD_WF_Node_ID (int AD_WF_Node_ID)
{
if (AD_WF_Node_ID == 0)
throw new IllegalArgumentException("Workflow Node is not defined");
super.setAD_WF_Node_ID (AD_WF_Node_ID);
//
if (!WFSTATE_NotStarted.equals(getWFState()))
{
super.setWFState(WFSTATE_NotStarted);
m_state = new StateEngine (getWFState());
}
if (isProcessed())
setProcessed (false);
} // setAD_WF_Node_ID
/**
* Get WF Node
* @return node
*/
public MWFNode getNode()
{
if (m_node == null)
m_node = MWFNode.get (getCtx(), getAD_WF_Node_ID());
return m_node;
} // getNode
/**
* Get WF Node Name
* @return translated node name
*/
public String getNodeName()
{
return getNode().getName(true);
} // getNodeName
/**
* Get Node Description
* @return translated node description
*/
public String getNodeDescription()
{
return getNode().getDescription(true);
} // getNodeDescription
/**
* Get Node Help
* @return translated node help
*/
public String getNodeHelp()
{
return getNode().getHelp(true);
} // getNodeHelp
/**
* Is this an user Approval step?
* @return true if User Approval
*/
public boolean isUserApproval()
{
return getNode().isUserApproval();
} // isNodeApproval
/**
* Is this a Manual user step?
* @return true if Window/Form/..
*/
public boolean isUserManual()
{
return getNode().isUserManual();
} // isUserManual
/**
* Is this a user choice step?
* @return true if User Choice
*/
public boolean isUserChoice()
{
return getNode().isUserChoice();
} // isUserChoice
/**
* Set Text Msg (add to existing)
* @param TextMsg
*/
public void setTextMsg (String TextMsg)
{
if (TextMsg == null || TextMsg.length() == 0)
return;
String oldText = getTextMsg();
if (oldText == null || oldText.length() == 0)
super.setTextMsg (Util.trimSize(TextMsg,1000));
else if (TextMsg != null && TextMsg.length() > 0)
super.setTextMsg (Util.trimSize(oldText + "\n - " + TextMsg,1000));
} // setTextMsg
/**
* Add to Text Msg
* @param obj some object
*/
public void addTextMsg (Object obj)
{
if (obj == null)
return;
//
StringBuffer TextMsg = new StringBuffer (obj.toString());
if (obj instanceof Exception)
{
Exception ex = (Exception)obj;
while (ex != null)
{
StackTraceElement[] st = ex.getStackTrace();
for (int i = 0; i < st.length; i++)
{
StackTraceElement ste = st[i];
if (i == 0 || ste.getClassName().startsWith("org.compiere"))
TextMsg.append(" (").append(i).append("): ")
.append(ste.toString())
.append("\n");
}
if (ex.getCause() instanceof Exception)
ex = (Exception)ex.getCause();
else
ex = null;
}
}
//
String oldText = getTextMsg();
if (oldText == null || oldText.length() == 0)
super.setTextMsg(Util.trimSize(TextMsg.toString(),1000));
else if (TextMsg != null && TextMsg.length() > 0)
super.setTextMsg(Util.trimSize(oldText + "\n - " + TextMsg.toString(),1000));
} // setTextMsg
/**
* Get WF State text
* @return state text
*/
public String getWFStateText ()
{
return MRefList.getListName(getCtx(), WFSTATE_AD_Reference_ID, getWFState());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -