diff --git a/base/src/org/adempiere/model/ImportValidator.java b/base/src/org/adempiere/model/ImportValidator.java
new file mode 100644
index 0000000000..ca016ef155
--- /dev/null
+++ b/base/src/org/adempiere/model/ImportValidator.java
@@ -0,0 +1,26 @@
+/**
+ *
+ */
+package org.adempiere.model;
+
+import org.adempiere.process.ImportProcess;
+
+/**
+ * Import Validator Interface
+ * @author Teo Sarca, www.arhipac.ro
+ *
FR [ 2788276 ] Data Import Validator
+ * https://sourceforge.net/tracker/?func=detail&aid=2788276&group_id=176962&atid=879335
+ */
+public interface ImportValidator
+{
+ /** Event triggered before all import records are validated */
+ public static final int TIMING_BEFORE_VALIDATE = 10;
+ /** Event triggered after all import records are validated */
+ public static final int TIMING_AFTER_VALIDATE = 20;
+ /** Event triggered before an import record is processed */
+ public static final int TIMING_BEFORE_IMPORT = 30;
+ /** Event triggered after an import record is processed */
+ public static final int TIMING_AFTER_IMPORT = 40;
+
+ public void validate(ImportProcess process, Object importModel, Object targetModel, int timing);
+}
diff --git a/base/src/org/adempiere/process/ImportProcess.java b/base/src/org/adempiere/process/ImportProcess.java
new file mode 100644
index 0000000000..3b958b7005
--- /dev/null
+++ b/base/src/org/adempiere/process/ImportProcess.java
@@ -0,0 +1,48 @@
+/**
+ *
+ */
+package org.adempiere.process;
+
+import java.util.Properties;
+
+import org.compiere.process.ProcessInfo;
+
+/**
+ * All processes that are importing data should implement this interface.
+ * @author Teo Sarca, www.arhipac.ro
+ * FR [ 2788276 ] Data Import Validator
+ * https://sourceforge.net/tracker/?func=detail&aid=2788276&group_id=176962&atid=879335
+ */
+public interface ImportProcess
+{
+ /**
+ *
+ * @return The Name of Import Table (e.g. I_BPartner)
+ */
+ public String getImportTableName();
+
+ /**
+ *
+ * @return SQL WHERE clause to filter records that are candidates for import
+ */
+ public String getWhereClause();
+
+ /**
+ * Get Process Context
+ * @return context
+ */
+ public Properties getCtx();
+
+ /**
+ * Get Process Transaction Name
+ * @return transaction name
+ */
+ public String get_TrxName();
+
+ /**
+ * Get Process Info
+ * @return Process Info
+ * @see org.compiere.process.SvrProcess#getProcessInfo()
+ */
+ public ProcessInfo getProcessInfo();
+}
diff --git a/base/src/org/compiere/model/ModelValidationEngine.java b/base/src/org/compiere/model/ModelValidationEngine.java
index 5b7300e58c..e5f9c7f7bb 100644
--- a/base/src/org/compiere/model/ModelValidationEngine.java
+++ b/base/src/org/compiere/model/ModelValidationEngine.java
@@ -25,6 +25,8 @@ import java.util.StringTokenizer;
import javax.script.ScriptEngine;
+import org.adempiere.model.ImportValidator;
+import org.adempiere.process.ImportProcess;
import org.compiere.acct.Fact;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
@@ -40,6 +42,8 @@ import org.compiere.util.KeyNamePair;
* FR [ 1670025 ] ModelValidator.afterLoadPreferences will be useful
* BF [ 1679692 ] fireDocValidate doesn't treat exceptions as errors
* FR [ 1724662 ] Support Email should contain model validators info
+ * FR [ 2788276 ] Data Import Validator
+ * https://sourceforge.net/tracker/?func=detail&aid=2788276&group_id=176962&atid=879335
*/
public class ModelValidationEngine
{
@@ -162,6 +166,8 @@ public class ModelValidationEngine
private Hashtable> m_docValidateListeners = new Hashtable>();
/** Accounting Facts Validation Listeners */
private Hashtable>m_factsValidateListeners = new Hashtable>();
+ /** Data Import Validation Listeners */
+ private Hashtable>m_impValidateListeners = new Hashtable>();
private ArrayList m_globalValidators = new ArrayList();
@@ -561,6 +567,27 @@ public class ModelValidationEngine
list.add(listener);
} // addFactsValidate
+ /**************************************************************************
+ * Add Date Import Validation Listener
+ * @param tableName table name
+ * @param listener listener
+ */
+ public void addImportValidate (String importTableName, ImportValidator listener)
+ {
+ String propertyName = importTableName + "*";
+ ArrayList list = (ArrayList)m_impValidateListeners.get(propertyName);
+ if (list == null)
+ {
+ list = new ArrayList();
+ list.add(listener);
+ m_impValidateListeners.put(propertyName, list);
+ }
+ else
+ {
+ list.add(listener);
+ }
+ }
+
/**
* Remove Accounting Facts Validation Listener
* @param tableName table name
@@ -646,6 +673,30 @@ public class ModelValidationEngine
}
return null;
}
+
+ /**
+ * 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 targetModel target model (e.g. MBPartner, MBPartnerLocation, MUser)
+ * @param timing see ImportValidator.TIMING_* constants
+ */
+ public void fireImportValidate (ImportProcess process, PO importModel, PO targetModel, int timing)
+ {
+ if (m_impValidateListeners.size() == 0)
+ return;
+
+ String propertyName = process.getImportTableName() + "*";
+ ArrayList list = (ArrayList)m_impValidateListeners.get(propertyName);
+ if (list != null)
+ {
+ for (ImportValidator validator : list)
+ {
+ validator.validate(process, importModel, targetModel, timing);
+ }
+ }
+ }
/**
* String Representation