You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2016/08/18 16:36:18 UTC

ignite git commit: IGNITE-3696 .NET: Fix QueryEntity Java type mapping to handle nullable types.

Repository: ignite
Updated Branches:
  refs/heads/master 6899e06fb -> 9fad9c92d


IGNITE-3696 .NET: Fix QueryEntity Java type mapping to handle nullable types.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/9fad9c92
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9fad9c92
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9fad9c92

Branch: refs/heads/master
Commit: 9fad9c92d5c65b5940e7b78d12829f5b39e5115c
Parents: 6899e06
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Thu Aug 18 19:36:07 2016 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Thu Aug 18 19:36:07 2016 +0300

----------------------------------------------------------------------
 .../Apache.Ignite.Core.Tests.csproj             |   3 +-
 .../Binary/JavaTypeMappingTest.cs               | 142 +++++++++++++++++++
 .../Binary/TypeResolverTest.cs                  | 107 ++++++++++++++
 .../Query/CacheQueriesCodeConfigurationTest.cs  |  12 ++
 .../TypeResolverTest.cs                         | 107 --------------
 .../Apache.Ignite.Core/Impl/Binary/JavaTypes.cs |  24 +++-
 6 files changed, 283 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9fad9c92/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
index c4dcbae..647d82d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
@@ -58,6 +58,8 @@
   <ItemGroup>
     <Compile Include="Binary\BinaryReaderWriterTest.cs" />
     <Compile Include="Binary\IO\BinaryStreamsTest.cs" />
+    <Compile Include="Binary\JavaTypeMappingTest.cs" />
+    <Compile Include="Binary\TypeResolverTest.cs" />
     <Compile Include="Cache\Affinity\AffinityKeyTest.cs" />
     <Compile Include="Cache\Affinity\AffinityTopologyVersionTest.cs" />
     <Compile Include="Cache\CacheResultTest.cs" />
@@ -177,7 +179,6 @@
     <Compile Include="Services\ServiceProxyTest.cs" />
     <Compile Include="Services\ServicesAsyncWrapper.cs" />
     <Compile Include="TestRunner.cs" />
-    <Compile Include="TypeResolverTest.cs" />
     <Compile Include="WindowsServiceTest.cs" />
   </ItemGroup>
   <ItemGroup>

