Author: rgrabowski
Date: Tue Jul 12 19:58:29 2005
New Revision: 216095

URL: http://svn.apache.org/viewcvs?rev=216095&view=rev
Log:
Fix for IBATISNET-92: Check selectKey's property attribute for writeability 
during mapper initialization

Modified:
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs?rev=216095&r1=216094&r2=216095&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs 
Tue Jul 12 19:58:29 2005
@@ -1148,8 +1148,15 @@
                                // Set sql statement SelectKey 
                                if (insert.SelectKey != null)
                                {
+                                       insert.SelectKey.Id = insert.Id;
                                        insert.SelectKey.Initialize( 
_configScope );
-                                       insert.SelectKey.Id = insert.Id + DOT + 
"SelectKey";
+                                       insert.SelectKey.Id += DOT + 
"SelectKey";
+
+                                       // Initialize can also use 
_configScope.ErrorContext.ObjectId to get the id
+                                       // of the parent <select> node
+                                       // insert.SelectKey.Initialize( 
_configScope );
+                                       // insert.SelectKey.Id = insert.Id + 
DOT + "SelectKey";
+                                       
                                        string commandText = 
xmlNode.SelectSingleNode( ApplyMappingNamespacePrefix(XML_SELECTKEY), 
_configScope.XmlNamespaceManager).FirstChild.InnerText.Replace('\n', ' 
').Replace('\r', ' ').Replace('\t', ' ').Trim();
                                        commandText = 
Resources.ParsePropertyTokens(commandText, _configScope.Properties);
                                        StaticSql sql = new 
StaticSql(insert.SelectKey);

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs?rev=216095&r1=216094&r2=216095&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs
 Tue Jul 12 19:58:29 2005
@@ -26,10 +26,15 @@
 
 #region Imports
 using System;
+using System.Reflection;
 using System.Xml.Serialization;
-
+using IBatisNet.Common.Exceptions;
+using IBatisNet.Common.Utilities.Objects;
 using IBatisNet.DataMapper.Configuration.Alias;
 using IBatisNet.DataMapper.Exceptions;
+using IBatisNet.DataMapper.MappedStatements;
+using IBatisNet.DataMapper.Scope;
+
 #endregion
 
 namespace IBatisNet.DataMapper.Configuration.Statements
@@ -100,6 +105,42 @@
                [Obsolete("This public constructor with no parameter is not 
really obsolete, but is reserved for serialization.", false)]
                public SelectKey():base()
                {
+               }
+               #endregion
+
+               #region Methods
+               /// <summary>
+               /// 
+               /// </summary>
+               /// <param name="configurationScope">The scope of the 
configuration</param>
+               override internal void Initialize(ConfigurationScope 
configurationScope)
+               {
+                       // the propertyName attribute on the selectKey node is 
optional
+                       if (PropertyName.Length > 0)
+                       {
+                               // Id is equal to the parent <select> node's 
"id" attribute
+                               MappedStatement insert = 
configurationScope.SqlMapper.GetMappedStatement(Id);
+
+                               Type insertParameterClass = 
insert.Statement.ParameterClass;
+
+                               // make sure the PropertyName is a valid 
settable property of the <insert> node's parameterClass
+                               if (insertParameterClass != null && 
+                                       
configurationScope.TypeHandlerFactory.IsSimpleType(insertParameterClass) == 
false)
+                               {
+                                       
configurationScope.ErrorContext.MoreInfo = String.Format("Looking for settable 
property named '{0}' on type '{1}' for selectKey node of statement id '{2}'.",
+                                               PropertyName, // 0
+                                               
insert.Statement.ParameterClass.Name, // 1
+                                               Id); // 2
+
+                                       // we expect this to throw an exception 
if the property cannot be found; GetSetter is
+                                       // called instead of 
HasWriteableProperty becuase we want the same wording for 
+                                       // property not found exceptions; 
GetSetter and HasWritableProperty both use the 
+                                       // same internal cache for looking up 
the ProperyInfo object
+                                       
ReflectionInfo.GetInstance(insert.Statement.ParameterClass).GetSetter(PropertyName);
+                               }
+                       }
+
+                       base.Initialize(configurationScope);
                }
                #endregion
 


Reply via email to