Skip to content

Climb() : Added Processor Argument #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 4 additions & 8 deletions src/GraphClimber/Program.cs
Original file line number Diff line number Diff line change
@@ -108,15 +108,11 @@ public void ProcessString(IWriteOnlyExactValueDescriptor<string> descriptor)
[ProcessorMethod(Precedence = 102)]
public void ProcessGeneric<T>(IWriteOnlyValueDescriptor<T> 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<T>(IWriteOnlyValueDescriptor<T> descriptor)
@@ -152,7 +148,7 @@ public void ProcessObject(IWriteOnlyExactValueDescriptor<object> 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<T>(IReadOnlyValueDescriptor<T> descriptor)
{
WritePropertyName(descriptor);

descriptor.Climb();
descriptor.Climb(this);

EndWritePropertyName();
}
55 changes: 26 additions & 29 deletions src/GraphClimber/SlowGraphClimber.cs
Original file line number Diff line number Diff line change
@@ -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<IReflectionStateMember>())
{
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,83 +179,83 @@ 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;

bool methodCalled = false;

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) &&
(revisitedProcessor != null) &&
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<MethodInfo> 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<object, object>(processor,
_stateMemberProvider,
new ReflectionValueDescriptor<object, object>(_stateMemberProvider,
new ReflectionPropertyStateMember(typeof (Box).GetProperty("Parent")),
new Box {Parent = parent});

descriptor.Climb();
descriptor.Climb(processor);
}

private class Box
7 changes: 4 additions & 3 deletions src/GraphClimber/ValueDescriptor/IValueDescriptor.cs
Original file line number Diff line number Diff line change
@@ -20,10 +20,11 @@ public interface IValueDescriptor
/// <summary>
/// Climbs on the (current) value that found in the field by the owner
/// </summary>
void Climb();
/// <param name="processor"></param>
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);
}
}