Skip to content

#90 - Pluggable rendering for models #95

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
import org.hibernate.models.annotations.EverythingBagel;
import org.hibernate.models.annotations.Nested;
import org.hibernate.models.annotations.Status;
import org.hibernate.models.rendering.internal.RenderingTargetCollectingImpl;
import org.hibernate.models.rendering.internal.RenderingTargetStreamImpl;
import org.hibernate.models.rendering.internal.SimpleRenderer;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;

Expand All @@ -24,19 +27,59 @@
*/
public class RenderingSmokeTest {
@Test
void testRendering() {
void testStreamRendering1() {
final SourceModelBuildingContext buildingContext = createBuildingContext( (Index) null, SimpleEntity.class );
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleEntity.class.getName() );

// simple stdout renderer with default (2) indentation
final SimpleRenderer renderer = new SimpleRenderer( new RenderingTargetStreamImpl( System.out ) );
renderer.renderClass( classDetails, buildingContext );
}

@Test
void testStreamRendering2() {
final SourceModelBuildingContext buildingContext = createBuildingContext( (Index) null, SimpleEntity.class );
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleEntity.class.getName() );
classDetails.render( buildingContext );

// simple stdout renderer with specified indentation
final SimpleRenderer renderer = new SimpleRenderer( new RenderingTargetStreamImpl( System.out, 4 ) );
renderer.renderClass( classDetails, buildingContext );
}

@Test
void testRendering2() {
void testCollectingRendering1() {
final SourceModelBuildingContext buildingContext = createBuildingContext( (org.jboss.jandex.Index) null, SimpleClass.class );
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleClass.class.getName() );

System.out.println( classDetails.renderToString( buildingContext ) );
final RenderingTargetCollectingImpl collectingTarget = new RenderingTargetCollectingImpl();
final SimpleRenderer renderer = new SimpleRenderer( collectingTarget );
renderer.renderClass( classDetails, buildingContext );

System.out.println( collectingTarget.toString() );
}

@Test
void testCollectingRendering2() {
final SourceModelBuildingContext buildingContext = createBuildingContext( (org.jboss.jandex.Index) null, SimpleClass.class );
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleClass.class.getName() );

final RenderingTargetCollectingImpl collectingTarget = new RenderingTargetCollectingImpl();
final SimpleRenderer renderer = new SimpleRenderer( collectingTarget );
renderer.renderClass( classDetails, buildingContext );

collectingTarget.render( System.out );
}

@Test
void testCollectingRendering3() {
final SourceModelBuildingContext buildingContext = createBuildingContext( (org.jboss.jandex.Index) null, SimpleClass.class );
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry().resolveClassDetails( SimpleClass.class.getName() );

final RenderingTargetCollectingImpl collectingTarget = new RenderingTargetCollectingImpl( 4 );
final SimpleRenderer renderer = new SimpleRenderer( collectingTarget );
renderer.renderClass( classDetails, buildingContext );

collectingTarget.render( System.out );
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
import org.hibernate.models.spi.AttributeDescriptor;
import org.hibernate.models.spi.JdkValueConverter;
import org.hibernate.models.spi.JdkValueExtractor;
import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.rendering.spi.Renderer;
import org.hibernate.models.rendering.spi.RenderingTarget;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.ValueTypeDescriptor;

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

@Override
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
collector.addLine( "%s = %s", name, attributeValue );
public void render(
String name,
Object attributeValue,
RenderingTarget target,
Renderer renderer,
SourceModelContext modelContext) {
target.addLine( "%s = %s", name, attributeValue );
}

@Override
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
collector.addLine( "%s", attributeValue );
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
target.addLine( "%s", attributeValue );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,11 @@
import java.lang.annotation.Target;
import java.lang.reflect.InvocationTargetException;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;

import org.hibernate.models.AnnotationAccessException;
import org.hibernate.models.spi.AnnotationDescriptor;
import org.hibernate.models.spi.AnnotationTarget;
import org.hibernate.models.spi.AttributeDescriptor;
import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.spi.SourceModelBuildingContext;

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

public static <A extends Annotation> void render(
RenderingCollector collector,
A annotation,
SourceModelBuildingContext context) {
//noinspection unchecked
render(
collector,
annotation,
(AnnotationDescriptor<A>) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ),
context
);
}

public static <A extends Annotation> void render(
RenderingCollector collector,
A annotation,
AnnotationDescriptor<A> descriptor,
SourceModelBuildingContext context) {
final List<AttributeDescriptor<?>> attributes = descriptor.getAttributes();
if ( attributes.isEmpty() ) {
collector.addLine( "@%s", descriptor.getAnnotationType().getName() );
}
else {
collector.addLine( "@%s(", descriptor.getAnnotationType().getName() );
collector.indent( 2 );
attributes.forEach( (attribute) -> attribute.getTypeDescriptor().render(
collector,
attribute.getName(),
extractValue( annotation, attribute ),
context
) );

collector.unindent( 2 );
collector.addLine( ")" );
}
}

