add first version of BigDecimal (still unclear if we want to keep the UserType) ...
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 3 Dec 2014 09:21:29 +0000 (09:21 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 3 Dec 2014 09:21:29 +0000 (09:21 +0000)
.gitattributes
cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserType.java [new file with mode: 0644]
cdmlib-model/src/test/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserTypeTest.java [new file with mode: 0644]
cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/BigDecimalTesting.java [new file with mode: 0644]

index 6b128df2a6543fb154bbe04571210579ecce16e5..fee01ef9c29ad80809cdf97ba420ea7b7d1de17a 100644 (file)
@@ -661,6 +661,7 @@ cdmlib-model/LICENSE.TXT -text
 cdmlib-model/README.TXT -text
 cdmlib-model/pom.xml -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/aspectj/PropertyChangeAspect.aj -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserType.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/DOIUserType.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/EnumUserType.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/HibernateProxyHelper.java -text
@@ -1119,6 +1120,7 @@ cdmlib-model/src/main/resources/update/update_r2.1.2.2_r2.4.1.2.mysql.sql -text
 cdmlib-model/src/main/resources/update/update_term_r2.4.2.1-r2.4.2.2.mysql.sql -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/aspectj/PropertyChangeTest.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/datagenerator/TaxonGenerator.java -text
+cdmlib-model/src/test/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserTypeTest.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/DatabaseInitialiser.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/agent/AgentValidationTest.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/agent/InstitutionalMembershipTest.java -text
@@ -1205,6 +1207,7 @@ cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserIm
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/ParserProblemTest.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/TimePeriodParserTest.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/location/CoordinateConverterTest.java -text
+cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/BigDecimalTesting.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/TestFullReferenceParser.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/TestModel.java -text
 cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/TestRegExs.java -text
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserType.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserType.java
new file mode 100644 (file)
index 0000000..ee55aba
--- /dev/null
@@ -0,0 +1,106 @@
+/**\r
+ * \r
+ */\r
+package eu.etaxonomy.cdm.hibernate;\r
+\r
+import java.io.Serializable;\r
+import java.math.BigDecimal;\r
+import java.sql.PreparedStatement;\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.sql.Types;\r
+\r
+import org.hibernate.HibernateException;\r
+import org.hibernate.engine.spi.SessionImplementor;\r
+import org.hibernate.type.StandardBasicTypes;\r
+import org.hibernate.usertype.UserType;\r
+\r
+/**\r
+ * This software is public domain and carries NO WARRANTY.\r
+ *\r
+ * Patches, bug reports and feature requests welcome:\r
+ *\r
+ * https://bitbucket.org/ratkins/bigdecimalusertype/\r
+ */\r
+public class BigDecimalUserType implements UserType {\r
+\r
+       private static final int[] SQL_TYPES = new int[] {Types.DECIMAL, Types.INTEGER};\r
+\r
+       @Override\r
+       public Object assemble(Serializable arg0, Object arg1) throws HibernateException {\r
+               return deepCopy(arg0);\r
+       }\r
+\r
+       @Override\r
+       public Object deepCopy(Object arg0) throws HibernateException {\r
+               return arg0;\r
+       }\r
+\r
+       @Override\r
+       public Serializable disassemble(Object arg0) throws HibernateException {\r
+               return (Serializable) arg0;\r
+       }\r
+\r
+       @Override\r
+       public boolean equals(Object arg0, Object arg1) throws HibernateException {\r
+               return arg0.equals(arg1);\r
+       }\r
+\r
+       @Override\r
+       public int hashCode(Object arg0) throws HibernateException {\r
+               return arg0.hashCode();\r
+       }\r
+\r
+       @Override\r
+       public boolean isMutable() {\r
+               return false;\r
+       }\r
+\r
+       @Override\r
+       public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {\r
+               BigDecimal bigDecimal = (BigDecimal) StandardBasicTypes.BIG_DECIMAL.nullSafeGet(rs, names, session, owner);\r
+\r
+//             BigDecimal bigDecimal = rs.getBigDecimal(names[0]);\r
+               if (bigDecimal == null) {\r
+                       return null;\r
+               }\r
+               return bigDecimal.setScale(rs.getInt(names[1]), BigDecimal.ROUND_HALF_UP);\r
+       }\r
+       \r
+\r
+       @Override\r
+       public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {\r
+               if (value == null) {\r
+                       StandardBasicTypes.BIG_DECIMAL.nullSafeSet(st, null, index, session);\r
+                       StandardBasicTypes.INTEGER.nullSafeSet(st, null, index, session);\r
+                       \r
+//                     st.setNull(index, Types.DECIMAL);\r
+//                     st.setNull(index + 1, Types.INTEGER);\r
+               } else {\r
+                       BigDecimal bdec = (BigDecimal)value;\r
+//                     st.setBigDecimal(index, bdec);\r
+//                     st.setInt(index + 1, bdec.scale());\r
+                       StandardBasicTypes.BIG_DECIMAL.nullSafeSet(st, bdec, index, session);\r
+                       StandardBasicTypes.INTEGER.nullSafeSet(st, bdec.scale(), index + 1, session);\r
+               }\r
+       }\r
+       \r
+\r
+       @Override\r
+       public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {\r
+               return arg0;\r
+       }\r
+\r
+       @Override\r
+       public Class<?> returnedClass() {\r
+               return BigDecimal.class;\r
+       }\r
+\r
+       @Override\r
+       public int[] sqlTypes() {\r
+               return SQL_TYPES;\r
+       }\r
+\r
+\r
+\r
+}\r
diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserTypeTest.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/hibernate/BigDecimalUserTypeTest.java
new file mode 100644 (file)
index 0000000..33f9dc5
--- /dev/null
@@ -0,0 +1,130 @@
+//package eu.etaxonomy.cdm.hibernate;\r
+//\r
+//import static org.junit.Assert.*;\r
+//\r
+//import org.junit.Test;\r
+//\r
+//import static org.hamcrest.Matchers.*;\r
+//import static org.junit.Assert.*;\r
+//import static org.mockito.Mockito.*;\r
+//\r
+//import java.math.*;\r
+//import java.sql.*;\r
+//\r
+//import org.hibernate.usertype.*;\r
+//import org.junit.*;\r
+//import org.junit.runner.*;\r
+//import org.mockito.*;\r
+//import org.mockito.runners.*;\r
+//\r
+///**\r
+// * This software is public domain and carries NO WARRANTY.\r
+// *\r
+// * Patches, bug reports and feature requests welcome:\r
+// *\r
+// * https://bitbucket.org/ratkins/bigdecimalusertype/\r
+// */\r
+//@RunWith(MockitoJUnitRunner.class)\r
+//public class BigDecimalUserTypeTest {\r
+//     \r
+//     @Mock ResultSet rs;\r
+//     @Mock PreparedStatement st;\r
+//     \r
+//     private UserType userType;\r
+//\r
+//     @Before\r
+//     public void setUp() throws Exception {\r
+//             userType = new BigDecimalUserType();\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testNotMutable() throws Exception {\r
+//             assertThat(userType.isMutable(), equalTo(false));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testDeepCopyReturnsSelf() throws Exception {\r
+//             BigDecimal foo = new BigDecimal("1.0");\r
+//             assertThat((BigDecimal) userType.deepCopy(foo), sameInstance(foo));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testReturnedClassIsBigDecimal() throws Exception {\r
+////           The Eclipse compiler passes this, the jdk on the command line one doesn't\r
+////           assertThat(userType.returnedClass(), equalTo(BigDecimal.class));\r
+//             assertTrue(userType.returnedClass() == BigDecimal.class);\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testEqualsDelegatesToBigDecimalEquals() throws Exception {\r
+//             assertThat(userType.equals(new BigDecimal("1.0"), new BigDecimal("1.0")), equalTo(true));\r
+//             assertThat(userType.equals(new BigDecimal("1.0"), new BigDecimal("2.0")), equalTo(false));\r
+//             assertThat(userType.equals(new BigDecimal("1.0"), new BigDecimal("1.00")), equalTo(false));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testHashCodeDelegatesToBigDecimalHashCode() throws Exception {\r
+//             assertThat(userType.hashCode(new BigDecimal("1.0")), equalTo(new BigDecimal("1.0").hashCode()));\r
+//             assertThat(userType.hashCode(new BigDecimal("1.00")), not(equalTo(new BigDecimal("1.0").hashCode())));\r
+//             assertThat(userType.hashCode(new BigDecimal("1.0")), not(equalTo(new BigDecimal("2.0").hashCode())));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testAssembleReturnsSelf() throws Exception {\r
+//             BigDecimal foo = new BigDecimal("1.0");\r
+//             assertThat((BigDecimal) userType.assemble(foo, null), sameInstance(foo));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testDisassembleReturnsSelf() throws Exception {\r
+//             BigDecimal foo = new BigDecimal("1.0");\r
+//             assertThat((BigDecimal) userType.disassemble(foo), sameInstance(foo));\r
+//             assertThat((BigDecimal) userType.disassemble(null), equalTo((BigDecimal) null));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testReplaceReturnsSelf() throws Exception {\r
+//             BigDecimal foo = new BigDecimal("1.0");\r
+//             assertThat((BigDecimal) userType.replace(foo, null, null), sameInstance(foo));\r
+//             assertThat((BigDecimal) userType.disassemble(null), equalTo((BigDecimal) null));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testSqlTypesAreNumberAndInteger() throws Exception {\r
+//             assertThat(userType.sqlTypes().length, equalTo(2));\r
+//             assertThat(userType.sqlTypes()[0], equalTo(Types.DECIMAL));\r
+//             assertThat(userType.sqlTypes()[1], equalTo(Types.INTEGER));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testNullSafeGet() throws Exception {\r
+//             when(rs.getBigDecimal("a")).thenReturn(new BigDecimal("1.000000"));\r
+//             when(rs.getInt("b")).thenReturn(1);\r
+//             \r
+//             assertThat((BigDecimal) userType.nullSafeGet(rs, new String[] {"a", "b"}, null), equalTo(new BigDecimal("1.0")));\r
+//     }\r
+//\r
+//     @Test\r
+//     public void testNullSafeGetWithNull() throws Exception {\r
+//             when(rs.getBigDecimal("a")).thenReturn(null);\r
+//             when(rs.getInt("b")).thenReturn(0);\r
+//             \r
+//             assertThat((BigDecimal) userType.nullSafeGet(rs, new String[] {"a", "b"}, null), equalTo((BigDecimal) null));\r
+//     }\r
+//     \r
+//     @Test\r
+//     public void testNullSafeSet() throws Exception {\r
+//             userType.nullSafeSet(st, new BigDecimal("1.000"), 17);\r
+//             \r
+//             verify(st).setBigDecimal(17, new BigDecimal("1.000"));\r
+//             verify(st).setInt(18, 3);\r
+//     }\r
+//\r
+//     @Test\r
+//     public void testNullSafeSetWithNull() throws Exception {\r
+//             userType.nullSafeSet(st, null, 17);\r
+//             \r
+//             verify(st).setNull(17, Types.DECIMAL);\r
+//             verify(st).setNull(18, Types.INTEGER);\r
+//     }\r
+//}
\ No newline at end of file
diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/BigDecimalTesting.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/BigDecimalTesting.java
new file mode 100644 (file)
index 0000000..1050687
--- /dev/null
@@ -0,0 +1,34 @@
+package eu.etaxonomy.cdm.test.function;\r
+\r
+import java.math.BigDecimal;\r
+\r
+public class BigDecimalTesting {\r
+\r
+       public static void main (String[] args){\r
+               BigDecimal a = new BigDecimal(2.05);\r
+//             a = a.round(MathContext.DECIMAL128);\r
+               \r
+               System.out.println(a.toPlainString());\r
+               \r
+//             a = a.multiply(BigDecimal);\r
+               System.out.println(a.toPlainString());\r
+               \r
+               System.out.println(a.toString());\r
+               \r
+               System.out.println(a.toEngineeringString());\r
+               BigDecimal b = a.setScale(7, BigDecimal.ROUND_HALF_DOWN);\r
+               \r
+               BigDecimal c = new BigDecimal(33.12345).setScale(7, BigDecimal.ROUND_HALF_UP);\r
+               a = a.add(c);\r
+               \r
+               \r
+               \r
+               System.out.println(a.toPlainString());\r
+               System.out.println(b.add(c).toPlainString());\r
+               \r
+               BigDecimal d = c.add(new BigDecimal(100));\r
+               System.out.println(d.toPlainString());\r
+\r
+               \r
+       }\r
+}\r