Skip to content

Commit 198d90b

Browse files
committed
#90 - Pluggable rendering for models
1 parent 4072730 commit 198d90b

26 files changed

+681
-351
lines changed

hibernate-models-jandex/src/test/java/org/hibernate/models/RenderingSmokeTest.java

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import org.hibernate.models.annotations.EverythingBagel;
1111
import org.hibernate.models.annotations.Nested;
1212
import org.hibernate.models.annotations.Status;
13+
import org.hibernate.models.rendering.internal.RenderingTargetCollectingImpl;
14+
import org.hibernate.models.rendering.internal.RenderingTargetStreamImpl;
15+
import org.hibernate.models.rendering.internal.SimpleRenderer;
1316
import org.hibernate.models.spi.ClassDetails;
1417
import org.hibernate.models.spi.SourceModelBuildingContext;
1518

@@ -24,19 +27,59 @@
2427
*/
2528
public class RenderingSmokeTest {
2629
@Test
27-
void testRendering() {
30+
void testStreamRendering1() {
2831
final SourceModelBuildingContext buildingContext = createBuildingContext( (Index) null, SimpleEntity.class );
32+
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleEntity.class.getName() );
33+
34+
// simple stdout renderer with default (2) indentation
35+
final SimpleRenderer renderer = new SimpleRenderer( new RenderingTargetStreamImpl( System.out ) );
36+
renderer.renderClass( classDetails, buildingContext );
37+
}
2938

39+
@Test
40+
void testStreamRendering2() {
41+
final SourceModelBuildingContext buildingContext = createBuildingContext( (Index) null, SimpleEntity.class );
3042
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleEntity.class.getName() );
31-
classDetails.render( buildingContext );
43+
44+
// simple stdout renderer with specified indentation
45+
final SimpleRenderer renderer = new SimpleRenderer( new RenderingTargetStreamImpl( System.out, 4 ) );
46+
renderer.renderClass( classDetails, buildingContext );
3247
}
3348

3449
@Test
35-
void testRendering2() {
50+
void testCollectingRendering1() {
3651
final SourceModelBuildingContext buildingContext = createBuildingContext( (org.jboss.jandex.Index) null, SimpleClass.class );
3752
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleClass.class.getName() );
3853

39-
System.out.println( classDetails.renderToString( buildingContext ) );
54+
final RenderingTargetCollectingImpl collectingTarget = new RenderingTargetCollectingImpl();
55+
final SimpleRenderer renderer = new SimpleRenderer( collectingTarget );
56+
renderer.renderClass( classDetails, buildingContext );
57+
58+
System.out.println( collectingTarget.toString() );
59+
}
60+
61+
@Test
62+
void testCollectingRendering2() {
63+
final SourceModelBuildingContext buildingContext = createBuildingContext( (org.jboss.jandex.Index) null, SimpleClass.class );
64+
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleClass.class.getName() );
65+
66+
final RenderingTargetCollectingImpl collectingTarget = new RenderingTargetCollectingImpl();
67+
final SimpleRenderer renderer = new SimpleRenderer( collectingTarget );
68+
renderer.renderClass( classDetails, buildingContext );
69+
70+
collectingTarget.render( System.out );
71+
}
72+
73+
@Test
74+
void testCollectingRendering3() {
75+
final SourceModelBuildingContext buildingContext = createBuildingContext( (org.jboss.jandex.Index) null, SimpleClass.class );
76+
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleClass.class.getName() );
77+
78+
final RenderingTargetCollectingImpl collectingTarget = new RenderingTargetCollectingImpl( 4 );
79+
final SimpleRenderer renderer = new SimpleRenderer( collectingTarget );
80+
renderer.renderClass( classDetails, buildingContext );
81+
82+
collectingTarget.render( System.out );
4083
}
4184

4285

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
import org.hibernate.models.spi.AttributeDescriptor;
1515
import org.hibernate.models.spi.JdkValueConverter;
1616
import org.hibernate.models.spi.JdkValueExtractor;
17-
import org.hibernate.models.spi.RenderingCollector;
17+
import org.hibernate.models.rendering.spi.Renderer;
18+
import org.hibernate.models.rendering.spi.RenderingTarget;
1819
import org.hibernate.models.spi.SourceModelBuildingContext;
20+
import org.hibernate.models.spi.SourceModelContext;
1921
import org.hibernate.models.spi.ValueTypeDescriptor;
2022