public static <A extends Annotation> void render(
RenderingCollector collector,
String name,
A annotation,
SourceModelBuildingContext context) {
//noinspection unchecked
render(
collector,
name,
annotation,
(AnnotationDescriptor<A>) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ),
context
);
}

public static <A extends Annotation> void render(
RenderingCollector collector,
String name,
A annotation,
AnnotationDescriptor<A> descriptor,
SourceModelBuildingContext context) {
final List<AttributeDescriptor<?>> attributes = descriptor.getAttributes();
if ( attributes.isEmpty() ) {
collector.addLine( "%s = @%s", name, descriptor.getAnnotationType().getName() );
}
else {
collector.addLine( "%s = @%s(", name, descriptor.getAnnotationType().getName() );
collector.indent( 2 );
attributes.forEach( (attribute) -> attribute.getTypeDescriptor().render(
collector,
attribute.getName(),
extractValue( annotation, attribute ),
context
) );

collector.unindent( 2 );
collector.addLine( ")" );
}
}

public static <A extends Annotation, R> R extractValue(A annotationUsage, AttributeDescriptor<R> attributeDescriptor) {
try {
//noinspection unchecked
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@
import org.hibernate.models.spi.AttributeDescriptor;
import org.hibernate.models.spi.JdkValueConverter;
import org.hibernate.models.spi.JdkValueExtractor;
import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.rendering.spi.Renderer;
import org.hibernate.models.rendering.spi.RenderingTarget;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.ValueTypeDescriptor;

/**
Expand Down Expand Up @@ -97,31 +99,36 @@ public Object unwrap(V[] value) {
}

@Override
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
public void render(
String name,
Object attributeValue,
RenderingTarget target,
Renderer renderer,
SourceModelContext modelContext) {
assert attributeValue != null : "Annotation value was null - " + name;

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

collector.addLine( "%s = {", name );
collector.indent( 2 );
target.addLine( "%s = {", name );
target.indent( 2 );
for ( V value : values ) {
elementTypeDescriptor.render( collector, value, modelContext );
elementTypeDescriptor.render( value, target, renderer, modelContext );
}
collector.unindent( 2 );
collector.addLine( "}" );
target.unindent( 2 );
target.addLine( "}" );
}

@Override
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
//noinspection unchecked
final List<V> values = (List<V>) attributeValue;

collector.addLine( "{" );
collector.indent( 2 );
values.forEach( (value) -> elementTypeDescriptor.render( collector, value, modelContext ) );
collector.unindent( 2 );
collector.addLine( "}" );
target.addLine( "{" );
target.indent( 2 );
values.forEach( (value) -> elementTypeDescriptor.render( value, target, renderer, modelContext ) );
target.unindent( 2 );
target.addLine( "}" );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
*/
package org.hibernate.models.internal;

import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.rendering.spi.Renderer;
import org.hibernate.models.rendering.spi.RenderingTarget;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;

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

@Override
public void render(
RenderingCollector collector,
String name,
Object attributeValue,
SourceModelBuildingContext modelContext) {
super.render( collector, name, ( (Class<?>) attributeValue ).getName(), modelContext );
RenderingTarget target,
Renderer renderer,
SourceModelContext modelContext) {
super.render( name, ( (Class<?>) attributeValue ).getName(), target, renderer, modelContext );
}

@Override
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
super.render( collector, ( (Class<?>) attributeValue ).getName(), modelContext );
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
super.render( ( (Class<?>) attributeValue ).getName(), target, renderer, modelContext );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
*/
package org.hibernate.models.internal;

import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.rendering.spi.Renderer;
import org.hibernate.models.rendering.spi.RenderingTarget;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;

/**
* Descriptor for float values
Expand All @@ -28,13 +30,16 @@ public Object unwrap(Float value) {
}

@Override
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
collector.addLine( "%s = %sF", name, attributeValue );
public void render(
String name, Object attributeValue, RenderingTarget target,
Renderer renderer,
SourceModelContext modelContext) {
target.addLine( "%s = %sF", name, attributeValue );
}

@Override
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
collector.addLine( "%sF", attributeValue );
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
target.addLine( "%sF", attributeValue );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
*/
package org.hibernate.models.internal;

import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.rendering.spi.Renderer;
import org.hibernate.models.rendering.spi.RenderingTarget;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;

/**
* Descriptor for long values
Expand All @@ -28,13 +30,16 @@ public Object unwrap(Long value) {
}

@Override
public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
collector.addLine( "%s = %sL", name, attributeValue );
public void render(
String name, Object attributeValue, RenderingTarget target,
Renderer renderer,
SourceModelContext modelContext) {
target.addLine( "%s = %sL", name, attributeValue );
}

@Override
public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
collector.addLine( "%sL", attributeValue );
public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) {
target.addLine( "%sL", attributeValue );
}

@Override
Expand Down
Loading
Loading