diff --git a/hibernate-models-jandex/src/test/java/org/hibernate/models/RenderingSmokeTest.java b/hibernate-models-jandex/src/test/java/org/hibernate/models/RenderingSmokeTest.java index f844e7f..95b6796 100644 --- a/hibernate-models-jandex/src/test/java/org/hibernate/models/RenderingSmokeTest.java +++ b/hibernate-models-jandex/src/test/java/org/hibernate/models/RenderingSmokeTest.java @@ -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; @@ -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 ); } diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/AbstractTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/internal/AbstractTypeDescriptor.java index e96bcde..7f76207 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/AbstractTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/AbstractTypeDescriptor.java @@ -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; /** @@ -42,13 +44,18 @@ public JdkValueExtractor 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 diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/AnnotationHelper.java b/hibernate-models/src/main/java/org/hibernate/models/internal/AnnotationHelper.java index deca3c8..22c224b 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/AnnotationHelper.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/AnnotationHelper.java @@ -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 @@ -39,83 +35,6 @@ public static EnumSet extractTarge return AnnotationTarget.Kind.from( annotationType.getAnnotation( Target.class ) ); } - public static void render( - RenderingCollector collector, - A annotation, - SourceModelBuildingContext context) { - //noinspection unchecked - render( - collector, - annotation, - (AnnotationDescriptor) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ), - context - ); - } - - public static void render( - RenderingCollector collector, - A annotation, - AnnotationDescriptor descriptor, - SourceModelBuildingContext context) { - final List> 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 void render( - RenderingCollector collector, - String name, - A annotation, - SourceModelBuildingContext context) { - //noinspection unchecked - render( - collector, - name, - annotation, - (AnnotationDescriptor) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ), - context - ); - } - - public static void render( - RenderingCollector collector, - String name, - A annotation, - AnnotationDescriptor descriptor, - SourceModelBuildingContext context) { - final List> 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 R extractValue(A annotationUsage, AttributeDescriptor attributeDescriptor) { try { //noinspection unchecked diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java index f0df57e..41768df 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java @@ -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; /** @@ -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 values = (List) 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 diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java index 2d314ad..b72f32a 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java @@ -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 @@ -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 diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/FloatTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/internal/FloatTypeDescriptor.java index 979a8b8..dc497f5 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/FloatTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/FloatTypeDescriptor.java @@ -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 @@ -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 diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/LongTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/internal/LongTypeDescriptor.java index ae88c65..662eb20 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/LongTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/LongTypeDescriptor.java @@ -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 @@ -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 diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/NestedTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/internal/NestedTypeDescriptor.java index d6679fb..9b90630 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/NestedTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/NestedTypeDescriptor.java @@ -15,8 +15,10 @@ import org.hibernate.models.spi.AnnotationDescriptor; 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; /** * Descriptor for nested annotation values @@ -40,7 +42,7 @@ public Class getValueType() { return annotationType; } - private AnnotationDescriptor resolveDescriptor(SourceModelBuildingContext context) { + private AnnotationDescriptor resolveDescriptor(SourceModelContext context) { if ( descriptor == null ) { descriptor = context.getAnnotationDescriptorRegistry().getDescriptor( annotationType ); } @@ -77,15 +79,20 @@ public Object unwrap(A 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) { //noinspection unchecked - resolveDescriptor( modelContext ).renderUsage( collector, name, (A) attributeValue, modelContext ); + renderer.renderNestedAnnotation( name, (A) attributeValue, modelContext ); } @Override - public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) { + public void render(Object attributeValue, RenderingTarget target, Renderer renderer, SourceModelContext modelContext) { //noinspection unchecked - resolveDescriptor( modelContext ).renderUsage( collector, (A) attributeValue, modelContext ); + renderer.renderNestedAnnotation( (A) attributeValue, modelContext ); } @Override diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/RenderingCollectorImpl.java b/hibernate-models/src/main/java/org/hibernate/models/internal/RenderingCollectorImpl.java deleted file mode 100644 index 86cf76a..0000000 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/RenderingCollectorImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * SPDX-License-Identifier: Apache-2.0 - * Copyright: Red Hat Inc. and Hibernate Authors - */ - -package org.hibernate.models.internal; - -import java.util.Locale; - -import org.hibernate.models.spi.RenderingCollector; - -/** - * @author Steve Ebersole - */ -public class RenderingCollectorImpl implements RenderingCollector { - private final StringBuilder buffer = new StringBuilder(); - private int currentIndentation = 0; - - @Override - public void addLine(String line) { - buffer.append( " " .repeat( currentIndentation ) ); - buffer.append( line ); - buffer.append( "\n" ); - } - - @Override - public void addLine(String pattern, Object... args) { - buffer.append( " " .repeat( currentIndentation ) ); - buffer.append( String.format( Locale.ROOT, pattern, args ) ); - buffer.append( "\n" ); - } - - @Override - public void addLine() { - buffer.append( "\n" ); - } - - @Override - public void indent(int depth) { - currentIndentation += (depth * 4); - } - - @Override - public void unindent(int depth) { - currentIndentation -= (depth * 4); - assert currentIndentation >= 0; - } - - @Override - public String toString() { - return buffer.toString(); - } -} diff --git a/hibernate-models/src/main/java/org/hibernate/models/internal/StringTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/internal/StringTypeDescriptor.java index 9590949..024bc60 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/internal/StringTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/internal/StringTypeDescriptor.java @@ -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 string values @@ -29,16 +31,14 @@ public Object unwrap(String value) { @Override public void render( - RenderingCollector collector, - String name, - Object attributeValue, - SourceModelBuildingContext modelContext) { - collector.addLine( "%s = \"%s\"", name, attributeValue ); + 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 diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/RenderingException.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/RenderingException.java new file mode 100644 index 0000000..dc8473d --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/RenderingException.java @@ -0,0 +1,25 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering; + +import org.hibernate.models.ModelsException; + +/** + * Indicates a problem performing rendering. Generally this indicates IO problems. + * + * @author Steve Ebersole + */ +public class RenderingException extends ModelsException { + public RenderingException(String message) { + super( message ); + } + + public RenderingException(String message, Throwable cause) { + super( message, cause ); + } +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/RenderingTargetCollectingImpl.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/RenderingTargetCollectingImpl.java new file mode 100644 index 0000000..c6cf180 --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/RenderingTargetCollectingImpl.java @@ -0,0 +1,47 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering.internal; + +import java.io.PrintStream; + +import org.hibernate.models.rendering.spi.AbstractRenderingTarget; + +/** + * RenderingTarget implementation which collects the rendering into an internal buffer. + * + * @author Steve Ebersole + */ +public class RenderingTargetCollectingImpl extends AbstractRenderingTarget { + private final StringBuilder buffer = new StringBuilder(); + + public RenderingTargetCollectingImpl() { + super(); + } + + public RenderingTargetCollectingImpl(int indentationDepth) { + super( indentationDepth ); + } + + @Override + protected void write(String chars) { + buffer.append( chars ); + } + + @Override + public String toString() { + return buffer.toString(); + } + + public void render() { + render( System.out ); + } + + public void render(PrintStream printStream) { + printStream.println( this ); + } +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/RenderingTargetStreamImpl.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/RenderingTargetStreamImpl.java new file mode 100644 index 0000000..97efdbb --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/RenderingTargetStreamImpl.java @@ -0,0 +1,49 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering.internal; + +import java.io.IOException; + +import org.hibernate.models.rendering.RenderingException; +import org.hibernate.models.rendering.spi.AbstractRenderingTarget; + +/** + * RenderingTarget implementation which collects the rendering into an internal buffer. + * + * @author Steve Ebersole + */ +public class RenderingTargetStreamImpl extends AbstractRenderingTarget { + private final Appendable outputStream; + + public RenderingTargetStreamImpl() { + this( System.out ); + } + + public RenderingTargetStreamImpl(int indentationDepth) { + this( System.out, indentationDepth ); + } + + public RenderingTargetStreamImpl(Appendable outputStream) { + this( outputStream, DEFAULT_INDENT_DEPTH ); + } + + public RenderingTargetStreamImpl(Appendable outputStream, int indentationDepth) { + super( indentationDepth ); + this.outputStream = outputStream; + } + + @Override + protected void write(String chars) { + try { + outputStream.append( chars ); + } + catch (IOException e) { + throw new RenderingException( "Error adding characters to stream (Appendable): " + chars, e ); + } + } +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/SimpleRenderer.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/SimpleRenderer.java new file mode 100644 index 0000000..787d7a4 --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/internal/SimpleRenderer.java @@ -0,0 +1,108 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering.internal; + +import org.hibernate.models.rendering.spi.AbstractRenderer; +import org.hibernate.models.spi.ClassDetails; +import org.hibernate.models.spi.FieldDetails; +import org.hibernate.models.spi.MethodDetails; +import org.hibernate.models.spi.RecordComponentDetails; +import org.hibernate.models.rendering.spi.RenderingTarget; +import org.hibernate.models.spi.SourceModelContext; + +/** + * A Renderer with a simplified output format. + * + * @author Steve Ebersole + */ +public class SimpleRenderer extends AbstractRenderer { + private final RenderingTarget renderingTarget; + + public SimpleRenderer(RenderingTarget renderingTarget) { + this.renderingTarget = renderingTarget; + } + + @Override + protected RenderingTarget getRenderingTarget() { + return renderingTarget; + } + + @Override + public void renderClassDetails(ClassDetails classDetails, SourceModelContext context) { + final String typeDeclarationPattern; + if ( classDetails.isInterface() ) { + typeDeclarationPattern = "interface %s {"; + } + else if ( classDetails.isRecord() ) { + typeDeclarationPattern = "record %s {"; + } + else { + typeDeclarationPattern = "class %s {"; + } + + renderingTarget.addLine( typeDeclarationPattern, classDetails.getName() ); + renderingTarget.indent( 1 ); + + renderingTarget.addLine( "// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ); + renderingTarget.addLine( "// fields" ); + classDetails.forEachField( (index, fieldDetails) -> { + renderField( fieldDetails, context ); + renderingTarget.addLine(); + } ); + renderingTarget.addLine(); + + renderingTarget.addLine( "// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ); + renderingTarget.addLine( "// methods" ); + classDetails.forEachMethod( (index, methodDetails) -> { + renderMethod( methodDetails, context ); + renderingTarget.addLine(); + } ); + renderingTarget.addLine(); + + if ( classDetails.isRecord() ) { + renderingTarget.addLine( "// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ); + renderingTarget.addLine( "// record components" ); + classDetails.forEachRecordComponent( (index, recordComponentDetails) -> { + renderRecordComponent( recordComponentDetails, context ); + renderingTarget.addLine(); + } ); + } + + renderingTarget.unindent( 1 ); + renderingTarget.addLine( "}" ); + } + + @Override + public void renderFieldDetails(FieldDetails fieldDetails, SourceModelContext context) { + // todo : would be nice to render the type-details to include generics, etc + renderingTarget.addLine( "%s %s", fieldDetails.getType().determineRawClass().getName(), fieldDetails.getName() ); + } + + @Override + public void renderMethodDetails(MethodDetails methodDetails, SourceModelContext context) { + // todo : would be nice to render the type-details to include generics, etc + renderingTarget.addLine( + "%s %s (%s)", + methodDetails.getType() == null + ? "void" + : methodDetails.getType().determineRawClass().getName(), + methodDetails.getName(), + methodDetails.getMethodKind().name() + ); + + renderingTarget.indent( 2 ); + methodDetails.getArgumentTypes().forEach( (arg) -> renderingTarget.addLine( " - %s", arg.getName() ) ); + renderingTarget.unindent( 2 ); + } + + @Override + public void renderRecordComponentDetails(RecordComponentDetails recordComponentDetails, SourceModelContext context) { + // todo : would be nice to render the type-details to include generics, etc + renderingTarget.addLine( "%s %s", recordComponentDetails.getType().determineRawClass().getName(), recordComponentDetails.getName() ); + } +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/AbstractRenderer.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/AbstractRenderer.java new file mode 100644 index 0000000..866a653 --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/AbstractRenderer.java @@ -0,0 +1,137 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering.spi; + +import java.lang.annotation.Annotation; +import java.util.List; + +import org.hibernate.models.spi.AnnotationDescriptor; +import org.hibernate.models.spi.AnnotationTarget; +import org.hibernate.models.spi.AttributeDescriptor; +import org.hibernate.models.spi.ClassDetails; +import org.hibernate.models.spi.FieldDetails; +import org.hibernate.models.spi.MethodDetails; +import org.hibernate.models.spi.RecordComponentDetails; +import org.hibernate.models.spi.SourceModelContext; + +import static org.hibernate.models.internal.AnnotationHelper.extractValue; + +/** + * Base support for Renderer implementations. Handles rendering of annotations. + * + * @author Steve Ebersole + */ +public abstract class AbstractRenderer implements Renderer { + protected abstract RenderingTarget getRenderingTarget(); + + @Override + public void renderClass(ClassDetails classDetails, SourceModelContext context) { + renderDirectAnnotations( classDetails, context ); + renderClassDetails( classDetails, context ); + } + + private void renderDirectAnnotations(AnnotationTarget annotationTarget, SourceModelContext context) { + annotationTarget.forEachDirectAnnotationUsage( (usage) -> renderAnnotation( usage, context ) ); + } + + protected abstract void renderClassDetails(ClassDetails classDetails, SourceModelContext context); + + @Override + public void renderField(FieldDetails fieldDetails, SourceModelContext context) { + renderDirectAnnotations( fieldDetails, context ); + renderFieldDetails( fieldDetails, context ); + } + + protected abstract void renderFieldDetails(FieldDetails fieldDetails, SourceModelContext context); + + @Override + public void renderMethod(MethodDetails methodDetails, SourceModelContext context) { + renderDirectAnnotations( methodDetails, context ); + renderMethodDetails( methodDetails, context ); + } + + protected abstract void renderMethodDetails(MethodDetails methodDetails, SourceModelContext context); + + @Override + public void renderRecordComponent(RecordComponentDetails recordComponentDetails, SourceModelContext context) { + renderDirectAnnotations( recordComponentDetails, context ); + renderRecordComponentDetails( recordComponentDetails, context ); + } + + protected abstract void renderRecordComponentDetails(RecordComponentDetails recordComponentDetails, SourceModelContext context); + + + @Override + public void renderAnnotation(A annotation, SourceModelContext context) { + //noinspection unchecked + final AnnotationDescriptor descriptor = (AnnotationDescriptor) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ); + final List> attributes = descriptor.getAttributes(); + + if ( attributes.isEmpty() ) { + getRenderingTarget().addLine( "@%s", descriptor.getAnnotationType().getName() ); + } + else { + getRenderingTarget().addLine( "@%s(", descriptor.getAnnotationType().getName() ); + getRenderingTarget().indent( 2 ); + + attributes.forEach( (attribute) -> attribute.getTypeDescriptor().render( + attribute.getName(), + extractValue( annotation, attribute ), + getRenderingTarget(), + this, + context + ) ); + + getRenderingTarget().unindent( 2 ); + getRenderingTarget().addLine( ")" ); + } + } + + @Override + public void renderNestedAnnotation(String name, A annotation, SourceModelContext context) { + //noinspection unchecked + final AnnotationDescriptor descriptor = (AnnotationDescriptor) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ); + final List> attributes = descriptor.getAttributes(); + + getRenderingTarget().addLine( "%s = @%s(", name, descriptor.getAnnotationType().getName() ); + getRenderingTarget().indent( 2 ); + + attributes.forEach( (attribute) -> attribute.getTypeDescriptor().render( + attribute.getName(), + extractValue( annotation, attribute ), + getRenderingTarget(), + this, + context + ) ); + + getRenderingTarget().unindent( 2 ); + getRenderingTarget().addLine( ")" ); + } + + @Override + public void renderNestedAnnotation(A annotation, SourceModelContext context) { + //noinspection unchecked + final AnnotationDescriptor descriptor = (AnnotationDescriptor) context.getAnnotationDescriptorRegistry().getDescriptor( annotation.annotationType() ); + final List> attributes = descriptor.getAttributes(); + + getRenderingTarget().addLine( "@%s(", descriptor.getAnnotationType().getName() ); + getRenderingTarget().indent( 2 ); + + attributes.forEach( (attribute) -> attribute.getTypeDescriptor().render( + attribute.getName(), + extractValue( annotation, attribute ), + getRenderingTarget(), + this, + context + ) ); + + getRenderingTarget().unindent( 2 ); + getRenderingTarget().addLine( ")" ); + + } +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/AbstractRenderingTarget.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/AbstractRenderingTarget.java new file mode 100644 index 0000000..cdc8bf2 --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/AbstractRenderingTarget.java @@ -0,0 +1,64 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering.spi; + +import java.util.Locale; + +/** + * Base support for RenderingTarget implementations. Handles most details, + * delegating just the actual appending of characters. + * + * @author Steve Ebersole + */ +public abstract class AbstractRenderingTarget implements RenderingTarget { + public static final int DEFAULT_INDENT_DEPTH = 2; + + private final int indentationDepth; + + private int currentIndentation = 0; + + public AbstractRenderingTarget() { + this( DEFAULT_INDENT_DEPTH ); + } + + public AbstractRenderingTarget(int indentationDepth) { + this.indentationDepth = indentationDepth; + } + + protected abstract void write(String chars); + + @Override + public void addLine(String line) { + write( " " .repeat( currentIndentation ) ); + write( line ); + write( "\n" ); + } + + @Override + public void addLine(String pattern, Object... args) { + write( " " .repeat( currentIndentation ) ); + write( String.format( Locale.ROOT, pattern, args ) ); + write( "\n" ); + } + + @Override + public void addLine() { + write( "\n" ); + } + + @Override + public void indent(int depth) { + currentIndentation += (depth * indentationDepth); + } + + @Override + public void unindent(int depth) { + currentIndentation -= (depth * indentationDepth); + assert currentIndentation >= 0; + } +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/Renderer.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/Renderer.java new file mode 100644 index 0000000..397e59b --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/Renderer.java @@ -0,0 +1,58 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering.spi; + +import java.lang.annotation.Annotation; + +import org.hibernate.models.spi.ClassDetails; +import org.hibernate.models.spi.FieldDetails; +import org.hibernate.models.spi.MethodDetails; +import org.hibernate.models.spi.RecordComponentDetails; +import org.hibernate.models.spi.SourceModelContext; + +/** + * Contract for rendering parts of a model. + * + * @author Steve Ebersole + */ +public interface Renderer { + /** + * Render details about the class + */ + void renderClass(ClassDetails classDetails, SourceModelContext context); + + /** + * Render details about the field + */ + void renderField(FieldDetails fieldDetails, SourceModelContext context); + + /** + * Render details about the method + */ + void renderMethod(MethodDetails methodDetails, SourceModelContext context); + + /** + * Render details about the record component + */ + void renderRecordComponent(RecordComponentDetails recordComponentDetails, SourceModelContext context); + + /** + * Render details about the annotation (top-level) + */ + void renderAnnotation(A annotation, SourceModelContext context); + + /** + * Render details about the named nested annotation. + */ + void renderNestedAnnotation(String name, A annotation, SourceModelContext context); + + /** + * Render details about the unnamed nested annotation. + */ + void renderNestedAnnotation(A annotation, SourceModelContext context); +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/RenderingTarget.java b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/RenderingTarget.java new file mode 100644 index 0000000..e651d94 --- /dev/null +++ b/hibernate-models/src/main/java/org/hibernate/models/rendering/spi/RenderingTarget.java @@ -0,0 +1,52 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ + +package org.hibernate.models.rendering.spi; + +/** + * Abstraction over the target of rendering (streams, buffers, ...). + * + * @author Steve Ebersole + */ +public interface RenderingTarget { + /** + * Adds the string, preceded by any necessary indentation, followed by a newline. + * + * @see #indent + * @see #unindent + */ + void addLine(String line); + + /** + * Adds the rendered pattern, preceded by any necessary indentation, followed by a newline. + * + * @see #indent + * @see #unindent + */ + void addLine(String pattern, Object... args); + + /** + * Adds a newline. + */ + void addLine(); + + /** + * Increase the indentation by the given factor. + * + * @apiNote Indentation depth is constant and controlled by the target itself. {@code depth} here + * indicates the number of indentations by which to increase. + */ + void indent(int depth); + + /** + * Decrease the indentation by the given factor. + * + * @apiNote Indentation depth is constant and controlled by the target itself. {@code depth} here + * indicates the number of indentations by which to decrease. + */ + void unindent(int depth); +} diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationDescriptor.java index b2657cd..e896b24 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationDescriptor.java @@ -14,7 +14,6 @@ import org.hibernate.models.IllegalCastException; import org.hibernate.models.UnknownAnnotationAttributeException; -import org.hibernate.models.internal.AnnotationHelper; import org.hibernate.models.internal.AnnotationProxy; /** @@ -148,21 +147,4 @@ default RecordComponentDetails asRecordComponentDetails() { throw new IllegalCastException( "AnnotationDescriptor cannot be cast to a RecordComponentDetails" ); } - @Override - default void render(SourceModelBuildingContext modelContext) { - throw new UnsupportedOperationException( "Rendering of annotation classes not implemented" ); - } - - @Override - default void render(RenderingCollector collector, SourceModelBuildingContext modelContext) { - throw new UnsupportedOperationException( "Rendering of annotation classes not implemented" ); - } - - default void renderUsage(RenderingCollector collector, A usage, SourceModelBuildingContext modelContext) { - AnnotationHelper.render( collector, usage, this, modelContext ); - } - - default void renderUsage(RenderingCollector collector, String name, A usage, SourceModelBuildingContext modelContext) { - AnnotationHelper.render( collector, name, usage, modelContext ); - } } diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationTarget.java b/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationTarget.java index c18e217..6663141 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationTarget.java +++ b/hibernate-models/src/main/java/org/hibernate/models/spi/AnnotationTarget.java @@ -17,7 +17,6 @@ import org.hibernate.models.AnnotationAccessException; import org.hibernate.models.IllegalCastException; -import org.hibernate.models.internal.RenderingCollectorImpl; /** * Abstract for something where an annotation can be used. @@ -354,16 +353,6 @@ default T fromAnnotations( */ RecordComponentDetails asRecordComponentDetails(); - void render(SourceModelBuildingContext modelContext); - - default String renderToString(SourceModelBuildingContext modelContext) { - final RenderingCollectorImpl renderingCollector = new RenderingCollectorImpl(); - render( renderingCollector, modelContext ); - return renderingCollector.toString(); - } - - void render(RenderingCollector collector, SourceModelBuildingContext modelContext); - /** * Subset of {@linkplain ElementType annotation targets} supported for mapping annotations */ diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/ClassDetails.java b/hibernate-models/src/main/java/org/hibernate/models/spi/ClassDetails.java index 59ab78c..fdf5583 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/ClassDetails.java +++ b/hibernate-models/src/main/java/org/hibernate/models/spi/ClassDetails.java @@ -12,8 +12,6 @@ import java.util.function.Predicate; import org.hibernate.models.IllegalCastException; -import org.hibernate.models.internal.AnnotationHelper; -import org.hibernate.models.internal.RenderingCollectorImpl; import org.hibernate.models.internal.SimpleClassDetails; import org.hibernate.models.internal.util.IndexedConsumer; @@ -317,50 +315,4 @@ default RecordComponentDetails asRecordComponentDetails() { throw new IllegalCastException( "ClassDetails cannot be cast to RecordComponentDetails" ); } - @Override - default void render(SourceModelBuildingContext modelContext) { - final RenderingCollectorImpl renderingCollector = new RenderingCollectorImpl(); - render( renderingCollector, modelContext ); - renderingCollector.render(); - } - - @Override - default void render(RenderingCollector collector, SourceModelBuildingContext modelContext) { - forEachDirectAnnotationUsage( (usage) -> AnnotationHelper.render( collector, usage, modelContext ) ); - - final String pattern = isRecord() - ? "record %s {" - : "class %s {"; - - collector.addLine( pattern, getName() ); - collector.indent( 1 ); - - collector.addLine( "// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ); - collector.addLine( "// fields" ); - getFields().forEach( (fieldDetails) -> { - fieldDetails.render( collector, modelContext ); - collector.addLine(); - } ); - collector.addLine(); - - collector.addLine( "// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ); - collector.addLine( "// methods" ); - getMethods().forEach( (methodDetails) -> { - methodDetails.render( collector, modelContext ); - collector.addLine(); - } ); - collector.addLine(); - - if ( isRecord() ) { - collector.addLine( "// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ); - collector.addLine( "// record components" ); - getRecordComponents().forEach( (recordComponentDetails) -> { - recordComponentDetails.render( collector, modelContext ); - collector.addLine(); - } ); - } - - collector.unindent( 1 ); - collector.addLine( "}" ); - } } diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/FieldDetails.java b/hibernate-models/src/main/java/org/hibernate/models/spi/FieldDetails.java index a4af347..680085c 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/FieldDetails.java +++ b/hibernate-models/src/main/java/org/hibernate/models/spi/FieldDetails.java @@ -7,9 +7,7 @@ package org.hibernate.models.spi; import org.hibernate.models.IllegalCastException; -import org.hibernate.models.internal.AnnotationHelper; import org.hibernate.models.internal.ModifierUtils; -import org.hibernate.models.internal.RenderingCollectorImpl; /** * Models a {@linkplain java.lang.reflect.Field field} in a {@linkplain ClassDetails class} @@ -47,17 +45,4 @@ default RecordComponentDetails asRecordComponentDetails() { throw new IllegalCastException( "FieldDetails cannot be cast to RecordComponentDetails" ); } - @Override - default void render(SourceModelBuildingContext modelContext) { - final RenderingCollectorImpl renderingCollector = new RenderingCollectorImpl(); - render( renderingCollector,modelContext ); - renderingCollector.render(); - } - - @Override - default void render(RenderingCollector collector, SourceModelBuildingContext modelContext) { - forEachDirectAnnotationUsage( (usage) -> AnnotationHelper.render( collector, usage, modelContext ) ); - // todo : would be nice to render the type-details to include generics, etc - collector.addLine( "%s %s", getType().determineRawClass().getName(), getName() ); - } } diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/MethodDetails.java b/hibernate-models/src/main/java/org/hibernate/models/spi/MethodDetails.java index 20079e0..a3f51fd 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/MethodDetails.java +++ b/hibernate-models/src/main/java/org/hibernate/models/spi/MethodDetails.java @@ -10,8 +10,6 @@ import java.util.List; import org.hibernate.models.IllegalCastException; -import org.hibernate.models.internal.AnnotationHelper; -import org.hibernate.models.internal.RenderingCollectorImpl; import static org.hibernate.models.internal.ModifierUtils.hasPersistableMethodModifiers; @@ -73,29 +71,4 @@ default RecordComponentDetails asRecordComponentDetails() { throw new IllegalCastException( "MethodDetails cannot be cast to RecordComponentDetails" ); } - @Override - default void render(SourceModelBuildingContext modelContext) { - final RenderingCollectorImpl renderingCollector = new RenderingCollectorImpl(); - render( renderingCollector, modelContext ); - renderingCollector.render(); - } - - @Override - default void render(RenderingCollector collector, SourceModelBuildingContext modelContext) { - forEachDirectAnnotationUsage( (usage) -> AnnotationHelper.render( collector, usage, modelContext ) ); - - // todo : would be nice to render the type-details to include generics, etc - collector.addLine( - "%s %s (%s)", - getType() == null - ? "void" - : getType().determineRawClass().getName(), - getName(), - getMethodKind().name() - ); - - collector.indent( 2 ); - getArgumentTypes().forEach( (arg) -> collector.addLine( " - %s", arg.getName() ) ); - collector.unindent( 2 ); - } } diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/RecordComponentDetails.java b/hibernate-models/src/main/java/org/hibernate/models/spi/RecordComponentDetails.java index 4c80b1a..7eea8e8 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/RecordComponentDetails.java +++ b/hibernate-models/src/main/java/org/hibernate/models/spi/RecordComponentDetails.java @@ -8,8 +8,6 @@ package org.hibernate.models.spi; import org.hibernate.models.IllegalCastException; -import org.hibernate.models.internal.AnnotationHelper; -import org.hibernate.models.internal.RenderingCollectorImpl; import static org.hibernate.models.spi.AnnotationTarget.Kind.RECORD_COMPONENT; @@ -49,18 +47,4 @@ default RecordComponentDetails asRecordComponentDetails() { return this; } - @Override - default void render(SourceModelBuildingContext modelContext) { - final RenderingCollectorImpl renderingCollector = new RenderingCollectorImpl(); - render( renderingCollector, modelContext ); - renderingCollector.render(); - } - - @Override - default void render(RenderingCollector collector, SourceModelBuildingContext modelContext) { - forEachDirectAnnotationUsage( (usage) -> AnnotationHelper.render( collector, usage, modelContext ) ); - // todo : would be nice to render the type-details to include generics, etc - collector.addLine( "%s %s", getType().determineRawClass().getName(), getName() ); - } - } diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/RenderingCollector.java b/hibernate-models/src/main/java/org/hibernate/models/spi/RenderingCollector.java deleted file mode 100644 index 490ca37..0000000 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/RenderingCollector.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * SPDX-License-Identifier: Apache-2.0 - * Copyright: Red Hat Inc. and Hibernate Authors - */ - -package org.hibernate.models.spi; - -/** - * @author Steve Ebersole - */ -public interface RenderingCollector { - void addLine(String line); - void addLine(String pattern, Object... args); - void addLine(); - - void indent(int depth); - void unindent(int depth); - - default void render() { - System.out.println( toString() ); - } -} diff --git a/hibernate-models/src/main/java/org/hibernate/models/spi/ValueTypeDescriptor.java b/hibernate-models/src/main/java/org/hibernate/models/spi/ValueTypeDescriptor.java index df93e02..c265173 100644 --- a/hibernate-models/src/main/java/org/hibernate/models/spi/ValueTypeDescriptor.java +++ b/hibernate-models/src/main/java/org/hibernate/models/spi/ValueTypeDescriptor.java @@ -8,6 +8,9 @@ import java.lang.annotation.Annotation; +import org.hibernate.models.rendering.spi.Renderer; +import org.hibernate.models.rendering.spi.RenderingTarget; + /** * Descriptor for the annotation attribute types, acting as a producer for * {@link AttributeDescriptor}, {@link JandexValueConverter} and {@link JandexValueExtractor} references @@ -34,12 +37,17 @@ public interface ValueTypeDescriptor { V[] makeArray(int size, SourceModelBuildingContext modelContext); default void render( - RenderingCollector collector, String name, Object attributeValue, - SourceModelBuildingContext modelContext) { - collector.addLine( "%s=%s", name, "..." ); + RenderingTarget target, + Renderer renderer, + SourceModelContext modelContext) { + target.addLine( "%s = %s", name, "..." ); } - void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext); + void render( + Object attributeValue, + RenderingTarget target, + Renderer renderer, + SourceModelContext modelContext); }