2123
/**
@@ -42,13 +44,18 @@ public JdkValueExtractor<V> createJdkValueExtractor(SourceModelBuildingContext m
4244
}
4345

4446
@Override
45-
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
46-
collector.addLine( "%s = %s", name, attributeValue );
47+
public void render(
48+
String name,
49+
Object attributeValue,
50+
RenderingTarget target,
51+
Renderer renderer,
52+
SourceModelContext modelContext) {
53+
target.addLine( "%s = %s", name, attributeValue );
4754
}
4855

4956
@Override
50-
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
51-
collector.addLine( "%s", attributeValue );
57+
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
58+
target.addLine( "%s", attributeValue );
5259
}
5360

5461
@Override

hibernate-models/src/main/java/org/hibernate/models/internal/AnnotationHelper.java

Lines changed: 0 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,11 @@
1111
import java.lang.annotation.Target;
1212
import java.lang.reflect.InvocationTargetException;
1313
import java.util.EnumSet;
14-
import java.util.List;
1514
import java.util.Locale;
1615

1716
import org.hibernate.models.AnnotationAccessException;
18-
import org.hibernate.models.spi.AnnotationDescriptor;
1917
import org.hibernate.models.spi.AnnotationTarget;
2018
import org.hibernate.models.spi.AttributeDescriptor;
21-
import org.hibernate.models.spi.RenderingCollector;
22-
import org.hibernate.models.spi.SourceModelBuildingContext;
2319

2420
/**
2521
* Helper for dealing with actual {@link Annotation} references
@@ -39,83 +35,6 @@ public static <A extends Annotation> EnumSet<AnnotationTarget.Kind> extractTarge
3935
return AnnotationTarget.Kind.from( annotationType.getAnnotation( Target.class ) );
4036
}
4137

42-
public static <A extends Annotation> void render(
43-
RenderingCollector collector,
44-
A annotation,
45-
SourceModelBuildingContext context) {
46-
//noinspection unchecked
47-
render(
48-
collector,
49-
annotation,
50-
(AnnotationDescriptor<A>) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ),
51-
context
52-
);
53-
}
54-
55-
public static <A extends Annotation> void render(
56-
RenderingCollector collector,
57-
A annotation,
58-
AnnotationDescriptor<A> descriptor,
59-
SourceModelBuildingContext context) {
60-
final List<AttributeDescriptor<?>> attributes = descriptor.getAttributes();
61-
if ( attributes.isEmpty() ) {
62-
collector.addLine( "@%s", descriptor.getAnnotationType().getName() );
63-
}
64-
else {
65-
collector.addLine( "@%s(", descriptor.getAnnotationType().getName() );
66-
collector.indent( 2 );
67-
attributes.forEach( (attribute) -> attribute.getTypeDescriptor().render(
68-
collector,
69-
attribute.getName(),
70-
extractValue( annotation, attribute ),
71-
context
72-
) );
73-
74-
collector.unindent( 2 );
75-
collector.addLine( ")" );
76-
}
77-
}
78-
79-
public static <A extends Annotation> void render(
80-
RenderingCollector collector,
81-
String name,
82-
A annotation,
83-
SourceModelBuildingContext context) {
84-
//noinspection unchecked
85-
render(
86-
collector,
87-
name,
88-
annotation,
89-
(AnnotationDescriptor<A>) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ),
90-
context
91-
);
92-
}
93-
94-
public static <A extends Annotation> void render(
95-
RenderingCollector collector,
96-
String name,
97-
A annotation,
98-
AnnotationDescriptor<A> descriptor,
99-
SourceModelBuildingContext context) {
100-
final List<AttributeDescriptor<?>> attributes = descriptor.getAttributes();
101-
if ( attributes.isEmpty() ) {
102-
collector.addLine( "%s = @%s", name, descriptor.getAnnotationType().getName() );
103-
}
104-
else {
105-
collector.addLine( "%s = @%s(", name, descriptor.getAnnotationType().getName() );
106-
collector.indent( 2 );
107-
attributes.forEach( (attribute) -> attribute.getTypeDescriptor().render(
108-
collector,
109-
attribute.getName(),
110-
extractValue( annotation, attribute ),
111-
context
112-
) );
113-
114-
collector.unindent( 2 );
115-
collector.addLine( ")" );
116-
}
117-
}
118-
11938
public static <A extends Annotation, R> R extractValue(A annotationUsage, AttributeDescriptor<R> attributeDescriptor) {
12039
try {
12140
//noinspection unchecked

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

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import org.hibernate.models.spi.AttributeDescriptor;
1818
import org.hibernate.models.spi.JdkValueConverter;
1919
import org.hibernate.models.spi.JdkValueExtractor;
20-
import org.hibernate.models.spi.RenderingCollector;
20+
import org.hibernate.models.rendering.spi.Renderer;
21+
import org.hibernate.models.rendering.spi.RenderingTarget;
2122
import org.hibernate.models.spi.SourceModelBuildingContext;
23+
import org.hibernate.models.spi.SourceModelContext;
2224
import org.hibernate.models.spi.ValueTypeDescriptor;
2325

2426
/**
@@ -97,31 +99,36 @@ public Object unwrap(V[] value) {
9799
}
98100

99101
@Override
100-
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
102+
public void render(
103+
String name,
104+
Object attributeValue,
105+
RenderingTarget target,
106+
Renderer renderer,
107+
SourceModelContext modelContext) {
101108
assert attributeValue != null : "Annotation value was null - " + name;
102109

103110
//noinspection unchecked
104111
final V[] values = (V[]) attributeValue;
105112

106-
collector.addLine( "%s = {", name );
107-
collector.indent( 2 );
113+
target.addLine( "%s = {", name );
114+
target.indent( 2 );
108115
for ( V value : values ) {
109-
elementTypeDescriptor.render( collector, value, modelContext );
116+
elementTypeDescriptor.render( value, target, renderer, modelContext );
110117
}
111-
collector.unindent( 2 );
112-
collector.addLine( "}" );
118+
target.unindent( 2 );
119+
target.addLine( "}" );
113120
}
114121

115122
@Override
116-
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
123+
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
117124
//noinspection unchecked
118125
final List<V> values = (List<V>) attributeValue;
119126

120-
collector.addLine( "{" );
121-
collector.indent( 2 );
122-
values.forEach( (value) -> elementTypeDescriptor.render( collector, value, modelContext ) );
123-
collector.unindent( 2 );
124-
collector.addLine( "}" );
127+
target.addLine( "{" );
128+
target.indent( 2 );
129+
values.forEach( (value) -> elementTypeDescriptor.render( value, target, renderer, modelContext ) );
130+
target.unindent( 2 );
131+
target.addLine( "}" );
125132
}
126133

127134
@Override

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

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

9-
import org.hibernate.models.spi.RenderingCollector;
9+
import org.hibernate.models.rendering.spi.Renderer;
10+
import org.hibernate.models.rendering.spi.RenderingTarget;
1011
import org.hibernate.models.spi.SourceModelBuildingContext;
12+
import org.hibernate.models.spi.SourceModelContext;
1113

1214
/**
1315
* Descriptor for class values
@@ -30,16 +32,17 @@ public Object unwrap(Class<?> value) {
3032

3133
@Override
3234
public void render(
33-
RenderingCollector collector,
3435
String name,
3536
Object attributeValue,
36-
SourceModelBuildingContext modelContext) {
37-
super.render( collector, name, ( (Class<?>) attributeValue ).getName(), modelContext );
37+
RenderingTarget target,
38+
Renderer renderer,
39+
SourceModelContext modelContext) {
40+
super.render( name, ( (Class<?>) attributeValue ).getName(), target, renderer, modelContext );
3841
}
3942

4043
@Override
41-
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
42-
super.render( collector, ( (Class<?>) attributeValue ).getName(), modelContext );
44+
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
45+
super.render( ( (Class<?>) attributeValue ).getName(), target, renderer, modelContext );
4346
}
4447

4548
@Override

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

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

9-
import org.hibernate.models.spi.RenderingCollector;
9+
import org.hibernate.models.rendering.spi.Renderer;
10+
import org.hibernate.models.rendering.spi.RenderingTarget;
1011
import org.hibernate.models.spi.SourceModelBuildingContext;
12+
import org.hibernate.models.spi.SourceModelContext;
1113

1214
/**
1315
* Descriptor for float values
@@ -28,13 +30,16 @@ public Object unwrap(Float value) {
2830
}
2931

3032
@Override
31-
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
32-
collector.addLine( "%s = %sF", name, attributeValue );
33+
public void render(
34+
String name, Object attributeValue, RenderingTarget target,
35+
Renderer renderer,
36+
SourceModelContext modelContext) {
37+
target.addLine( "%s = %sF", name, attributeValue );
3338
}
3439

3540
@Override
36-
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
37-
collector.addLine( "%sF", attributeValue );
41+
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
42+
target.addLine( "%sF", attributeValue );
3843
}
3944

4045
@Override

hibernate-models/src/main/java/org/hibernate/models/internal/LongTypeDescriptor.java

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

9-
import org.hibernate.models.spi.RenderingCollector;
9+
import org.hibernate.models.rendering.spi.Renderer;
10+
import org.hibernate.models.rendering.spi.RenderingTarget;
1011
import org.hibernate.models.spi.SourceModelBuildingContext;
12+
import org.hibernate.models.spi.SourceModelContext;
1113

1214
/**
1315
* Descriptor for long values
@@ -28,13 +30,16 @@ public Object unwrap(Long value) {
2830
}
2931

3032
@Override
31-
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
32-
collector.addLine( "%s = %sL", name, attributeValue );
33+
public void render(
34+
String name, Object attributeValue, RenderingTarget target,
35+
Renderer renderer,
36+
SourceModelContext modelContext) {
37+
target.addLine( "%s = %sL", name, attributeValue );
3338
}
3439

3540
@Override
36-
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
37-
collector.addLine( "%sL", attributeValue );
41+
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
42+
target.addLine( "%sL", attributeValue );
3843
}
3944

4045
@Override

0 commit comments

Comments
 (0)