From 3d347aa1f61aef9e9a3c39d2708d7001a83eae48 Mon Sep 17 00:00:00 2001 From: Shani Elharrar Date: Mon, 2 Feb 2015 11:06:55 +0200 Subject: [PATCH] Climb() : Added Processor Argument --- src/GraphClimber/Program.cs | 12 ++-- src/GraphClimber/SlowGraphClimber.cs | 55 +++++++++---------- .../ValueDescriptor/IValueDescriptor.cs | 7 ++- 3 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/GraphClimber/Program.cs b/src/GraphClimber/Program.cs index d08e5b2..e735559 100644 --- a/src/GraphClimber/Program.cs +++ b/src/GraphClimber/Program.cs @@ -108,15 +108,11 @@ public void ProcessString(IWriteOnlyExactValueDescriptor descriptor) [ProcessorMethod(Precedence = 102)] public void ProcessGeneric(IWriteOnlyValueDescriptor descriptor) { - XElement temp = _reader; - - _reader = _reader.Element(descriptor.StateMember.Name); + var innerReader = _reader.Element(descriptor.StateMember.Name); CreateObject(descriptor); - descriptor.Climb(); - - _reader = temp; + descriptor.Climb(new XmlReaderProcessor(innerReader)); } private void CreateObject(IWriteOnlyValueDescriptor descriptor) @@ -152,7 +148,7 @@ public void ProcessObject(IWriteOnlyExactValueDescriptor descriptor) // TODO: this will be the route method.. descriptor.Route (new MyCustomStateMember((IReflectionStateMember) descriptor.StateMember, - instanceType), descriptor.Owner); + instanceType), descriptor.Owner, this); } } @@ -243,7 +239,7 @@ public void ProcessGeneric(IReadOnlyValueDescriptor descriptor) { WritePropertyName(descriptor); - descriptor.Climb(); + descriptor.Climb(this); EndWritePropertyName(); } diff --git a/src/GraphClimber/SlowGraphClimber.cs b/src/GraphClimber/SlowGraphClimber.cs index 1aca58d..fd88f8f 100644 --- a/src/GraphClimber/SlowGraphClimber.cs +++ b/src/GraphClimber/SlowGraphClimber.cs @@ -80,15 +80,13 @@ IReflectionValueDescriptor where private readonly IStateMemberProvider _stateMemberProvider; private readonly IReflectionStateMember _stateMember; private readonly object _owner; - private readonly object _processor; - public ReflectionValueDescriptor(object processor, IStateMemberProvider stateMemberProvider, + public ReflectionValueDescriptor(IStateMemberProvider stateMemberProvider, IReflectionStateMember stateMember, object owner) { _stateMemberProvider = stateMemberProvider; _stateMember = stateMember; _owner = owner; - _processor = processor; } public TField Get() @@ -127,7 +125,7 @@ public object Owner get { return _owner; } } - public void Climb() + public void Climb(object processor) { TField value = Get(); @@ -149,7 +147,7 @@ public void Climb() members.Cast()) { Type runtimeMemberType = GetRuntimeMemberType(member, member.MemberType, value); - VisitMember(member, value, runtimeMemberType, false); + VisitMember(member, value, runtimeMemberType, false, processor); } } @@ -164,12 +162,12 @@ private Type GetRuntimeMemberType(IReflectionStateMember member, Type memberType } private void VisitMember(IReflectionStateMember member, object owner, Type runtimeMemberType, - bool skipSpecialMethod) + bool skipSpecialMethod, object processor) { IReflectionValueDescriptor descriptor = CreateDescriptor(member, owner, runtimeMemberType); - CallProcess(descriptor, skipSpecialMethod); + CallProcess(descriptor, skipSpecialMethod, processor); } private IReflectionValueDescriptor CreateDescriptor(IReflectionStateMember member, object value, @@ -181,28 +179,28 @@ private IReflectionValueDescriptor CreateDescriptor(IReflectionStateMember membe IReflectionValueDescriptor descriptor = (IReflectionValueDescriptor) Activator.CreateInstance (descriptorType, - _processor, _stateMemberProvider, member, value); + _stateMemberProvider, member, value); return descriptor; } - public void Route(IStateMember stateMember, object owner) + public void Route(IStateMember stateMember, object owner, object processor) { VisitMember((IReflectionStateMember) stateMember, owner, stateMember.MemberType, - true); + true, processor); } - public void Route(IStateMember stateMember, Type runtimeMemberType, object owner) + public void Route(IStateMember stateMember, Type runtimeMemberType, object owner, object processor) { VisitMember((IReflectionStateMember) stateMember, owner, runtimeMemberType, - true); + true, processor); } - private void CallProcess(IReflectionValueDescriptor descriptor, bool skipSpecialMethod) + private void CallProcess(IReflectionValueDescriptor descriptor, bool skipSpecialMethod, object processor) { Type fieldType = descriptor.StateMember.MemberType; @@ -210,25 +208,25 @@ private void CallProcess(IReflectionValueDescriptor descriptor, bool skipSpecial if (!fieldType.IsValueType && !skipSpecialMethod) { - methodCalled = TryCallSpecialMethod(descriptor, fieldType); + methodCalled = TryCallSpecialMethod(descriptor, fieldType, processor); } if (!methodCalled) { - CallMatchedProcess(descriptor); + CallMatchedProcess(descriptor, processor); } } - private bool TryCallSpecialMethod(IReflectionValueDescriptor descriptor, Type fieldType) + private bool TryCallSpecialMethod(IReflectionValueDescriptor descriptor, Type fieldType, object processor) { object value = descriptor.Get(); - INullProcessor processor = _processor as INullProcessor; - IRevisitedProcessor revisitedProcessor = _processor as IRevisitedProcessor; + INullProcessor nullProcessor = processor as INullProcessor; + IRevisitedProcessor revisitedProcessor = processor as IRevisitedProcessor; - if (processor != null && value == null) + if (nullProcessor != null && value == null) { - CallGenericMethod(descriptor, fieldType, "ProcessNull"); + CallGenericMethod(descriptor, fieldType, "ProcessNull", processor); return true; } else if ((value != null) && @@ -236,28 +234,28 @@ private bool TryCallSpecialMethod(IReflectionValueDescriptor descriptor, Type fi revisitedProcessor.Visited(value)) { Type runtimeType = value.GetType(); - CallGenericMethod(descriptor, runtimeType, "ProcessRevisited"); + CallGenericMethod(descriptor, runtimeType, "ProcessRevisited", processor); return true; } return false; } - private void CallGenericMethod(IReflectionValueDescriptor descriptor, Type genericType, string methodName) + private void CallGenericMethod(IReflectionValueDescriptor descriptor, Type genericType, string methodName, object processor) { MethodInfo methodToCall = typeof (INullProcessor).GetMethod(methodName) .MakeGenericMethod(genericType); - methodToCall.Invoke(_processor, new object[] {descriptor}); + methodToCall.Invoke(processor, new object[] {descriptor}); } - private void CallMatchedProcess(IReflectionValueDescriptor descriptor) + private void CallMatchedProcess(IReflectionValueDescriptor descriptor, object processor) { GenericArgumentBinder binder = new GenericArgumentBinder(); IEnumerable methods = - _processor.GetType().GetMethods() + processor.GetType().GetMethods() .Where(x => x.IsDefined(typeof (ProcessorMethodAttribute))); Type descriptorType = descriptor.GetType(); @@ -280,7 +278,7 @@ private void CallMatchedProcess(IReflectionValueDescriptor descriptor) if (method != null) { - method.Invoke(_processor, new object[] {descriptor}); + method.Invoke(processor, new object[] {descriptor}); } else { @@ -320,12 +318,11 @@ public SlowGraphClimber(IStateMemberProvider stateMemberProvider) public void Climb(object parent, TProcessor processor) { var descriptor = - new ReflectionValueDescriptor(processor, - _stateMemberProvider, + new ReflectionValueDescriptor(_stateMemberProvider, new ReflectionPropertyStateMember(typeof (Box).GetProperty("Parent")), new Box {Parent = parent}); - descriptor.Climb(); + descriptor.Climb(processor); } private class Box diff --git a/src/GraphClimber/ValueDescriptor/IValueDescriptor.cs b/src/GraphClimber/ValueDescriptor/IValueDescriptor.cs index e947c9c..b7b2831 100644 --- a/src/GraphClimber/ValueDescriptor/IValueDescriptor.cs +++ b/src/GraphClimber/ValueDescriptor/IValueDescriptor.cs @@ -20,10 +20,11 @@ public interface IValueDescriptor /// /// Climbs on the (current) value that found in the field by the owner /// - void Climb(); + /// + void Climb(object processor); - void Route(IStateMember stateMember, Type runtimeMemberType, object owner); + void Route(IStateMember stateMember, Type runtimeMemberType, object owner, object processor); - void Route(IStateMember stateMember, object owner); + void Route(IStateMember stateMember, object owner, object processor); } } \ No newline at end of file