Skip to content

Commit 2d53f05

Browse files
committed
#78 - Investigate alternative approach to AnnotationUsage using Annotation interface subclassing
1 parent 5781af0 commit 2d53f05

File tree

158 files changed

+4773
-3032
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

158 files changed

+4773
-3032
lines changed

buildSrc/src/main/groovy/release-process.gradle

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ def releasePreparationTask = tasks.register( "releasePreparation" ) {
3535
dependsOn tasks.named( "compile" )
3636

3737
doFirst {
38-
logger.lifecycle "Release version : {}", releaseVersion
38+
logger.lifecycle "Release version : {}", releaseVersion
3939
logger.lifecycle "Development version : {}", developmentVersion
40+
logger.lifecycle " - same version? : {}", releaseVersion == developmentVersion
4041

4142
logger.lifecycle "Switching to branch {}", gitBranch
4243
executeGitCommand('checkout', gitBranch)
@@ -61,6 +62,7 @@ def changeToReleaseVersionTask = tasks.register( "changeToReleaseVersion" ) {
6162
dependsOn releasePreparationTask
6263
onlyIf {
6364
releasePreparationTask.get().didWork
65+
&& releaseVersion != developmentVersion
6466
}
6567

6668
doFirst {
@@ -105,6 +107,7 @@ tasks.register( "prepareForRelease" ) {
105107
def tagReleaseTask = tasks.register( "tagRelease" ) {
106108
onlyIf {
107109
changeToReleaseVersionTask.get().didWork
110+
&& releaseVersion != developmentVersion
108111
}
109112

110113
doLast {
@@ -119,6 +122,11 @@ def changeToDevelopmentVersionTask = tasks.register( 'changeToDevelopmentVersion
119122

120123
dependsOn tagReleaseTask
121124

125+
onlyIf {
126+
changeToReleaseVersionTask.get().didWork
127+
&& releaseVersion != developmentVersion
128+
}
129+
122130
doFirst {
123131
logger.lifecycle( "Updating version-file to development-version : `${developmentVersion}`" )
124132
updateVersionFile( developmentVersion )
@@ -134,6 +142,11 @@ def changeToDevelopmentVersionTask = tasks.register( 'changeToDevelopmentVersion
134142
def pushToGitTask = tasks.register( 'pushToGit' ) {
135143
dependsOn changeToDevelopmentVersionTask
136144

145+
onlyIf {
146+
changeToReleaseVersionTask.get().didWork
147+
&& releaseVersion != developmentVersion
148+
}
149+
137150
doLast {
138151
def gitRemote = determineGitRemote( project )
139152
logger.lifecycle "Pushing branch and tag to Git : {}", gitRemote
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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;
9+
10+
/**
11+
* Generally indicates an attempt to call an unknown/unhandled method on an annotation
12+
* {@linkplain org.hibernate.models.internal.AnnotationProxy proxy}.
13+
*
14+
* @author Steve Ebersole
15+
*/
16+
public class UnhandledMethodException extends ModelsException {
17+
public UnhandledMethodException(String message) {
18+
super( message );
19+
}
20+
21+
public UnhandledMethodException(String message, Throwable cause) {
22+
super( message, cause );
23+
}
24+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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.util.Collection;
12+
import java.util.EnumSet;
13+
14+
import org.hibernate.models.IllegalCastException;
15+
import org.hibernate.models.spi.AnnotationDescriptor;
16+
import org.hibernate.models.spi.FieldDetails;
17+
import org.hibernate.models.spi.MethodDetails;
18+
import org.hibernate.models.spi.MutableClassDetails;
19+
import org.hibernate.models.spi.MutableMemberDetails;
20+
import org.hibernate.models.spi.RecordComponentDetails;
21+
import org.hibernate.models.spi.SourceModelBuildingContext;
22+
23+
/**
24+
* Base support for {@link AnnotationDescriptor} implementations
25+
*
26+
* @author Steve Ebersole
27+
*/
28+
public abstract class AbstractAnnotationDescriptor<A extends Annotation>
29+
extends AbstractAnnotationTarget
30+
implements AnnotationDescriptor<A> {
31+
private final Class<A> annotationType;
32+
private final EnumSet<Kind> allowableTargets;
33+
34+
private final boolean inherited;
35+
private final AnnotationDescriptor<?> repeatableContainer;
36+
37+
public AbstractAnnotationDescriptor(
38+
Class<A> annotationType,
39+
EnumSet<Kind> allowableTargets,
40+
boolean inherited,
41+
AnnotationDescriptor<?> repeatableContainer) {
42+
this.annotationType = annotationType;
43+
this.allowableTargets = allowableTargets;
44+
this.inherited = inherited;
45+
this.repeatableContainer = repeatableContainer;
46+
}
47+
48+
@Override
49+
public Class<A> getAnnotationType() {
50+
return annotationType;
51+
}
52+
53+
@Override
54+
public String getName() {
55+
return annotationType.getName();
56+
}
57+
58+
@Override
59+
public EnumSet<Kind> getAllowableTargets() {
60+
return allowableTargets;
61+
}
62+
63+
@Override
64+
public boolean isInherited() {
65+
return inherited;
66+
}
67+
68+
@Override
69+
public AnnotationDescriptor<?> getRepeatableContainer() {
70+
return repeatableContainer;
71+
}
72+
73+
@Override
74+
public Collection<? extends Annotation> getDirectAnnotationUsages() {
75+
return getUsageMap().values();
76+
}
77+
78+
@Override
79+
public <X extends Annotation> X[] getRepeatedAnnotationUsages(
80+
AnnotationDescriptor<X> type,
81+
SourceModelBuildingContext modelContext) {
82+
return AnnotationUsageHelper.getRepeatedUsages( type, getUsageMap(), modelContext );
83+
}
84+
85+
@Override
86+
public <X extends Annotation> X[] getRepeatedAnnotationUsages(Class<X> type, SourceModelBuildingContext modelContext) {
87+
return getRepeatedAnnotationUsages( modelContext.getAnnotationDescriptorRegistry().getDescriptor( type ), modelContext );
88+
}
89+
90+
@Override
91+
public <X extends Annotation> AnnotationDescriptor<X> asAnnotationDescriptor() {
92+
//noinspection unchecked
93+
return (AnnotationDescriptor<X>) this;
94+
}
95+
96+
@Override
97+
public MutableClassDetails asClassDetails() {
98+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to ClassDetails" );
99+
}
100+
101+
@Override
102+
public MutableMemberDetails asMemberDetails() {
103+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to MemberDetails" );
104+
}
105+
106+
@Override
107+
public FieldDetails asFieldDetails() {
108+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to FieldDetails" );
109+
}
110+
111+
@Override
112+
public MethodDetails asMethodDetails() {
113+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to MethodDetails" );
114+
}
115+
116+
@Override
117+
public RecordComponentDetails asRecordComponentDetails() {
118+
throw new IllegalCastException( "AnnotationDescriptor cannot be cast to RecordComponentDetails" );
119+
}
120+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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+
/**
11+
* @author Steve Ebersole
12+
*/
13+
public abstract class AbstractAnnotationTarget implements AnnotationTargetSupport {
14+
}

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

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
*/
77
package org.hibernate.models.internal;
88

9+
import java.lang.annotation.Annotation;
910
import java.util.Locale;
1011

11-
import org.hibernate.models.spi.AnnotationDescriptor;
12+
import org.hibernate.models.internal.jdk.JdkPassThruConverter;
13+
import org.hibernate.models.internal.jdk.JdkPassThruExtractor;
1214
import org.hibernate.models.spi.AttributeDescriptor;
15+
import org.hibernate.models.spi.JdkValueConverter;
16+
import org.hibernate.models.spi.JdkValueExtractor;
1317
import org.hibernate.models.spi.RenderingCollector;
1418
import org.hibernate.models.spi.SourceModelBuildingContext;
1519
import org.hibernate.models.spi.ValueTypeDescriptor;
16-
import org.hibernate.models.spi.ValueWrapper;
1720

1821
/**
1922
* Base support for {@linkplain AttributeDescriptor} implementations
@@ -23,33 +26,28 @@
2326
public abstract class AbstractTypeDescriptor<V> implements ValueTypeDescriptor<V> {
2427
@Override
2528
public AttributeDescriptor<V> createAttributeDescriptor(
26-
AnnotationDescriptor<?> annotationDescriptor,
29+
Class<? extends Annotation> annotationType,
2730
String attributeName) {
28-
return new AttributeDescriptorImpl<>( annotationDescriptor.getAnnotationType(), attributeName, this );
31+
return new AttributeDescriptorImpl<>( annotationType, attributeName, this );
2932
}
3033

3134
@Override
32-
public V createValue(
33-
AttributeDescriptor<?> attributeDescriptor,
34-
SourceModelBuildingContext context) {
35-
final Object defaultValue = attributeDescriptor.getAttributeMethod().getDefaultValue();
36-
if ( defaultValue == null ) {
37-
// a non-defaulted attribute, just return null for the baseline
38-
return null;
39-
}
35+
public JdkValueConverter<V> createJdkValueConverter(SourceModelBuildingContext modelContext) {
36+
return JdkPassThruConverter.passThruConverter();
37+
}
4038

41-
//noinspection unchecked
42-
final ValueWrapper<V, Object> valueWrapper = (ValueWrapper<V, Object>) createJdkWrapper( context );
43-
return valueWrapper.wrap( defaultValue, context );
39+
@Override
40+
public JdkValueExtractor<V> createJdkValueExtractor(SourceModelBuildingContext modelContext) {
41+
return JdkPassThruExtractor.passThruExtractor();
4442
}
4543

4644
@Override
47-
public void render(RenderingCollector collector, String name, Object attributeValue) {
45+
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
4846
collector.addLine( "%s = %s", name, attributeValue );
4947
}
5048

5149
@Override
52-
public void render(RenderingCollector collector, Object attributeValue) {
50+
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
5351
collector.addLine( "%s", attributeValue );
5452
}
5553

@@ -58,7 +56,7 @@ public String toString() {
5856
return String.format(
5957
Locale.ROOT,
6058
"AttributeTypeDescriptor(%s)",
61-
getWrappedValueType().getName()
59+
getValueType().getName()
6260
);
6361
}
6462
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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.Method;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
import org.hibernate.models.spi.AttributeDescriptor;
16+
import org.hibernate.models.spi.ValueTypeDescriptor;
17+
18+
/**
19+
* @author Steve Ebersole
20+
*/
21+
public class AnnotationDescriptorBuilding {
22+
23+
public static <A extends Annotation> List<AttributeDescriptor<?>> extractAttributeDescriptors(Class<A> annotationType) {
24+
final Method[] methods = annotationType.getDeclaredMethods();
25+
final List<AttributeDescriptor<?>> attributeDescriptors = new ArrayList<>( methods.length );
26+
for ( Method method : methods ) {
27+
attributeDescriptors.add( createAttributeDescriptor( annotationType, method ) );
28+
}
29+
return attributeDescriptors;
30+
}
31+
32+
private static <X, A extends Annotation> AttributeDescriptor<X> createAttributeDescriptor(
33+
Class<A> annotationType,
34+
Method method) {
35+
//noinspection unchecked
36+
final Class<X> attributeType = (Class<X>) method.getReturnType();
37+
38+
final ValueTypeDescriptor<X> typeDescriptor = TypeDescriptors.resolveTypeDescriptor( attributeType );
39+
return typeDescriptor.createAttributeDescriptor( annotationType, method.getName() );
40+
}
41+
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88

99
import java.lang.annotation.Annotation;
1010
import java.lang.annotation.Repeatable;
11-
import java.util.Collections;
12-
import java.util.HashMap;
1311

14-
import org.hibernate.models.internal.jdk.AnnotationDescriptorImpl;
1512
import org.hibernate.models.spi.AnnotationDescriptor;
1613
import org.hibernate.models.spi.AnnotationDescriptorRegistry;
1714

@@ -70,7 +67,7 @@ private <A extends Annotation> AnnotationDescriptor<A> buildAdHocAnnotationDescr
7067
containerDescriptor = null;
7168
}
7269

73-
final AnnotationDescriptorImpl<A> descriptor = new AnnotationDescriptorImpl<>(
70+
final StandardAnnotationDescriptor<A> descriptor = new StandardAnnotationDescriptor<>(
7471
javaType,
7572
containerDescriptor,
7673
modelBuildingContext

0 commit comments

Comments
 (0)