From: <sv...@ca...> - 2006-02-22 20:38:29
|
User: ayende Date: 2006/02/22 03:32 PM Modified: /trunk/MonoRail/ Changes.txt /trunk/MonoRail/Castle.MonoRail.ActiveRecordScaffold/ Castle.MonoRail.ActiveRecordScaffold-vs2005.csproj /trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport.Tests/ ARDataBinderTestCase.cs, ARFetchTestCase.cs /trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/ ARDataBindAttribute.cs, ARDataBinder.cs, Castle.MonoRail.ActiveRecordSupport-vs2005.csproj Log: Added support for AutoLoadUnlessKeyIs in ARDataBinder - will load the object unless the key is a specific value Added checks for null id when doing data binding. Fixed ARFetchTestCase that was failing. Added missing references to .Net 2.0 projects File Changes: Directory: /trunk/MonoRail/Castle.MonoRail.ActiveRecordScaffold/ ================================================================ File [modified]: Castle.MonoRail.ActiveRecordScaffold-vs2005.csproj Delta lines: +4 -0 =================================================================== --- trunk/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Castle.MonoRail.ActiveRecordScaffold-vs2005.csproj 2006-02-22 19:36:42 UTC (rev 1696) +++ trunk/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Castle.MonoRail.ActiveRecordScaffold-vs2005.csproj 2006-02-22 20:32:52 UTC (rev 1697) @@ -98,6 +98,10 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\..\SharedLibs\nhibernate\NHibernate.dll</HintPath> </Reference> + <Reference Include="Nullables, Version=1.0.2.0, Culture=neutral, PublicKeyToken=154fdcb44c4484fc"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\SharedLibs\nhibernate\Nullables.dll</HintPath> + </Reference> <Reference Include="NVelocity"> <Name>NVelocity</Name> <HintPath>..\..\SharedLibs\nvelocity\NVelocity.dll</HintPath> Directory: /trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/ =============================================================== File [modified]: ARDataBindAttribute.cs Delta lines: +19 -2 =================================================================== --- trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/ARDataBindAttribute.cs 2006-02-22 19:36:42 UTC (rev 1696) +++ trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/ARDataBindAttribute.cs 2006-02-22 20:32:52 UTC (rev 1697) @@ -30,6 +30,7 @@ private bool autoLoad; + private object autoLoadUnlessKeyIs = NullWhenPrimaryKeyEmpty; private object nullWhenPrimaryKey = NullWhenPrimaryKeyEmpty; public ARDataBindAttribute(String prefix) : base (prefix) @@ -47,6 +48,12 @@ get { return nullWhenPrimaryKey; } set { nullWhenPrimaryKey = value; } } + + public object AutoLoadUnlessKeyIs + { + get { return autoLoadUnlessKeyIs; } + set { autoLoadUnlessKeyIs = value; } + } public override object Bind(SmartDispatcherController controller, ParameterInfo parameterInfo) { @@ -54,13 +61,18 @@ ConfigureBinder(binder, controller); - binder.AutoLoad = AutoLoad; + binder.AutoLoad = AutoLoad ||IsAutoLoadWhenKeyIsSet; if (IsNullWhenPrimaryKeySet) { binder.NullWhenPrimaryKey = NullWhenPrimaryKey; } - + + if (IsAutoLoadWhenKeyIsSet) + { + binder.AutoLoadUnlessKeyIs = this.autoLoadUnlessKeyIs; + } + return binder.BindObject(parameterInfo.ParameterType, Prefix, Exclude, Allow, ResolveParams(controller)); } @@ -68,5 +80,10 @@ { get { return NullWhenPrimaryKey != NullWhenPrimaryKeyEmpty; } } + + protected internal bool IsAutoLoadWhenKeyIsSet + { + get { return autoLoadUnlessKeyIs != NullWhenPrimaryKeyEmpty; } + } } } File [modified]: ARDataBinder.cs Delta lines: +19 -4 =================================================================== --- trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/ARDataBinder.cs 2006-02-22 19:36:42 UTC (rev 1696) +++ trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/ARDataBinder.cs 2006-02-22 20:32:52 UTC (rev 1697) @@ -41,7 +41,7 @@ private bool autoLoad, persistchanges; - private object nullWhenPrimaryKey; + private object nullWhenPrimaryKey, autoLoadUnlessKeyIs; public ARDataBinder() : base() { @@ -64,7 +64,13 @@ get { return nullWhenPrimaryKey; } set { nullWhenPrimaryKey = value; } } - + + public object AutoLoadUnlessKeyIs + { + get { return autoLoadUnlessKeyIs; } + set { autoLoadUnlessKeyIs = value; } + } + protected override object CreateInstance(Type instanceType, String paramPrefix, IBindingDataSourceNode node) { if (node == null) @@ -100,9 +106,18 @@ PrimaryKeyModel pkModel; object id = ObtainPKValue(model, node, paramPrefix, out pkModel); - - if (nullWhenPrimaryKey != null && id.Equals(NullWhenPrimaryKey)) + if (id == null) { + throw new RailsException(string.Format( + "Could not find primary key value '{0}' on '{1}'", pkModel.Property.Name, + instanceType.FullName)); + } + if(autoLoadUnlessKeyIs != null && id.Equals(autoLoadUnlessKeyIs)) + { + instance = base.CreateInstance(instanceType, paramPrefix, node); + } + else if (nullWhenPrimaryKey != null && id.Equals(NullWhenPrimaryKey)) + { instance = null; } else File [modified]: Castle.MonoRail.ActiveRecordSupport-vs2005.csproj Delta lines: +4 -0 =================================================================== --- trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/Castle.MonoRail.ActiveRecordSupport-vs2005.csproj 2006-02-22 19:36:42 UTC (rev 1696) +++ trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport/Castle.MonoRail.ActiveRecordSupport-vs2005.csproj 2006-02-22 20:32:52 UTC (rev 1697) @@ -87,6 +87,10 @@ <HintPath>..\..\SharedLibs\nhibernate\NHibernate.dll</HintPath> <Private>True</Private> </Reference> + <Reference Include="Nullables, Version=1.0.2.0, Culture=neutral, PublicKeyToken=154fdcb44c4484fc"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\SharedLibs\nhibernate\Nullables.dll</HintPath> + </Reference> <Reference Include="System"> <Name>System</Name> </Reference> Directory: /trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport.Tests/ ===================================================================== File [modified]: ARDataBinderTestCase.cs Delta lines: +33 -0 =================================================================== --- trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport.Tests/ARDataBinderTestCase.cs 2006-02-22 19:36:42 UTC (rev 1696) +++ trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport.Tests/ARDataBinderTestCase.cs 2006-02-22 20:32:52 UTC (rev 1697) @@ -110,6 +110,39 @@ } [Test] + public void NoLadingWhenIdMatchNoAutoLoadWhenPrimaryKeyIs() + { + NameValueCollection args = new NameValueCollection(); + + binder.AutoLoadUnlessKeyIs = 0; + + args.Add("SimplePerson.Id", "0"); + args.Add("SimplePerson.Age", "200"); + + instance = binder.BindObject(typeof(SimplePerson), "SimplePerson", new NameValueCollectionAdapter(args)); + + person = instance as SimplePerson; + + Assert.AreEqual(0, person.Id); + Assert.AreEqual(200, person.Age); + } + + [Test] + [ExpectedException(typeof(RailsException), "Could not find primary key value 'Id' on 'TestScaffolding.Model.SimplePerson'")] + public void ErrorWhenAutoLoadIsTrueButNoIdSpecified() + { + NameValueCollection args = new NameValueCollection(); + + binder.AutoLoad = true; + + args.Add("SimplePerson.Id", ""); + + instance = binder.BindObject(typeof(SimplePerson), "SimplePerson", new NameValueCollectionAdapter(args)); + + + } + + [Test] public void AutoloadAndArray() { NameValueCollection args = new NameValueCollection(); File [modified]: ARFetchTestCase.cs Delta lines: +1 -0 =================================================================== --- trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport.Tests/ARFetchTestCase.cs 2006-02-22 19:36:42 UTC (rev 1696) +++ trunk/MonoRail/Castle.MonoRail.ActiveRecordSupport.Tests/ARFetchTestCase.cs 2006-02-22 20:32:52 UTC (rev 1697) @@ -54,6 +54,7 @@ }; DoGet("ARFetchTest/SavePeople.rails", args); + AssertReplyStartsWith("Length=3\n[1:John:99]"); AssertSuccess(); // TODO: Check why random results returned by the page Directory: /trunk/MonoRail/ =========================== File [modified]: Changes.txt Delta lines: +5 -0 =================================================================== --- trunk/MonoRail/Changes.txt 2006-02-22 19:36:42 UTC (rev 1696) +++ trunk/MonoRail/Changes.txt 2006-02-22 20:32:52 UTC (rev 1697) @@ -4,6 +4,11 @@ Release Candidate 1 =================== +- Added support for AutoLoadUnlessKeyIs in ARDataBinder - will load the object unless the key is a specific value + Usages: public void Save([ARDataBinder(AutoLoadUnlessKeyIs = 0)]User user) + +- Added checks for null id when doing data binding. + - Removed useless error handling from Brail, now you'll get the noraml ASP.Net Yellow Screen Of Death on errors. More consistent with the rest of the framework. - Added support for <?brail ?> tags for Brail, so it can be valid XML documnets |