diff --git a/base/src/org/compiere/model/MTable.java b/base/src/org/compiere/model/MTable.java index 9ed057e9e3..850f0535c5 100644 --- a/base/src/org/compiere/model/MTable.java +++ b/base/src/org/compiere/model/MTable.java @@ -43,10 +43,14 @@ import org.compiere.util.Util; *
  • 2007-08-30 - vpj-cd - [ 1784588 ] Use ModelPackage of EntityType to Find Model Class * * @author Jorg Janke + * @author Teo Sarca, teo.sarca@gmail.com + *
  • BF [ 3017117 ] MTable.getClass returns bad class + * https://sourceforge.net/tracker/?func=detail&aid=3017117&group_id=176962&atid=879332 * @version $Id: MTable.java,v 1.3 2006/07/30 00:58:04 jjanke Exp $ */ public class MTable extends X_AD_Table { + /** * */ @@ -207,7 +211,7 @@ public class MTable extends X_AD_Table String etmodelpackage = et.getModelPackage(); if (etmodelpackage == null || MEntityType.ENTITYTYPE_Dictionary.equals(entityType)) etmodelpackage = "org.compiere.model"; // fallback for dictionary or empty model package on entity type - Class clazz = getPOclass(etmodelpackage + ".X_" + tableName); + Class clazz = getPOclass(etmodelpackage + ".X_" + tableName, tableName); if (clazz != null) { s_classCache.put(tableName, clazz); @@ -222,7 +226,7 @@ public class MTable extends X_AD_Table { if (s_special[i++].equals(tableName)) { - Class clazz = getPOclass(s_special[i]); + Class clazz = getPOclass(s_special[i], tableName); if (clazz != null) { s_classCache.put(tableName, clazz); @@ -240,12 +244,12 @@ public class MTable extends X_AD_Table if (etmodelpackage != null) { Class clazz = null; - clazz = getPOclass(etmodelpackage + ".M" + Util.replace(tableName, "_", "")); + clazz = getPOclass(etmodelpackage + ".M" + Util.replace(tableName, "_", ""), tableName); if (clazz != null) { s_classCache.put(tableName, clazz); return clazz; } - clazz = getPOclass(etmodelpackage + ".X_" + tableName); + clazz = getPOclass(etmodelpackage + ".X_" + tableName, tableName); if (clazz != null) { s_classCache.put(tableName, clazz); return clazz; @@ -278,7 +282,7 @@ public class MTable extends X_AD_Table for (int i = 0; i < s_packages.length; i++) { StringBuffer name = new StringBuffer(s_packages[i]).append(".M").append(className); - Class clazz = getPOclass(name.toString()); + Class clazz = getPOclass(name.toString(), tableName); if (clazz != null) { s_classCache.put(tableName, clazz); @@ -288,7 +292,7 @@ public class MTable extends X_AD_Table // Adempiere Extension - Class clazz = getPOclass("adempiere.model.X_" + tableName); + Class clazz = getPOclass("adempiere.model.X_" + tableName, tableName); if (clazz != null) { s_classCache.put(tableName, clazz); @@ -297,7 +301,7 @@ public class MTable extends X_AD_Table //hengsin - allow compatibility with compiere plugins //Compiere Extension - clazz = getPOclass("compiere.model.X_" + tableName); + clazz = getPOclass("compiere.model.X_" + tableName, tableName); if (clazz != null) { s_classCache.put(tableName, clazz); @@ -305,7 +309,7 @@ public class MTable extends X_AD_Table } // Default - clazz = getPOclass("org.compiere.model.X_" + tableName); + clazz = getPOclass("org.compiere.model.X_" + tableName, tableName); if (clazz != null) { s_classCache.put(tableName, clazz); @@ -318,15 +322,37 @@ public class MTable extends X_AD_Table } // getClass /** - * Get PO class - * @param className fully qualified class name - * @return class or null + * Get PO class + * @param className fully qualified class name + * @return class or null + * @deprecated Use {@link #getPOclass(String, String)} */ private static Class getPOclass (String className) + { + return getPOclass(className, null); + } + + /** + * Get PO class + * @param className fully qualified class name + * @param tableName Optional. If specified, the loaded class will be validated for that table name + * @return class or null + */ + private static Class getPOclass (String className, String tableName) { try { Class clazz = Class.forName(className); + // Validate if the class is for specified tableName + if (tableName != null) + { + String classTableName = clazz.getField("Table_Name").get(null).toString(); + if (!tableName.equals(classTableName)) + { + s_log.finest("Invalid class for table: " + className+" (tableName="+tableName+", classTableName="+classTableName+")"); + return null; + } + } // Make sure that it is a PO class Class superClazz = clazz.getSuperclass(); while (superClazz != null)