Skip to content

Commit 1a801a1

Browse files
committed
wip
1 parent 3b9bc51 commit 1a801a1

6 files changed

Lines changed: 160 additions & 0 deletions

File tree

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
</properties>
2222

2323
<dependencies>
24+
<dependency>
25+
<groupId>org.springframework.boot</groupId>
26+
<artifactId>spring-boot-starter-data-jpa</artifactId>
27+
</dependency>
28+
2429
<dependency>
2530
<groupId>org.springframework.boot</groupId>
2631
<artifactId>spring-boot-starter-validation</artifactId>
@@ -41,6 +46,13 @@
4146
<version>1.9.0</version>
4247
</dependency>
4348

49+
<!-- Utilities -->
50+
<dependency>
51+
<groupId>org.projectlombok</groupId>
52+
<artifactId>lombok</artifactId>
53+
<optional>true</optional>
54+
</dependency>
55+
4456
<!-- Testing -->
4557
<dependency>
4658
<groupId>org.springframework.boot</groupId>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package it.aboutbits.springboot.toolbox.persistence;
2+
3+
public interface WrappedValue<T> {
4+
T value();
5+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package it.aboutbits.springboot.toolbox.persistence.identity;
2+
3+
import it.aboutbits.springboot.toolbox.persistence.WrappedValue;
4+
5+
import java.io.Serializable;
6+
7+
/**
8+
* The Identity interface represents a serializable entity that wraps a value.
9+
* A class implementing Identity is considered to be the primary key of an entity type.
10+
*
11+
* @param <T> the type of the value being wrapped
12+
*/
13+
public interface Identity<T> extends WrappedValue<T>, Serializable {
14+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package it.aboutbits.springboot.toolbox.persistence.javatype;
2+
3+
import it.aboutbits.springboot.toolbox.persistence.WrappedValue;
4+
import lombok.SneakyThrows;
5+
import org.hibernate.type.descriptor.WrapperOptions;
6+
import org.hibernate.type.descriptor.java.AbstractClassJavaType;
7+
import org.hibernate.type.descriptor.jdbc.JdbcType;
8+
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
9+
10+
import java.lang.reflect.InvocationTargetException;
11+
import java.sql.Types;
12+
13+
public abstract class WrappedLongJavaType<T extends WrappedValue<Long>> extends AbstractClassJavaType<T> {
14+
protected WrappedLongJavaType(Class<T> type) {
15+
super(type);
16+
}
17+
18+
@Override
19+
public JdbcType getRecommendedJdbcType(JdbcTypeIndicators indicators) {
20+
return indicators.getTypeConfiguration()
21+
.getJdbcTypeRegistry()
22+
.getDescriptor(Types.BIGINT);
23+
}
24+
25+
@Override
26+
public <X> X unwrap(T id, Class<X> aClass, WrapperOptions wrapperOptions) {
27+
var javaTypeClass = getJavaTypeClass();
28+
29+
if (id == null) {
30+
return null;
31+
}
32+
if (javaTypeClass.isAssignableFrom(aClass)) {
33+
return (X) id;
34+
}
35+
if (Long.class.isAssignableFrom(aClass)) {
36+
return (X) id.value();
37+
}
38+
throw unknownUnwrap(aClass);
39+
}
40+
41+
@SneakyThrows({InstantiationException.class, IllegalAccessException.class, InvocationTargetException.class})
42+
@Override
43+
public <X> T wrap(X value, WrapperOptions wrapperOptions) {
44+
var clazz = getJavaTypeClass();
45+
46+
if (value == null) {
47+
return null;
48+
}
49+
if (clazz.isInstance(value)) {
50+
return (T) value;
51+
}
52+
if (value instanceof Long longValue) {
53+
return (T) clazz.getConstructors()[0].newInstance(longValue);
54+
}
55+
if (value instanceof String stringValue) {
56+
return (T) clazz.getConstructors()[0].newInstance(Long.parseLong(stringValue));
57+
}
58+
throw unknownWrap(value.getClass());
59+
}
60+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package it.aboutbits.springboot.toolbox.persistence.javatype;
2+
3+
import it.aboutbits.springboot.toolbox.persistence.WrappedValue;
4+
import lombok.SneakyThrows;
5+
import org.hibernate.type.descriptor.WrapperOptions;
6+
import org.hibernate.type.descriptor.java.AbstractClassJavaType;
7+
import org.hibernate.type.descriptor.jdbc.JdbcType;
8+
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
9+
10+
import java.lang.reflect.InvocationTargetException;
11+
import java.sql.Types;
12+
13+
public abstract class WrappedStringJavaType<T extends WrappedValue<String>> extends AbstractClassJavaType<T> {
14+
protected WrappedStringJavaType(Class<T> type) {
15+
super(type);
16+
}
17+
18+
@Override
19+
public JdbcType getRecommendedJdbcType(JdbcTypeIndicators indicators) {
20+
return indicators.getTypeConfiguration()
21+
.getJdbcTypeRegistry()
22+
.getDescriptor(Types.VARCHAR);
23+
}
24+
25+
@Override
26+
public <X> X unwrap(T id, Class<X> aClass, WrapperOptions wrapperOptions) {
27+
var javaTypeClass = getJavaTypeClass();
28+
29+
if (id == null) {
30+
return null;
31+
}
32+
if (javaTypeClass.isAssignableFrom(aClass)) {
33+
return (X) id;
34+
}
35+
if (String.class.isAssignableFrom(aClass)) {
36+
return (X) id.value();
37+
}
38+
throw unknownUnwrap(aClass);
39+
}
40+
41+
@SneakyThrows({InstantiationException.class, IllegalAccessException.class, InvocationTargetException.class})
42+
@Override
43+
public <X> T wrap(X value, WrapperOptions wrapperOptions) {
44+
var clazz = getJavaTypeClass();
45+
46+
if (value == null) {
47+
return null;
48+
}
49+
if (clazz.isInstance(value)) {
50+
return (T) value;
51+
}
52+
if (value instanceof String stringValue) {
53+
return (T) clazz.getConstructors()[0].newInstance(stringValue);
54+
}
55+
throw unknownWrap(value.getClass());
56+
}
57+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package it.aboutbits.springboot.toolbox.persistence.type;
2+
3+
import org.hibernate.annotations.JavaTypeRegistrations;
4+
5+
@JavaTypeRegistrations({
6+
/*@JavaTypeRegistration(
7+
javaType = ID.class,
8+
descriptorClass = IdJavaType.class
9+
)*/
10+
})
11+
public abstract class ToolboxTypeConfig {
12+
}

0 commit comments

Comments
 (0)