From 84bcf74e36e57c7814f220bd11be7ded3be02330 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Wed, 7 Jul 2010 18:33:42 +0800 Subject: [PATCH] print stack trace when lookup of model validation class failed --- .../compiere/model/ModelValidationEngine.java | 169 +++++++++--------- 1 file changed, 83 insertions(+), 86 deletions(-) diff --git a/base/src/org/compiere/model/ModelValidationEngine.java b/base/src/org/compiere/model/ModelValidationEngine.java index eb03c4be62..79d0b75676 100644 --- a/base/src/org/compiere/model/ModelValidationEngine.java +++ b/base/src/org/compiere/model/ModelValidationEngine.java @@ -35,10 +35,10 @@ import org.compiere.util.KeyNamePair; /** * Model Validation Engine - * + * * @author Jorg Janke * @version $Id: ModelValidationEngine.java,v 1.2 2006/07/30 00:58:38 jjanke Exp $ - * + * * @author Teo Sarca, SC ARHIPAC SERVICE SRL *
  • FR [ 1670025 ] ModelValidator.afterLoadPreferences will be useful *
  • BF [ 1679692 ] fireDocValidate doesn't treat exceptions as errors @@ -50,9 +50,9 @@ import org.compiere.util.KeyNamePair; *
  • BF [ 2819617 ] NPE if script validator rule returns null * https://sourceforge.net/tracker/?func=detail&aid=2819617&group_id=176962&atid=879332 * @author victor.perez@e-evolution.com, www.e-evolution.com - *
  • BF [ 2947607 ] Model Validator Engine duplicate listeners + *
  • BF [ 2947607 ] Model Validator Engine duplicate listeners */ -public class ModelValidationEngine +public class ModelValidationEngine { /** @@ -65,13 +65,13 @@ public class ModelValidationEngine s_engine = new ModelValidationEngine(); return s_engine; } // get - + /** Engine Singleton */ private static ModelValidationEngine s_engine = null; /* flag to indicate a missing model validation class */ - private static String missingModelValidationMessage = null; - - + private static String missingModelValidationMessage = null; + + /************************************************************************** * Constructor. * Creates Model Validators @@ -80,7 +80,7 @@ public class ModelValidationEngine { super (); // Load global validators - + MTable table = MTable.get(Env.getCtx(), X_AD_ModelValidator.Table_ID); Query query = table.createQuery("IsActive='Y'", null); query.setOrderBy("SeqNo"); @@ -96,14 +96,13 @@ public class ModelValidationEngine } catch (Exception e) { //logging to db will try to init ModelValidationEngine again! - //log.warning(e.getLocalizedMessage()); - // System.err.println(e.getLocalizedMessage()); + e.printStackTrace(); missingModelValidationMessage = missingModelValidationMessage + e.toString() + " global" + '\n'; } - - // Go through all Clients and start Validators + + // Go through all Clients and start Validators MClient[] clients = MClient.getAll(Env.getCtx()); - for (int i = 0; i < clients.length; i++) + for (int i = 0; i < clients.length; i++) { String classNames = clients[i].getModelValidationClasses(); if (classNames == null || classNames.length() == 0) @@ -114,13 +113,13 @@ public class ModelValidationEngine //log.config(toString()); // System.out.println(toString()); } // ModelValidatorEngine - - private void loadValidatorClasses(MClient client, String classNames) + + private void loadValidatorClasses(MClient client, String classNames) { StringTokenizer st = new StringTokenizer(classNames, ";"); while (st.hasMoreTokens()) { - String className = null; + String className = null; try { className = st.nextToken(); @@ -130,36 +129,34 @@ public class ModelValidationEngine if (className.length() == 0) continue; // - loadValidatorClass(client, className); + loadValidatorClass(client, className); } catch (Exception e) { //logging to db will try to init ModelValidationEngine again! - //log.log(Level.SEVERE, className + ": " + e.getMessage()); - // System.err.println(className + ": " + e.getMessage()); + e.printStackTrace(); missingModelValidationMessage = missingModelValidationMessage + e.toString() + " on client " + client.getName() + '\n'; } } } - + private void loadValidatorClass(MClient client, String className) { try { // Class clazz = Class.forName(className); ModelValidator validator = (ModelValidator)clazz.newInstance(); - initialize(validator, client); + initialize(validator, client); } catch (Exception e) { //logging to db will try to init ModelValidationEngine again! - //log.log(Level.SEVERE, className + ": " + e.getMessage()); - // System.err.println(e.toString()); - missingModelValidationMessage = missingModelValidationMessage + e.toString() + + e.printStackTrace(); + missingModelValidationMessage = missingModelValidationMessage + e.toString() + (client != null ? (" on client " + client.getName()) : " global") + '\n'; } } - + /** Logger */ private static CLogger log = CLogger.getCLogger(ModelValidationEngine.class); // /** Change Support */ @@ -175,9 +172,9 @@ public class ModelValidationEngine private Hashtable>m_factsValidateListeners = new Hashtable>(); /** Data Import Validation Listeners */ private Hashtable>m_impValidateListeners = new Hashtable>(); - + private ArrayList m_globalValidators = new ArrayList(); - + /** * Initialize and add validator * @param validator @@ -188,8 +185,8 @@ public class ModelValidationEngine if (client == null) m_globalValidators.add(validator); m_validators.add(validator); - validator.initialize(this, client); - + validator.initialize(this, client); + } // initialize /** @@ -202,7 +199,7 @@ public class ModelValidationEngine */ public String loginComplete (int AD_Client_ID, int AD_Org_ID, int AD_Role_ID, int AD_User_ID) { - for (int i = 0; i < m_validators.size(); i++) + for (int i = 0; i < m_validators.size(); i++) { ModelValidator validator = (ModelValidator)m_validators.get(i); if (AD_Client_ID == validator.getAD_Client_ID() @@ -213,7 +210,7 @@ public class ModelValidationEngine return error; } } - + // now process the script model validator login List loginRules = MRule.getModelValidatorLoginRules (Env.getCtx()); if (loginRules != null) { @@ -226,13 +223,13 @@ public class ModelValidationEngine ScriptEngine engine = loginRule.getScriptEngine(); MRule.setContext(engine, Env.getCtx(), 0); // no window - // now add the method arguments to the engine + // now add the method arguments to the engine engine.put(MRule.ARGUMENTS_PREFIX + "Ctx", Env.getCtx()); engine.put(MRule.ARGUMENTS_PREFIX + "AD_Client_ID", AD_Client_ID); engine.put(MRule.ARGUMENTS_PREFIX + "AD_Org_ID", AD_Org_ID); engine.put(MRule.ARGUMENTS_PREFIX + "AD_Role_ID", AD_Role_ID); engine.put(MRule.ARGUMENTS_PREFIX + "AD_User_ID", AD_User_ID); - + Object retval = engine.eval(loginRule.getScript()); error = (retval == null ? "" : retval.toString()); } catch (Exception e) { @@ -245,7 +242,7 @@ public class ModelValidationEngine } } // - + if (AD_User_ID == 0 && AD_Role_ID == 0) ; // don't validate for user system on role system else @@ -256,8 +253,8 @@ public class ModelValidationEngine } return null; } // loginComplete - - + + /************************************************************************** * Add Model Change Listener * @param tableName table name @@ -269,7 +266,7 @@ public class ModelValidationEngine return; // String propertyName = - m_globalValidators.contains(listener) + m_globalValidators.contains(listener) ? tableName + "*" : tableName + listener.getAD_Client_ID(); ArrayList list = (ArrayList)m_modelChangeListeners.get(propertyName); @@ -292,8 +289,8 @@ public class ModelValidationEngine { if (tableName == null || listener == null) return; - String propertyName = - m_globalValidators.contains(listener) + String propertyName = + m_globalValidators.contains(listener) ? tableName + "*" : tableName + listener.getAD_Client_ID(); ArrayList list = m_modelChangeListeners.get(propertyName); @@ -303,7 +300,7 @@ public class ModelValidationEngine if (list.size() == 0) m_modelChangeListeners.remove(propertyName); } // removeModelValidator - + /** * Fire Model Change. * Call modelChange method of added validators @@ -315,7 +312,7 @@ public class ModelValidationEngine { if (po == null || m_modelChangeListeners.size() == 0) return null; - + String propertyName = po.get_TableName() + "*"; ArrayList list = m_modelChangeListeners.get(propertyName); if (list != null) @@ -325,7 +322,7 @@ public class ModelValidationEngine if (error != null && error.length() > 0) return error; } - + propertyName = po.get_TableName() + po.getAD_Client_ID(); list = m_modelChangeListeners.get(propertyName); if (list != null) @@ -335,18 +332,18 @@ public class ModelValidationEngine if (error != null && error.length() > 0) return error; } - + // now process the script model validator for this event - List scriptValidators = + List scriptValidators = MTableScriptValidator.getModelValidatorRules( - po.getCtx(), + po.getCtx(), po.get_Table_ID(), ModelValidator.tableEventValidators[changeType]); if (scriptValidators != null) { for (MTableScriptValidator scriptValidator : scriptValidators) { MRule rule = MRule.get(po.getCtx(), scriptValidator.getAD_Rule_ID()); // currently just JSR 223 supported - if ( rule != null + if ( rule != null && rule.isActive() && rule.getRuleType().equals(MRule.RULETYPE_JSR223ScriptingAPIs) && rule.getEventType().equals(MRule.EVENTTYPE_ModelValidatorTableEvent)) { @@ -355,12 +352,12 @@ public class ModelValidationEngine ScriptEngine engine = rule.getScriptEngine(); MRule.setContext(engine, po.getCtx(), 0); // no window - // now add the method arguments to the engine + // now add the method arguments to the engine engine.put(MRule.ARGUMENTS_PREFIX + "Ctx", po.getCtx()); engine.put(MRule.ARGUMENTS_PREFIX + "PO", po); engine.put(MRule.ARGUMENTS_PREFIX + "Type", changeType); engine.put(MRule.ARGUMENTS_PREFIX + "Event", ModelValidator.tableEventValidators[changeType]); - + Object retval = engine.eval(rule.getScript()); error = (retval == null ? "" : retval.toString()); } catch (Exception e) { @@ -373,10 +370,10 @@ public class ModelValidationEngine } } // - + return null; } // fireModelChange - + private String fireModelChange(PO po, int changeType, ArrayList list) { for (int i = 0; i < list.size(); i++) @@ -410,8 +407,8 @@ public class ModelValidationEngine } return null; } - - + + /************************************************************************** * Add Document Validation Listener * @param tableName table name @@ -422,8 +419,8 @@ public class ModelValidationEngine if (tableName == null || listener == null) return; // - String propertyName = - m_globalValidators.contains(listener) + String propertyName = + m_globalValidators.contains(listener) ? tableName + "*" : tableName + listener.getAD_Client_ID(); ArrayList list = (ArrayList)m_docValidateListeners.get(propertyName); @@ -434,7 +431,7 @@ public class ModelValidationEngine m_docValidateListeners.put(propertyName, list); } else if (!list.contains(listener)) - { + { list.add(listener); } } // addDocValidate @@ -448,8 +445,8 @@ public class ModelValidationEngine { if (tableName == null || listener == null) return; - String propertyName = - m_globalValidators.contains(listener) + String propertyName = + m_globalValidators.contains(listener) ? tableName + "*" : tableName + listener.getAD_Client_ID(); ArrayList list = m_docValidateListeners.get(propertyName); @@ -459,7 +456,7 @@ public class ModelValidationEngine if (list.size() == 0) m_docValidateListeners.remove(propertyName); } // removeDocValidate - + /** * Fire Document Validation. * Call docValidate method of added validators @@ -471,7 +468,7 @@ public class ModelValidationEngine { if (po == null || m_docValidateListeners.size() == 0) return null; - + String propertyName = po.get_TableName() + "*"; ArrayList list = m_docValidateListeners.get(propertyName); if (list != null) @@ -481,7 +478,7 @@ public class ModelValidationEngine if (error != null && error.length() > 0) return error; } - + propertyName = po.get_TableName() + po.getAD_Client_ID(); list = m_docValidateListeners.get(propertyName); if (list != null) @@ -491,18 +488,18 @@ public class ModelValidationEngine if (error != null && error.length() > 0) return error; } - + // now process the script model validator for this event - List scriptValidators = + List scriptValidators = MTableScriptValidator.getModelValidatorRules( - po.getCtx(), + po.getCtx(), po.get_Table_ID(), ModelValidator.documentEventValidators[docTiming]); if (scriptValidators != null) { for (MTableScriptValidator scriptValidator : scriptValidators) { MRule rule = MRule.get(po.getCtx(), scriptValidator.getAD_Rule_ID()); // currently just JSR 223 supported - if ( rule != null + if ( rule != null && rule.isActive() && rule.getRuleType().equals(MRule.RULETYPE_JSR223ScriptingAPIs) && rule.getEventType().equals(MRule.EVENTTYPE_ModelValidatorDocumentEvent)) { @@ -511,12 +508,12 @@ public class ModelValidationEngine ScriptEngine engine = rule.getScriptEngine(); MRule.setContext(engine, po.getCtx(), 0); // no window - // now add the method arguments to the engine + // now add the method arguments to the engine engine.put(MRule.ARGUMENTS_PREFIX + "Ctx", po.getCtx()); engine.put(MRule.ARGUMENTS_PREFIX + "PO", po); engine.put(MRule.ARGUMENTS_PREFIX + "Type", docTiming); engine.put(MRule.ARGUMENTS_PREFIX + "Event", ModelValidator.documentEventValidators[docTiming]); - + Object retval = engine.eval(rule.getScript()); error = (retval == null ? "" : retval.toString()); } catch (Exception e) { @@ -532,7 +529,7 @@ public class ModelValidationEngine return null; } // fireDocValidate - + private String fireDocValidate(PO po, int docTiming, ArrayList list) { for (int i = 0; i < list.size(); i++) @@ -568,7 +565,7 @@ public class ModelValidationEngine } return null; } - + /************************************************************************** * Add Accounting Facts Validation Listener * @param tableName table name @@ -579,8 +576,8 @@ public class ModelValidationEngine if (tableName == null || listener == null) return; // - String propertyName = - m_globalValidators.contains(listener) + String propertyName = + m_globalValidators.contains(listener) ? tableName + "*" : tableName + listener.getAD_Client_ID(); ArrayList list = (ArrayList)m_factsValidateListeners.get(propertyName); @@ -624,8 +621,8 @@ public class ModelValidationEngine { if (tableName == null || listener == null) return; - String propertyName = - m_globalValidators.contains(listener) + String propertyName = + m_globalValidators.contains(listener) ? tableName + "*" : tableName + listener.getAD_Client_ID(); ArrayList list = m_factsValidateListeners.get(propertyName); @@ -635,7 +632,7 @@ public class ModelValidationEngine if (list.size() == 0) m_factsValidateListeners.remove(propertyName); } // removeFactsValidate - + /** * Fire Accounting Facts Validation. * Call factsValidate method of added validators @@ -649,7 +646,7 @@ public class ModelValidationEngine { if (schema == null || facts == null || po == null || m_factsValidateListeners.size() == 0) return null; - + String propertyName = po.get_TableName() + "*"; ArrayList list = (ArrayList)m_factsValidateListeners.get(propertyName); if (list != null) @@ -659,7 +656,7 @@ public class ModelValidationEngine if (error != null && error.length() > 0) return error; } - + propertyName = po.get_TableName() + po.getAD_Client_ID(); list = (ArrayList)m_factsValidateListeners.get(propertyName); if (list != null) @@ -669,10 +666,10 @@ public class ModelValidationEngine if (error != null && error.length() > 0) return error; } - + return null; } // fireFactsValidate - + private String fireFactsValidate(MAcctSchema schema, List facts, PO po, ArrayList list) { for (int i = 0; i < list.size(); i++) @@ -699,7 +696,7 @@ public class ModelValidationEngine { //log the stack trace log.log(Level.SEVERE, e.getLocalizedMessage(), e); - // Exeptions are errors and should stop the document processing - teo_sarca [ 1679692 ] + // Exeptions are errors and should stop the document processing - teo_sarca [ 1679692 ] String error = e.getLocalizedMessage(); if (error == null) error = e.toString(); @@ -713,7 +710,7 @@ public class ModelValidationEngine * Fire Import Validation. * Call {@link ImportValidator#validate(ImportProcess, Object, Object, int)} or registered validators. * @param process import process - * @param importModel import record (e.g. X_I_BPartner) + * @param importModel import record (e.g. X_I_BPartner) * @param targetModel target model (e.g. MBPartner, MBPartnerLocation, MUser) * @param timing see ImportValidator.TIMING_* constants */ @@ -721,7 +718,7 @@ public class ModelValidationEngine { if (m_impValidateListeners.size() == 0) return; - + String propertyName = process.getImportTableName() + "*"; ArrayList list = (ArrayList)m_impValidateListeners.get(propertyName); if (list != null) @@ -732,7 +729,7 @@ public class ModelValidationEngine } } } - + /** * String Representation * @return info @@ -746,13 +743,13 @@ public class ModelValidationEngine .append("]"); return sb.toString(); } // toString - + /** * Create Model Validators Info * @param sb optional string buffer * @param ctx context * @return Model Validators Info - * + * * @author Teo Sarca, FR [ 1724662 ] */ public StringBuffer getInfoDetail(StringBuffer sb, Properties ctx) { @@ -789,7 +786,7 @@ public class ModelValidationEngine // return sb; } - + /** * After Load Preferences into Context for selected client. * @param ctx context @@ -799,7 +796,7 @@ public class ModelValidationEngine public void afterLoadPreferences (Properties ctx) { int AD_Client_ID = Env.getAD_Client_ID(ctx); - for (int i = 0; i < m_validators.size(); i++) + for (int i = 0; i < m_validators.size(); i++) { ModelValidator validator = (ModelValidator)m_validators.get(i); if (AD_Client_ID == validator.getAD_Client_ID()