Skip to content

Commit 1870608

Browse files
committed
#20 - Add AnnotationUsage#toAnnotation
1 parent 0e34134 commit 1870608

20 files changed

+183
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
* Copyright: Red Hat Inc. and Hibernate Authors
6+
*/
7+
8+
package org.hibernate.models.internal;
9+
10+
import java.lang.annotation.Annotation;
11+
import java.lang.reflect.InvocationHandler;
12+
import java.lang.reflect.Method;
13+
import java.lang.reflect.Proxy;
14+
import java.util.Map;
15+
16+
import org.hibernate.models.spi.AnnotationDescriptor;
17+
import org.hibernate.models.spi.AttributeDescriptor;
18+
19+
/**
20+
* @author Steve Ebersole
21+
*/
22+
public class AnnotationProxy<A extends Annotation> implements InvocationHandler {
23+
private final AnnotationDescriptor<A> annotationDescriptor;
24+
private final Map<String,?> valueMap;
25+
26+
public AnnotationProxy(AnnotationDescriptor<A> annotationDescriptor, Map<String, ?> valueMap) {
27+
this.annotationDescriptor = annotationDescriptor;
28+
this.valueMap = valueMap;
29+
}
30+
31+
@Override
32+
public Object invoke(Object proxy, Method method, Object[] args) {
33+
final AttributeDescriptor<Object> attributeDescriptor = annotationDescriptor.getAttribute( method.getName() );
34+
return attributeDescriptor.getTypeDescriptor().unwrap( valueMap.get( method.getName() ) );
35+
}
36+
37+
38+
public static <A extends Annotation> A makeProxy(
39+
AnnotationDescriptor<A> descriptor,
40+
Map<String,?> valueMap) {
41+
final AnnotationProxy<A> handler = new AnnotationProxy<>( descriptor, valueMap );
42+
//noinspection unchecked
43+
return (A) Proxy.newProxyInstance(
44+
AnnotationProxy.class.getClassLoader(),
45+
new Class<?>[] { descriptor.getAnnotationType() },
46+
handler
47+
);
48+
}
49+
50+
}

src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,13 @@ public ValueWrapper<List<V>,Object[]> resolveJkWrapper(SourceModelBuildingContex
120120
}
121121
return jdkValueWrapper;
122122
}
123+
124+
@Override
125+
public Object unwrap(List<V> value) {
126+
final Object[] result = new Object[value.size()];
127+
for ( int i = 0; i < value.size(); i++ ) {
128+
result[i] = elementTypeDescriptor.unwrap( value.get(i) );
129+
}
130+
return result;
131+
}
123132
}

src/main/java/org/hibernate/models/internal/BooleanTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public ValueExtractor<Annotation, Boolean> createJdkExtractor(SourceModelBuildin
5454
//noinspection unchecked
5555
return PassThruExtractor.PASS_THRU_EXTRACTOR;
5656
}
57+
58+
@Override
59+
public Object unwrap(Boolean value) {
60+
return value;
61+
}
5762
}

src/main/java/org/hibernate/models/internal/ByteTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public ValueExtractor<Annotation, Byte> createJdkExtractor(SourceModelBuildingCo
5454
//noinspection unchecked
5555
return PassThruExtractor.PASS_THRU_EXTRACTOR;
5656
}
57+
58+
@Override
59+
public Object unwrap(Byte value) {
60+
return value;
61+
}
5762
}

src/main/java/org/hibernate/models/internal/CharacterTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public ValueExtractor<Annotation, Character> createJdkExtractor(SourceModelBuild
5454
//noinspection unchecked
5555
return PassThruExtractor.PASS_THRU_EXTRACTOR;
5656
}
57+
58+
@Override
59+
public Object unwrap(Character value) {
60+
return value;
61+
}
5762
}

src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,9 @@ public ValueExtractor<AnnotationInstance, ClassDetails> createJandexExtractor(So
5050
public ValueExtractor<Annotation, ClassDetails> createJdkExtractor(SourceModelBuildingContext buildingContext) {
5151
return org.hibernate.models.internal.jdk.ClassValueExtractor.JDK_CLASS_EXTRACTOR;
5252
}
53+
54+
@Override
55+
public Object unwrap(ClassDetails value) {
56+
return value.toJavaClass();
57+
}
5358
}

src/main/java/org/hibernate/models/internal/DoubleTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public ValueExtractor<Annotation, Double> createJdkExtractor(SourceModelBuilding
5454
//noinspection unchecked
5555
return PassThruExtractor.PASS_THRU_EXTRACTOR;
5656
}
57+
58+
@Override
59+
public Object unwrap(Double value) {
60+
return value;
61+
}
5762
}

src/main/java/org/hibernate/models/internal/EnumTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,9 @@ public ValueExtractor<Annotation, E> createJdkExtractor(SourceModelBuildingConte
6363
//noinspection unchecked
6464
return PassThruExtractor.PASS_THRU_EXTRACTOR;
6565
}
66+
67+
@Override
68+
public Object unwrap(E value) {
69+
return value;
70+
}
6671
}

src/main/java/org/hibernate/models/internal/FloatTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public ValueExtractor<Annotation, Float> createJdkExtractor(SourceModelBuildingC
5454
//noinspection unchecked
5555
return PassThruExtractor.PASS_THRU_EXTRACTOR;
5656
}
57+
58+
@Override
59+
public Object unwrap(Float value) {
60+
return value;
61+
}
5762
}

src/main/java/org/hibernate/models/internal/IntegerTypeDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public ValueExtractor<Annotation, Integer> createJdkExtractor(SourceModelBuildin
5454
//noinspection unchecked
5555
return PassThruExtractor.PASS_THRU_EXTRACTOR;
5656
}
57+
58+
@Override
59+
public Object unwrap(Integer value) {
60+
return value;
61+
}
5762
}

0 commit comments

Comments
 (0)