Skip to content

Commit 535d7a2

Browse files
NH-3964 - obsolete Linq.ReflectionHelper in favor of Util.ReflectHelper.
1 parent 6370f3d commit 535d7a2

36 files changed

+412
-338
lines changed

doc/reference/modules/query_linq.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ IList<Cat> cats =
590590
{
591591
SupportedMethods = new[]
592592
{
593-
ReflectionHelper.GetMethodDefinition(() => NullableExtensions.AsNullable(0))
593+
ReflectHelper.GetMethodDefinition(() => NullableExtensions.AsNullable(0))
594594
};
595595
}
596596

src/NHibernate.Test/Linq/BooleanMethodExtensionExample.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
using System.Linq.Expressions;
66
using System.Reflection;
77
using NHibernate.Cfg;
8-
using NHibernate.Cfg.Loquacious;
98
using NHibernate.Hql.Ast;
10-
using NHibernate.Linq;
119
using NHibernate.Linq.Functions;
1210
using NHibernate.Linq.Visitors;
1311
using NHibernate.DomainModel.Northwind.Entities;
1412
using NUnit.Framework;
13+
using NHibernate.Util;
1514

1615
namespace NHibernate.Test.Linq
1716
{
@@ -27,7 +26,7 @@ public class FreetextGenerator : BaseHqlGeneratorForMethod
2726
{
2827
public FreetextGenerator()
2928
{
30-
SupportedMethods = new[] {ReflectionHelper.GetMethodDefinition(() => BooleanLinqExtensions.FreeText(null, null))};
29+
SupportedMethods = new[] {ReflectHelper.GetMethodDefinition(() => BooleanLinqExtensions.FreeText(null, null))};
3130
}
3231

3332
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject,
@@ -48,7 +47,7 @@ public class MyLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
4847
{
4948
public MyLinqToHqlGeneratorsRegistry()
5049
{
51-
RegisterGenerator(ReflectionHelper.GetMethodDefinition(() => BooleanLinqExtensions.FreeText(null, null)),
50+
RegisterGenerator(ReflectHelper.GetMethodDefinition(() => BooleanLinqExtensions.FreeText(null, null)),
5251
new FreetextGenerator());
5352
}
5453
}

src/NHibernate.Test/Linq/CustomExtensionsExample.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44
using System.Reflection;
55
using System.Text.RegularExpressions;
66
using NHibernate.Cfg;
7-
using NHibernate.Cfg.Loquacious;
8-
using NHibernate.DomainModel.Northwind.Entities;
97
using NHibernate.Hql.Ast;
10-
using NHibernate.Linq;
118
using NHibernate.Linq.Functions;
129
using NHibernate.Linq.Visitors;
10+
using NHibernate.Util;
1311
using NUnit.Framework;
1412

1513
namespace NHibernate.Test.Linq
@@ -30,7 +28,7 @@ public class MyLinqToHqlGeneratorsRegistry: DefaultLinqToHqlGeneratorsRegistry
3028
{
3129
public MyLinqToHqlGeneratorsRegistry():base()
3230
{
33-
RegisterGenerator(ReflectionHelper.GetMethodDefinition(() => MyLinqExtensions.IsLike(null, null)),
31+
RegisterGenerator(ReflectHelper.GetMethodDefinition(() => MyLinqExtensions.IsLike(null, null)),
3432
new IsLikeGenerator());
3533
}
3634
}
@@ -39,7 +37,7 @@ public class IsLikeGenerator : BaseHqlGeneratorForMethod
3937
{
4038
public IsLikeGenerator()
4139
{
42-
SupportedMethods = new[] {ReflectionHelper.GetMethodDefinition(() => MyLinqExtensions.IsLike(null, null))};
40+
SupportedMethods = new[] {ReflectHelper.GetMethodDefinition(() => MyLinqExtensions.IsLike(null, null))};
4341
}
4442

4543
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject,

src/NHibernate.Test/NHSpecificTest/EntityWithUserTypeCanHaveLinqGenerators/EntityWithUserTypePropertyGeneratorsRegistry.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
using NHibernate.Linq;
21
using NHibernate.Linq.Functions;
2+
using NHibernate.Util;
33

44
namespace NHibernate.Test.NHSpecificTest.EntityWithUserTypeCanHaveLinqGenerators
55
{
66
public class EntityWithUserTypePropertyGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
77
{
88
public EntityWithUserTypePropertyGeneratorsRegistry()
99
{
10-
RegisterGenerator(ReflectionHelper.GetMethod((IExample e) => e.IsEquivalentTo(null)),
10+
RegisterGenerator(ReflectHelper.GetMethod((IExample e) => e.IsEquivalentTo(null)),
1111
new EntityWithUserTypePropertyIsEquivalentGenerator());
1212
}
1313
}

src/NHibernate.Test/NHSpecificTest/EntityWithUserTypeCanHaveLinqGenerators/EntityWithUserTypePropertyIsEquivalentGenerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
using System.Linq.Expressions;
44
using System.Reflection;
55
using NHibernate.Hql.Ast;
6-
using NHibernate.Linq;
76
using NHibernate.Linq.Functions;
87
using NHibernate.Linq.Visitors;
8+
using NHibernate.Util;
99

1010
namespace NHibernate.Test.NHSpecificTest.EntityWithUserTypeCanHaveLinqGenerators
1111
{
1212
public class EntityWithUserTypePropertyIsEquivalentGenerator : BaseHqlGeneratorForMethod
1313
{
1414
public EntityWithUserTypePropertyIsEquivalentGenerator()
1515
{
16-
SupportedMethods = new[] {ReflectionHelper.GetMethodDefinition((IExample e) => e.IsEquivalentTo(null))};
16+
SupportedMethods = new[] {ReflectHelper.GetMethodDefinition((IExample e) => e.IsEquivalentTo(null))};
1717
}
1818

1919
public override HqlTreeNode BuildHql(

src/NHibernate.Test/NHSpecificTest/NH2318/LinqMapping.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Collections.ObjectModel;
4-
using System.Linq;
53
using System.Linq.Expressions;
64
using System.Reflection;
7-
using System.Text;
85
using NHibernate.Hql.Ast;
9-
using NHibernate.Linq;
106
using NHibernate.Linq.Functions;
117
using NHibernate.Linq.Visitors;
8+
using NHibernate.Util;
129

1310
namespace NHibernate.Test.NHSpecificTest.NH2318
1411
{
@@ -31,8 +28,8 @@ public class TrimGenerator : BaseHqlGeneratorForMethod
3128
public TrimGenerator()
3229
{
3330
SupportedMethods = new[] {
34-
ReflectionHelper.GetMethodDefinition(() => TrimExtensions.TrimLeading(null, null)),
35-
ReflectionHelper.GetMethodDefinition(() => TrimExtensions.TrimTrailing(null, null)),
31+
ReflectHelper.GetMethodDefinition(() => TrimExtensions.TrimLeading(null, null)),
32+
ReflectHelper.GetMethodDefinition(() => TrimExtensions.TrimTrailing(null, null)),
3633
};
3734
}
3835

src/NHibernate.Test/NHSpecificTest/NH2869/IsTrueInDbFalseInLocalGenerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
using System.Linq.Expressions;
33
using System.Reflection;
44
using NHibernate.Hql.Ast;
5-
using NHibernate.Linq;
65
using NHibernate.Linq.Functions;
76
using NHibernate.Linq.Visitors;
7+
using NHibernate.Util;
88

99
namespace NHibernate.Test.NHSpecificTest.NH2869
1010
{
1111
public class IsTrueInDbFalseInLocalGenerator : BaseHqlGeneratorForMethod
1212
{
1313
public IsTrueInDbFalseInLocalGenerator()
1414
{
15-
SupportedMethods = new[] { ReflectionHelper.GetMethodDefinition(() => MyLinqExtensions.IsOneInDbZeroInLocal(null, null)) };
15+
SupportedMethods = new[] { ReflectHelper.GetMethodDefinition(() => MyLinqExtensions.IsOneInDbZeroInLocal(null, null)) };
1616
}
1717

1818
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
using NHibernate.Linq;
21
using NHibernate.Linq.Functions;
2+
using NHibernate.Util;
33

44
namespace NHibernate.Test.NHSpecificTest.NH2869
55
{
66
public class MyLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
77
{
88
public MyLinqToHqlGeneratorsRegistry()
99
{
10-
RegisterGenerator(ReflectionHelper.GetMethodDefinition(() => MyLinqExtensions.IsOneInDbZeroInLocal(null, null)), new IsTrueInDbFalseInLocalGenerator());
10+
RegisterGenerator(ReflectHelper.GetMethodDefinition(() => MyLinqExtensions.IsOneInDbZeroInLocal(null, null)), new IsTrueInDbFalseInLocalGenerator());
1111
}
1212
}
1313
}

src/NHibernate.Test/NHSpecificTest/NH3604/FixtureByCode.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using NHibernate.Cfg.MappingSchema;
33
using NHibernate.Linq;
44
using NHibernate.Mapping.ByCode;
5+
using NHibernate.Util;
56
using NUnit.Framework;
67

78
namespace NHibernate.Test.NHSpecificTest.NH3604
@@ -23,7 +24,7 @@ protected override HbmMapping GetMappings()
2324

2425
mapper.Class<EntityDetail>(rc =>
2526
{
26-
rc.Id(x => x.Id, m => m.Generator(new ForeignGeneratorDef(ReflectionHelper.GetProperty(EntityDetail.PropertyAccessExpressions.Entity))));
27+
rc.Id(x => x.Id, m => m.Generator(new ForeignGeneratorDef(ReflectHelper.GetProperty(EntityDetail.PropertyAccessExpressions.Entity))));
2728
rc.OneToOne(EntityDetail.PropertyAccessExpressions.Entity, m => m.Constrained(true));
2829
rc.Property(x => x.ExtraInfo);
2930
});

src/NHibernate.Test/NHSpecificTest/NH3952/Fixture.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Linq;
66
using System.Reflection;
77
using NHibernate.Linq;
8+
using NHibernate.Util;
89
using NUnit.Framework;
910

1011
namespace NHibernate.Test.NHSpecificTest.NH3952
@@ -83,10 +84,10 @@ public void ArraySelect()
8384
}
8485
}
8586

86-
private static readonly MethodInfo CastMethodDefinition = ReflectionHelper.GetMethodDefinition(
87+
private static readonly MethodInfo CastMethodDefinition = ReflectHelper.GetMethodDefinition(
8788
() => Enumerable.Cast<object>(null));
8889

89-
private static readonly MethodInfo CastMethod = ReflectionHelper.GetMethod(
90+
private static readonly MethodInfo CastMethod = ReflectHelper.GetMethod(
9091
() => Enumerable.Cast<int>(null));
9192

9293
[Test, Explicit("Just a blunt perf comparison among some reflection patterns used in NH")]
@@ -132,7 +133,7 @@ public void ReflectionBluntPerfCompare()
132133
swRefl.Start();
133134
for (var i = 0; i < 1000; i++)
134135
{
135-
var cast = ReflectionHelper.GetMethod(() => Enumerable.Cast<int>(null));
136+
var cast = ReflectHelper.GetMethod(() => Enumerable.Cast<int>(null));
136137
Trace.TraceInformation(cast.ToString());
137138
}
138139
swRefl.Stop();
@@ -141,7 +142,7 @@ public void ReflectionBluntPerfCompare()
141142
swReflDef.Start();
142143
for (var i = 0; i < 1000; i++)
143144
{
144-
var cast = ReflectionHelper.GetMethodDefinition(() => Enumerable.Cast<object>(null))
145+
var cast = ReflectHelper.GetMethodDefinition(() => Enumerable.Cast<object>(null))
145146
.MakeGenericMethod(new[] { typeof(int) });
146147
Trace.TraceInformation(cast.ToString());
147148
}
@@ -164,8 +165,8 @@ public void ReflectionBluntPerfCompare()
164165
Cached method definition + make gen: {1}
165166
Hazzik GetMethod: {5}
166167
Hazzik GetMethodDefinition + make gen: {6}
167-
ReflectionHelper.GetMethod: {2}
168-
ReflectionHelper.GetMethodDefinition + make gen: {3}
168+
ReflectHelper.GetMethod: {2}
169+
ReflectHelper.GetMethodDefinition + make gen: {3}
169170
EnumerableHelper.GetMethod(generic overload): {4}",
170171
swCached.Elapsed, swCachedDef.Elapsed, swRefl.Elapsed, swReflDef.Elapsed, swEnHlp.Elapsed,
171172
swRefl2.Elapsed, swRefl2Def.Elapsed);

src/NHibernate.Test/UtilityTest/ReflectionHelperIsMethodOfTests.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ public void WhenNullMethodInfoThenThrows()
1818
[Test]
1919
public void WhenNullTypeThenThrows()
2020
{
21-
var methodInfo = ReflectionHelper.GetMethodDefinition<List<int>>(t => t.Contains(5));
21+
var methodInfo = ReflectHelper.GetMethodDefinition<List<int>>(t => t.Contains(5));
2222
Assert.Throws<ArgumentNullException>(() => methodInfo.IsMethodOf(null));
2323
}
2424

2525
[Test]
2626
public void WhenDeclaringTypeMatchThenTrue()
2727
{
28-
Assert.That(ReflectionHelper.GetMethodDefinition<List<int>>(t => t.Contains(5)).IsMethodOf(typeof(List<int>)), Is.True);
28+
Assert.That(ReflectHelper.GetMethodDefinition<List<int>>(t => t.Contains(5)).IsMethodOf(typeof(List<int>)), Is.True);
2929
}
3030

3131
private class MyCollection: List<int>
@@ -36,33 +36,33 @@ private class MyCollection: List<int>
3636
[Test]
3737
public void WhenCustomTypeMatchThenTrue()
3838
{
39-
Assert.That(ReflectionHelper.GetMethodDefinition<MyCollection>(t => t.Contains(5)).IsMethodOf(typeof(List<int>)), Is.True);
39+
Assert.That(ReflectHelper.GetMethodDefinition<MyCollection>(t => t.Contains(5)).IsMethodOf(typeof(List<int>)), Is.True);
4040
}
4141

4242
[Test]
4343
public void WhenTypeIsGenericDefinitionAndMatchThenTrue()
4444
{
45-
Assert.That(ReflectionHelper.GetMethodDefinition<List<int>>(t => t.Contains(5)).IsMethodOf(typeof(List<>)), Is.True);
45+
Assert.That(ReflectHelper.GetMethodDefinition<List<int>>(t => t.Contains(5)).IsMethodOf(typeof(List<>)), Is.True);
4646
}
4747

4848
[Test]
4949
public void WhenTypeIsGenericImplementedInterfaceAndMatchThenTrue()
5050
{
51-
var containsMethodDefinition = ReflectionHelper.GetMethodDefinition<List<int>>(t => t.Contains(5));
51+
var containsMethodDefinition = ReflectHelper.GetMethodDefinition<List<int>>(t => t.Contains(5));
5252
Assert.That(containsMethodDefinition.IsMethodOf(typeof(ICollection<int>)), Is.True);
5353
}
5454

5555
[Test]
5656
public void WhenTypeIsGenericImplementedInterfaceAndMatchGenericInterfaceDefinitionThenTrue()
5757
{
58-
var containsMethodDefinition = ReflectionHelper.GetMethodDefinition<List<int>>(t => t.Contains(5));
58+
var containsMethodDefinition = ReflectHelper.GetMethodDefinition<List<int>>(t => t.Contains(5));
5959
Assert.That(containsMethodDefinition.IsMethodOf(typeof(ICollection<>)), Is.True);
6060
}
6161

6262
[Test]
6363
public void WhenNoMatchThenFalse()
6464
{
65-
Assert.That(ReflectionHelper.GetMethodDefinition<List<int>>(t => t.Contains(5)).IsMethodOf(typeof(IEnumerable<>)), Is.False);
65+
Assert.That(ReflectHelper.GetMethodDefinition<List<int>>(t => t.Contains(5)).IsMethodOf(typeof(IEnumerable<>)), Is.False);
6666
}
6767

6868
private abstract class MyAbstractClass<T>
@@ -78,14 +78,14 @@ private class MyClass : MyAbstractClass<int>
7878
[Test]
7979
public void WhenTypeIsGenericImplementedAbstractAndMatchThenTrue()
8080
{
81-
var containsMethodDefinition = ReflectionHelper.GetMethodDefinition<MyClass>(t => t.MyMethod());
81+
var containsMethodDefinition = ReflectHelper.GetMethodDefinition<MyClass>(t => t.MyMethod());
8282
Assert.That(containsMethodDefinition.IsMethodOf(typeof(MyAbstractClass<int>)), Is.True);
8383
}
8484

8585
[Test]
8686
public void WhenTypeIsGenericImplementedAbstractAndMatchGenericInterfaceDefinitionThenTrue()
8787
{
88-
var containsMethodDefinition = ReflectionHelper.GetMethodDefinition<MyClass>(t => t.MyMethod());
88+
var containsMethodDefinition = ReflectHelper.GetMethodDefinition<MyClass>(t => t.MyMethod());
8989
Assert.That(containsMethodDefinition.IsMethodOf(typeof(MyAbstractClass<>)), Is.True);
9090
}
9191
}
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System;
22
using System.Linq;
33
using System.Linq.Expressions;
4-
using NHibernate.Linq;
4+
using NHibernate.Util;
55
using NUnit.Framework;
66

77
namespace NHibernate.Test.UtilityTest
@@ -19,55 +19,55 @@ public void GenericMethod<T>() { }
1919
[Test]
2020
public void WhenGetMethodForNullThenThrows()
2121
{
22-
Assert.That(() => ReflectionHelper.GetMethodDefinition((Expression<System.Action>) null), Throws.TypeOf<ArgumentNullException>());
22+
Assert.That(() => ReflectHelper.GetMethodDefinition((Expression<System.Action>) null), Throws.TypeOf<ArgumentNullException>());
2323
}
2424

2525
[Test]
2626
public void WhenGenericGetMethodForNullThenThrows()
2727
{
28-
Assert.That(() => ReflectionHelper.GetMethodDefinition<object>((Expression<System.Action<object>>)null), Throws.TypeOf<ArgumentNullException>());
28+
Assert.That(() => ReflectHelper.GetMethodDefinition<object>((Expression<System.Action<object>>)null), Throws.TypeOf<ArgumentNullException>());
2929
}
3030

3131
[Test]
3232
public void WhenGetPropertyForNullThenThrows()
3333
{
34-
Assert.That(() => ReflectionHelper.GetProperty<object, object>(null), Throws.TypeOf<ArgumentNullException>());
34+
Assert.That(() => ReflectHelper.GetProperty<object, object>(null), Throws.TypeOf<ArgumentNullException>());
3535
}
3636

3737
[Test]
3838
public void WhenGenericMethodOfClassThenReturnGenericDefinition()
3939
{
40-
Assert.That(ReflectionHelper.GetMethodDefinition<MyClass>(mc => mc.GenericMethod<int>()), Is.EqualTo(typeof (MyClass).GetMethod("GenericMethod").GetGenericMethodDefinition()));
40+
Assert.That(ReflectHelper.GetMethodDefinition<MyClass>(mc => mc.GenericMethod<int>()), Is.EqualTo(typeof (MyClass).GetMethod("GenericMethod").GetGenericMethodDefinition()));
4141
}
4242

4343
[Test]
4444
public void WhenNoGenericMethodOfClassThenReturnDefinition()
4545
{
46-
Assert.That(ReflectionHelper.GetMethodDefinition<MyClass>(mc => mc.NoGenericMethod()), Is.EqualTo(typeof(MyClass).GetMethod("NoGenericMethod")));
46+
Assert.That(ReflectHelper.GetMethodDefinition<MyClass>(mc => mc.NoGenericMethod()), Is.EqualTo(typeof(MyClass).GetMethod("NoGenericMethod")));
4747
}
4848

4949
[Test]
5050
public void WhenStaticGenericMethodThenReturnGenericDefinition()
5151
{
52-
Assert.That(ReflectionHelper.GetMethodDefinition(() => Enumerable.All<int>(null, null)), Is.EqualTo(typeof(Enumerable).GetMethod("All").GetGenericMethodDefinition()));
52+
Assert.That(ReflectHelper.GetMethodDefinition(() => Enumerable.All<int>(null, null)), Is.EqualTo(typeof(Enumerable).GetMethod("All").GetGenericMethodDefinition()));
5353
}
5454

5555
[Test]
5656
public void WhenStaticNoGenericMethodThenReturnDefinition()
5757
{
58-
Assert.That(ReflectionHelper.GetMethodDefinition(() => string.Join(null, null)), Is.EqualTo(typeof(string).GetMethod("Join", new []{typeof(string), typeof(string[])})));
58+
Assert.That(ReflectHelper.GetMethodDefinition(() => string.Join(null, null)), Is.EqualTo(typeof(string).GetMethod("Join", new []{typeof(string), typeof(string[])})));
5959
}
6060

6161
[Test]
6262
public void WhenGetPropertyThenReturnPropertyInfo()
6363
{
64-
Assert.That(ReflectionHelper.GetProperty<MyClass, string>(mc => mc.BaseProperty), Is.EqualTo(typeof(MyClass).GetProperty("BaseProperty")));
64+
Assert.That(ReflectHelper.GetProperty<MyClass, string>(mc => mc.BaseProperty), Is.EqualTo(typeof(MyClass).GetProperty("BaseProperty")));
6565
}
6666

6767
[Test]
6868
public void WhenGetPropertyForBoolThenReturnPropertyInfo()
6969
{
70-
Assert.That(ReflectionHelper.GetProperty<MyClass, bool>(mc => mc.BaseBool), Is.EqualTo(typeof(MyClass).GetProperty("BaseBool")));
70+
Assert.That(ReflectHelper.GetProperty<MyClass, bool>(mc => mc.BaseBool), Is.EqualTo(typeof(MyClass).GetProperty("BaseBool")));
7171
}
7272
}
7373
}

src/NHibernate/Bytecode/EmitUtil.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public static void EmitLoadMethodInfo(ILGenerator il, MethodInfo methodInfo)
197197
il.Emit(OpCodes.Castclass, typeof(MethodInfo));
198198
}
199199

200-
private static readonly MethodInfo CreateDelegate = ReflectionHelper.GetMethod(
200+
private static readonly MethodInfo CreateDelegate = ReflectHelper.GetMethod(
201201
() => Delegate.CreateDelegate(null, null));
202202

203203
public static void EmitCreateDelegateInstance(ILGenerator il, System.Type delegateType, MethodInfo methodInfo)

0 commit comments

Comments
 (0)