http://git-wip-us.apache.org/repos/asf/ignite/blob/9fad9c92/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaTypeMappingTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaTypeMappingTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaTypeMappingTest.cs
new file mode 100644
index 0000000..35d9a2e
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaTypeMappingTest.cs
@@ -0,0 +1,142 @@
+\ufeff/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Binary
+{
+    using System;
+    using Apache.Ignite.Core.Impl.Binary;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Tests the type mapping between .NET and Java.
+    /// </summary>
+    public class JavaTypeMappingTest
+    {
+        /// <summary>
+        /// Tests .NET to Java type mapping.
+        /// </summary>
+        [Test]
+        public void TestDotNetToJavaMapping()
+        {
+            Assert.AreEqual("java.lang.Boolean", JavaTypes.GetJavaTypeName(typeof(bool)));
+            Assert.AreEqual("java.lang.Boolean", JavaTypes.GetJavaTypeName(typeof(bool?)));
+
+            Assert.AreEqual("java.lang.Byte", JavaTypes.GetJavaTypeName(typeof(byte)));
+            Assert.AreEqual("java.lang.Byte", JavaTypes.GetJavaTypeName(typeof(byte?)));
+            Assert.AreEqual("java.lang.Byte", JavaTypes.GetJavaTypeName(typeof(sbyte)));
+            Assert.AreEqual("java.lang.Byte", JavaTypes.GetJavaTypeName(typeof(sbyte?)));
+
+            Assert.AreEqual("java.lang.Short", JavaTypes.GetJavaTypeName(typeof(short)));
+            Assert.AreEqual("java.lang.Short", JavaTypes.GetJavaTypeName(typeof(short?)));
+            Assert.AreEqual("java.lang.Short", JavaTypes.GetJavaTypeName(typeof(ushort)));
+            Assert.AreEqual("java.lang.Short", JavaTypes.GetJavaTypeName(typeof(ushort?)));
+
+            Assert.AreEqual("java.lang.Integer", JavaTypes.GetJavaTypeName(typeof(int)));
+            Assert.AreEqual("java.lang.Integer", JavaTypes.GetJavaTypeName(typeof(int?)));
+            Assert.AreEqual("java.lang.Integer", JavaTypes.GetJavaTypeName(typeof(uint)));
+            Assert.AreEqual("java.lang.Integer", JavaTypes.GetJavaTypeName(typeof(uint?)));
+
+            Assert.AreEqual("java.lang.Long", JavaTypes.GetJavaTypeName(typeof(long)));
+            Assert.AreEqual("java.lang.Long", JavaTypes.GetJavaTypeName(typeof(long?)));
+            Assert.AreEqual("java.lang.Long", JavaTypes.GetJavaTypeName(typeof(ulong)));
+            Assert.AreEqual("java.lang.Long", JavaTypes.GetJavaTypeName(typeof(ulong?)));
+
+            Assert.AreEqual("java.lang.Float", JavaTypes.GetJavaTypeName(typeof(float)));
+            Assert.AreEqual("java.lang.Float", JavaTypes.GetJavaTypeName(typeof(float?)));
+
+            Assert.AreEqual("java.lang.Double", JavaTypes.GetJavaTypeName(typeof(double)));
+            Assert.AreEqual("java.lang.Double", JavaTypes.GetJavaTypeName(typeof(double?)));
+
+            Assert.AreEqual("java.math.BigDecimal", JavaTypes.GetJavaTypeName(typeof(decimal)));
+            Assert.AreEqual("java.math.BigDecimal", JavaTypes.GetJavaTypeName(typeof(decimal?)));
+
+            Assert.AreEqual("java.lang.Character", JavaTypes.GetJavaTypeName(typeof(char)));
+            Assert.AreEqual("java.lang.Character", JavaTypes.GetJavaTypeName(typeof(char?)));
+
+            Assert.AreEqual("java.lang.String", JavaTypes.GetJavaTypeName(typeof(string)));
+
+            Assert.AreEqual("java.sql.Timestamp", JavaTypes.GetJavaTypeName(typeof(DateTime)));
+            Assert.AreEqual("java.sql.Timestamp", JavaTypes.GetJavaTypeName(typeof(DateTime?)));
+
+            Assert.AreEqual("java.util.UUID", JavaTypes.GetJavaTypeName(typeof(Guid)));
+            Assert.AreEqual("java.util.UUID", JavaTypes.GetJavaTypeName(typeof(Guid?)));
+        }
+
+        /// <summary>
+        /// Tests the Java to .NET type mapping.
+        /// </summary>
+        [Test]
+        public void TestJavaToDotNetMapping()
+        {
+            Assert.AreEqual(typeof(bool), JavaTypes.GetDotNetType("java.lang.Boolean"));
+            Assert.AreEqual(typeof(byte), JavaTypes.GetDotNetType("java.lang.Byte"));
+            Assert.AreEqual(typeof(short), JavaTypes.GetDotNetType("java.lang.Short"));
+            Assert.AreEqual(typeof(int), JavaTypes.GetDotNetType("java.lang.Integer"));
+            Assert.AreEqual(typeof(long), JavaTypes.GetDotNetType("java.lang.Long"));
+            Assert.AreEqual(typeof(float), JavaTypes.GetDotNetType("java.lang.Float"));
+            Assert.AreEqual(typeof(double), JavaTypes.GetDotNetType("java.lang.Double"));
+            Assert.AreEqual(typeof(decimal), JavaTypes.GetDotNetType("java.math.BigDecimal"));
+            Assert.AreEqual(typeof(char), JavaTypes.GetDotNetType("java.lang.Character"));
+            Assert.AreEqual(typeof(string), JavaTypes.GetDotNetType("java.lang.String"));
+            Assert.AreEqual(typeof(DateTime), JavaTypes.GetDotNetType("java.sql.Timestamp"));
+            Assert.AreEqual(typeof(Guid), JavaTypes.GetDotNetType("java.util.UUID"));
+
+        }
+
+        /// <summary>
+        /// Tests the indirect mapping check.
+        /// </summary>
+        [Test]
+        public void TestIndirectMappingCheck()
+        {
+            Assert.AreEqual(typeof(bool), JavaTypes.GetDirectlyMappedType(typeof(bool)));
+            Assert.AreEqual(typeof(bool?), JavaTypes.GetDirectlyMappedType(typeof(bool?)));
+            Assert.AreEqual(typeof(byte), JavaTypes.GetDirectlyMappedType(typeof(byte)));
+            Assert.AreEqual(typeof(byte?), JavaTypes.GetDirectlyMappedType(typeof(byte?)));
+            Assert.AreEqual(typeof(char), JavaTypes.GetDirectlyMappedType(typeof(char)));
+            Assert.AreEqual(typeof(char?), JavaTypes.GetDirectlyMappedType(typeof(char?)));
+            Assert.AreEqual(typeof(DateTime), JavaTypes.GetDirectlyMappedType(typeof(DateTime)));
+            Assert.AreEqual(typeof(DateTime?), JavaTypes.GetDirectlyMappedType(typeof(DateTime?)));
+            Assert.AreEqual(typeof(decimal), JavaTypes.GetDirectlyMappedType(typeof(decimal)));
+            Assert.AreEqual(typeof(decimal?), JavaTypes.GetDirectlyMappedType(typeof(decimal?)));
+            Assert.AreEqual(typeof(double), JavaTypes.GetDirectlyMappedType(typeof(double)));
+            Assert.AreEqual(typeof(double?), JavaTypes.GetDirectlyMappedType(typeof(double?)));
+            Assert.AreEqual(typeof(float), JavaTypes.GetDirectlyMappedType(typeof(float)));
+            Assert.AreEqual(typeof(float?), JavaTypes.GetDirectlyMappedType(typeof(float?)));
+            Assert.AreEqual(typeof(Guid), JavaTypes.GetDirectlyMappedType(typeof(Guid)));
+            Assert.AreEqual(typeof(Guid?), JavaTypes.GetDirectlyMappedType(typeof(Guid?)));
+            Assert.AreEqual(typeof(int), JavaTypes.GetDirectlyMappedType(typeof(int)));
+            Assert.AreEqual(typeof(int?), JavaTypes.GetDirectlyMappedType(typeof(int?)));
+            Assert.AreEqual(typeof(long), JavaTypes.GetDirectlyMappedType(typeof(long)));
+            Assert.AreEqual(typeof(long?), JavaTypes.GetDirectlyMappedType(typeof(long?)));
+            Assert.AreEqual(typeof(byte), JavaTypes.GetDirectlyMappedType(typeof(sbyte)));
+            Assert.AreEqual(typeof(byte), JavaTypes.GetDirectlyMappedType(typeof(sbyte?)));
+            Assert.AreEqual(typeof(short), JavaTypes.GetDirectlyMappedType(typeof(short)));
+            Assert.AreEqual(typeof(short?), JavaTypes.GetDirectlyMappedType(typeof(short?)));
+            Assert.AreEqual(typeof(string), JavaTypes.GetDirectlyMappedType(typeof(string)));
+            Assert.AreEqual(typeof(int), JavaTypes.GetDirectlyMappedType(typeof(uint)));
+            Assert.AreEqual(typeof(int), JavaTypes.GetDirectlyMappedType(typeof(uint?)));
+            Assert.AreEqual(typeof(long), JavaTypes.GetDirectlyMappedType(typeof(ulong)));
+            Assert.AreEqual(typeof(long), JavaTypes.GetDirectlyMappedType(typeof(ulong?)));
+            Assert.AreEqual(typeof(short), JavaTypes.GetDirectlyMappedType(typeof(ushort)));
+            Assert.AreEqual(typeof(short), JavaTypes.GetDirectlyMappedType(typeof(ushort?)));
+
+            // Arbitrary type.
+            Assert.AreEqual(typeof(JavaTypeMappingTest), JavaTypes.GetDirectlyMappedType(typeof(JavaTypeMappingTest)));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/9fad9c92/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs
new file mode 100644
index 0000000..7d37584
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Binary
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using System.Reflection;
+    using Apache.Ignite.Core.Impl.Binary;
+    using Apache.Ignite.Core.Tests.TestDll;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// <see cref="TypeResolver"/> tests.
+    /// </summary>
+    public class TypeResolverTest
+    {
+        /// <summary>
+        /// Tests generic type resolve.
+        /// </summary>
+        [Test]
+        public void TestGenerics()
+        {
+            var testTypes = new[]
+            {
+                typeof (TestGenericBinarizable<int>),
+                typeof (TestGenericBinarizable<string>),
+                typeof (TestGenericBinarizable<TestGenericBinarizable<int>>),
+                typeof (TestGenericBinarizable<List<Tuple<int, string>>>),
+                typeof (TestGenericBinarizable<List<TestGenericBinarizable<List<Tuple<int, string>>>>>),
+                typeof (List<TestGenericBinarizable<List<TestGenericBinarizable<List<Tuple<int, string>>>>>>),
+                typeof (TestGenericBinarizable<int, string>),
+                typeof (TestGenericBinarizable<int, TestGenericBinarizable<string>>),
+                typeof (TestGenericBinarizable<int, string, Type>),
+                typeof (TestGenericBinarizable<int, string, TestGenericBinarizable<int, string, Type>>)
+            };
+
+            foreach (var type in testTypes)
+            {
+                // Without assembly
+                var resolvedType = new TypeResolver().ResolveType(type.FullName);
+                Assert.AreEqual(type.FullName, resolvedType.FullName);
+                
+                // With assembly
+                resolvedType = new TypeResolver().ResolveType(type.FullName, type.Assembly.FullName);
+                Assert.AreEqual(type.FullName, resolvedType.FullName);
+
+                // Assembly-qualified
+                resolvedType = new TypeResolver().ResolveType(type.AssemblyQualifiedName);
+                Assert.AreEqual(type.FullName, resolvedType.FullName);
+            }
+        }
+
+        /// <summary>
+        /// Tests loading a type from referenced assembly that is not yet loaded.
+        /// </summary>
+        [Test]
+        public void TestReferencedAssemblyLoading()
+        {
+            const string dllName = "Apache.Ignite.Core.Tests.TestDll";
+
+            const string typeName = "Apache.Ignite.Core.Tests.TestDll.TestClass";
+
+            // Check that the dll is not yet loaded
+            Assert.IsFalse(AppDomain.CurrentDomain.GetAssemblies().Any(x => x.FullName.StartsWith(dllName)));
+
+            // Check that the dll is referenced by current assembly
+            Assert.IsTrue(Assembly.GetExecutingAssembly().GetReferencedAssemblies()
+                .Any(x => x.FullName.StartsWith(dllName)));
+
+            // Check resolver
+            var type = new TypeResolver().ResolveType(typeName);
+            
+            Assert.IsNotNull(type);
+            Assert.AreEqual(typeName, type.FullName);
+            Assert.IsNotNull(Activator.CreateInstance(type));
+
+            // At this moment the dll should be loaded
+            Assert.IsTrue(AppDomain.CurrentDomain.GetAssemblies().Any(x => x.FullName.StartsWith(dllName)));
+        }
+
+        /// <summary>
+        /// Unused method that forces C# compiler to include TestDll assembly reference.
+        /// Without this, compiler will remove the reference as unused.
+        /// However, since it is never called, TestDll does not get loaded.
+        /// </summary>
+        public void UnusedMethod()
+        {
+            Assert.IsNotNull(typeof(TestClass));
+        }        
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/9fad9c92/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
index d5f98ac..7cb999f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
@@ -150,6 +150,11 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
                     Assert.AreEqual(2, cursor.GetAll().Single().Key);
                 }
 
+                using (var cursor = cache.Query(new SqlQuery(typeof(AttributeQueryPerson), "salary > ?", 10)))
+                {
+                    Assert.AreEqual(2, cursor.GetAll().Single().Key);
+                }
+
                 using (var cursor = cache.Query(new SqlQuery(typeof(AttributeQueryPerson), "Country = ?", "USA")))
                 {
                     Assert.AreEqual(1, cursor.GetAll().Single().Key);
@@ -186,6 +191,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
             {
                 Name = name;
                 Age = age;
+                Salary = age;
             }
 
             /// <summary>
@@ -214,6 +220,12 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
             /// </value>
             [QuerySqlField]
             public AttributeQueryAddress Address { get; set; }
+
+            /// <summary>
+            /// Gets or sets the salary.
+            /// </summary>
+            [QuerySqlField]
+            public decimal? Salary { get; set; }
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/9fad9c92/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TypeResolverTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TypeResolverTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TypeResolverTest.cs
deleted file mode 100644
index a95ecd7..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TypeResolverTest.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-namespace Apache.Ignite.Core.Tests
-{
-    using System;
-    using System.Collections.Generic;
-    using System.Linq;
-    using System.Reflection;
-    using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Tests.TestDll;
-    using NUnit.Framework;
-
-    /// <summary>
-    /// <see cref="TypeResolver"/> tests.
-    /// </summary>
-    public class TypeResolverTest
-    {
-        /// <summary>
-        /// Tests generic type resolve.
-        /// </summary>
-        [Test]
-        public void TestGenerics()
-        {
-            var testTypes = new[]
-            {
-                typeof (TestGenericBinarizable<int>),
-                typeof (TestGenericBinarizable<string>),
-                typeof (TestGenericBinarizable<TestGenericBinarizable<int>>),
-                typeof (TestGenericBinarizable<List<Tuple<int, string>>>),
-                typeof (TestGenericBinarizable<List<TestGenericBinarizable<List<Tuple<int, string>>>>>),
-                typeof (List<TestGenericBinarizable<List<TestGenericBinarizable<List<Tuple<int, string>>>>>>),
-                typeof (TestGenericBinarizable<int, string>),
-                typeof (TestGenericBinarizable<int, TestGenericBinarizable<string>>),
-                typeof (TestGenericBinarizable<int, string, Type>),
-                typeof (TestGenericBinarizable<int, string, TestGenericBinarizable<int, string, Type>>)
-            };
-
-            foreach (var type in testTypes)
-            {
-                // Without assembly
-                var resolvedType = new TypeResolver().ResolveType(type.FullName);
-                Assert.AreEqual(type.FullName, resolvedType.FullName);
-                
-                // With assembly
-                resolvedType = new TypeResolver().ResolveType(type.FullName, type.Assembly.FullName);
-                Assert.AreEqual(type.FullName, resolvedType.FullName);
-
-                // Assembly-qualified
-                resolvedType = new TypeResolver().ResolveType(type.AssemblyQualifiedName);
-                Assert.AreEqual(type.FullName, resolvedType.FullName);
-            }
-        }
-
-        /// <summary>
-        /// Tests loading a type from referenced assembly that is not yet loaded.
-        /// </summary>
-        [Test]
-        public void TestReferencedAssemblyLoading()
-        {
-            const string dllName = "Apache.Ignite.Core.Tests.TestDll";
-
-            const string typeName = "Apache.Ignite.Core.Tests.TestDll.TestClass";
-
-            // Check that the dll is not yet loaded
-            Assert.IsFalse(AppDomain.CurrentDomain.GetAssemblies().Any(x => x.FullName.StartsWith(dllName)));
-
-            // Check that the dll is referenced by current assembly
-            Assert.IsTrue(Assembly.GetExecutingAssembly().GetReferencedAssemblies()
-                .Any(x => x.FullName.StartsWith(dllName)));
-
-            // Check resolver
-            var type = new TypeResolver().ResolveType(typeName);
-            
-            Assert.IsNotNull(type);
-            Assert.AreEqual(typeName, type.FullName);
-            Assert.IsNotNull(Activator.CreateInstance(type));
-
-            // At this moment the dll should be loaded
-            Assert.IsTrue(AppDomain.CurrentDomain.GetAssemblies().Any(x => x.FullName.StartsWith(dllName)));
-        }
-
-        /// <summary>
-        /// Unused method that forces C# compiler to include TestDll assembly reference.
-        /// Without this, compiler will remove the reference as unused.
-        /// However, since it is never called, TestDll does not get loaded.
-        /// </summary>
-        public void UnusedMethod()
-        {
-            Assert.IsNotNull(typeof(TestClass));
-        }        
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/9fad9c92/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/JavaTypes.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/JavaTypes.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/JavaTypes.cs
index 109d55f..7d71280 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/JavaTypes.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/JavaTypes.cs
@@ -45,8 +45,7 @@ namespace Apache.Ignite.Core.Impl.Binary
             {typeof (string), "java.lang.String"},
             {typeof (decimal), "java.math.BigDecimal"},
             {typeof (Guid), "java.util.UUID"},
-            {typeof (DateTime), "java.sql.Timestamp"},
-            {typeof (DateTime?), "java.sql.Timestamp"},
+            {typeof (DateTime), "java.sql.Timestamp"}
         };
 
         /** */
@@ -70,6 +69,9 @@ namespace Apache.Ignite.Core.Impl.Binary
             if (type == null)
                 return null;
 
+            // Unwrap nullable.
+            type = Nullable.GetUnderlyingType(type) ?? type;
+
             string res;
 
             return NetToJava.TryGetValue(type, out res) ? res : null;
@@ -83,8 +85,9 @@ namespace Apache.Ignite.Core.Impl.Binary
             if (type == null)
                 return;
 
-            Type directType;
-            if (!IndirectMappingTypes.TryGetValue(type, out directType))
+            var directType = GetDirectlyMappedType(type);
+
+            if (directType == type)
                 return;
 
             log.Warn("{0}: Type '{1}' maps to Java type '{2}' using unchecked conversion. " +
@@ -94,6 +97,19 @@ namespace Apache.Ignite.Core.Impl.Binary
         }
 
         /// <summary>
+        /// Gets the compatible type that maps directly to Java.
+        /// </summary>
+        public static Type GetDirectlyMappedType(Type type)
+        {
+            // Unwrap nullable.
+            var unwrapType = Nullable.GetUnderlyingType(type) ?? type;
+
+            Type directType;
+
+            return IndirectMappingTypes.TryGetValue(unwrapType, out directType) ? directType : type;
+        }
+
+        /// <summary>
         /// Gets .NET type that corresponds to specified Java type name.
         /// </summary>
         /// <param name="javaTypeName">Name of the java type.</param>