Skip to content

Commit

Permalink
Added generator for microprofile openapi schema #96
Browse files Browse the repository at this point in the history
Added attribute :
'package-helper-microprofile'
To daogen-config

Added attribute :
'exampleData'
To field

And relevant implementation
  • Loading branch information
fugerit79 committed Nov 14, 2024
1 parent c5efca8 commit 841cc42
Show file tree
Hide file tree
Showing 58 changed files with 1,102 additions and 593 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [1.8.4] - 2024-11-10

### Added

- package-helper-microprofile, to add model wrapper with openapi annotation.

### Fixed

- use of LocalDateTime.now() in data facade when 'type-mapper-time-ng' is enabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ private DaogenCatalogConstants() {}

public static final String GEN_PROP_PACKAGE_MODEL = "package-model";
public static final String GEN_PROP_PACKAGE_HELPER = "package-helper";
public static final String GEN_PROP_PACKAGE_HELPER_MICROPROFILE = "package-helper-microprofile";
public static final String GEN_PROP_PACKAGE_FACADE_DEF = "package-facade-def";
public static final String GEN_PROP_PACKAGE_FACADE_DATA_IMPL = "package-facade-data-impl";
public static final String GEN_PROP_PACKAGE_RSE = "package-rse";
Expand Down Expand Up @@ -111,6 +112,8 @@ private DaogenCatalogConstants() {}
public static final String PREFIX_HELPER = "Helper";

public static final String PREFIX_WRAPPER = "Wrapper";

public static final String PREFIX_MPSCHEMA = "MPSchema";

public static final String PREFIX_RESTLOAD = "Load";

Expand Down Expand Up @@ -149,6 +152,10 @@ public static String rseName( DaogenCatalogEntity entity ) {
public static String wrapperName( DaogenCatalogEntity entity ) {
return PREFIX_WRAPPER+entity.toClassName();
}

public static String mpSchemaName( DaogenCatalogEntity entity ) {
return PREFIX_MPSCHEMA+entity.toClassName();
}

public static String finderlName( DaogenCatalogEntity entity ) {
return entity.toClassName()+SUFFIX_FINDER;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ public class DaogenCatalogField extends BasicIdConfigType {
public static final String ATT_COMMENTS = "comments";
public static final String ATT_UDT = "udt";
public static final String ATT_STRUCT_TYPE = "structType";

public static final String ATT_STRUCT_SQL_TYPE = "structSqlType=";
public static final String ATT_VIRTUAL = "virtual";
public static final String ATT_EXAMPLE_DATA = "exampleData";

/**
*
Expand Down Expand Up @@ -48,6 +49,8 @@ public class DaogenCatalogField extends BasicIdConfigType {

private String virtual;

private String exampleData;

public boolean isUserType() {
return BooleanUtils.isTrue( this.getUdt() );
}
Expand Down Expand Up @@ -140,6 +143,15 @@ public void setVirtual(String virtual) {
this.virtual = virtual;
}

public String getExampleData() {
return exampleData;
}

public void setExampleData(String exampleData) {
this.exampleData = exampleData;
}


public String describe() {
List<String> list = new ArrayList<>();
list.add( StringUtils.concat( ":" , ATT_SQL_TYPE, this.getSqlType() ) );
Expand All @@ -151,6 +163,7 @@ public String describe() {
list.add( StringUtils.concat( ":" , ATT_UDT, this.getUdt() ) );
list.add( StringUtils.concat( ":" , ATT_STRUCT_TYPE, this.getStructType() ) );
list.add( StringUtils.concat( ":" , ATT_VIRTUAL, this.getVirtual() ) );
list.add( StringUtils.concat( ":" , ATT_EXAMPLE_DATA, this.getExampleData() ) );
return StringUtils.concat( ",", list );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public abstract class DaogenBasicGenerator extends SimpleJavaGenerator implement

protected static final String CLOSE_AND_THROWS = " ) throws ";

protected static final String AT_OVERRIDE = "@Override";
public static final String AT_OVERRIDE = "@Override";

protected static final String REAL_CLASS_COMMENT = TAB+"// [HELPER/IMPL MODEL] this class is a stub and can be modified as you see fit (it will not been overwritten)";

Expand Down Expand Up @@ -71,7 +71,7 @@ public abstract class DaogenBasicGenerator extends SimpleJavaGenerator implement

protected static final String RETURN_RES_LIT = "return res;";

protected static final String PUBLIC_SPACE_LIT = "public ";
public static final String PUBLIC_SPACE_LIT = "public ";

protected static final String PUBLIC_STATIC_SPACE_LIT = "public static ";

Expand Down Expand Up @@ -162,7 +162,7 @@ protected boolean isJdkVersionEquals( Integer jdkVerson ) {
return this.getJdkTargetVersion().intValue() == jdkVerson.intValue();
}

protected boolean isJdkVersionAtLeast( Integer jdkVerson ) {
public boolean isJdkVersionAtLeast( Integer jdkVerson ) {
return this.getJdkTargetVersion().intValue() >= jdkVerson.intValue();
}

Expand Down Expand Up @@ -270,7 +270,7 @@ public String getEntityHelperName() {
public String getEntityWrapperName() {
return DaogenCatalogConstants.wrapperName( this.getCurrentEntity() );
}

public String getEntityFacadeDefName() {
return DaogenCatalogConstants.facadeDefName( this.getCurrentEntity() );
}
Expand Down Expand Up @@ -377,7 +377,7 @@ public String getClassBaseWrapper() {
return classBaseWrapper;
}

protected void setClassBaseWrapper(String classBaseWrapper) {
public void setClassBaseWrapper(String classBaseWrapper) {
this.classBaseWrapper = classBaseWrapper;
}

Expand Down Expand Up @@ -472,7 +472,7 @@ protected void beforeClass() {
}
}

protected void generateSerial( boolean condition ) throws IOException {
public void generateSerial( boolean condition ) throws IOException {
if ( condition ) {
this.addSerialVerUID();
this.writeSerialHelpers();
Expand All @@ -494,4 +494,13 @@ protected void writeSerialHelpers() {
this.getWriter().println();
}

@Override
public void setExtendsClass(String extendsClass) {
super.setExtendsClass(extendsClass);
}

@Override
public void setImplementsInterface(String implementsInterface) {
super.setImplementsInterface(implementsInterface);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.fugerit.java.daogen.base.gen;

import org.fugerit.java.core.cfg.ConfigException;
import org.fugerit.java.core.db.dao.DAOException;
import org.fugerit.java.core.lang.helpers.StringUtils;
import org.fugerit.java.daogen.base.config.*;
import org.fugerit.java.daogen.base.gen.util.WrapperUtils;

import java.io.IOException;

public class MicroProfileSchemaWrapperGenerator extends DaogenBasicGenerator {

public static final String KEY = "MicroProfileSchemaWrapperGenerator";

@Override
public String getKey() {
return KEY;
}

public void init( DaogenCatalogConfig daogenConfig, DaogenCatalogEntity entity ) throws ConfigException {
super.init( daogenConfig.getGeneralProp( DaogenCatalogConstants.GEN_PROP_SRC_MAIN_JAVA ),
fullObjectName( daogenConfig.getGeneralProp( DaogenCatalogConstants.GEN_PROP_PACKAGE_HELPER_MICROPROFILE ), DaogenCatalogConstants.mpSchemaName( entity ) ),
STYLE_CLASS, daogenConfig, entity );
this.getImportList().add( "org.eclipse.microprofile.openapi.annotations.media.Schema" );
WrapperUtils.init( daogenConfig, entity, this );
new DaogenBasicDecorator() {
@Override
public void addBeforeClass() throws DAOException {
super.addBeforeClass();
if ( StringUtils.isNotEmpty( entity.getComments() ) ) {
this.accessGenerator().println( String.format( "@Schema( description = \"%s\")" , entity.getComments() ) );
}
}
}.init( this );
}

@Override
public String getEntityWrapperName() {
return DaogenCatalogConstants.mpSchemaName( this.getCurrentEntity() );
}

@Override
public void generateDaogenBody() throws IOException {
WrapperUtils.generateBody( this, f -> {
if (StringUtils.isNotEmpty( f.getComments() ) ) {
String base = "@Schema( description = \"%s\" %s)";
String extra = "";
if ( StringUtils.isNotEmpty( f.getExampleData() ) ) {
extra = String.format( ", example =\"%s\"", f.getExampleData() );
}
return String.format( base , f.getComments(), extra );
} else {
return null;
}
} );
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.fugerit.java.daogen.base.config.DaogenCatalogField;
import org.fugerit.java.daogen.base.config.DaogenCatalogRelation;
import org.fugerit.java.daogen.base.config.DaogenClassConfigHelper;
import org.fugerit.java.daogen.base.gen.util.WrapperUtils;

public class WrapperGenerator extends DaogenBasicGenerator {

Expand All @@ -26,119 +27,12 @@ public void init( DaogenCatalogConfig daogenConfig, DaogenCatalogEntity entity )
super.init( daogenConfig.getGeneralProp( DaogenCatalogConstants.GEN_PROP_SRC_MAIN_JAVA ),
fullObjectName( daogenConfig.getGeneralProp( DaogenCatalogConstants.GEN_PROP_PACKAGE_HELPER ), DaogenCatalogConstants.wrapperName( entity ) ),
STYLE_CLASS, daogenConfig, entity );
String daoWrapperNgMode = daogenConfig.getGeneralProp( DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE, DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE_DISABLED );
logger.info( "{} -> {}", DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE, daoWrapperNgMode );
if ( DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE_DISABLED.equalsIgnoreCase( daoWrapperNgMode ) ) {
this.setClassBaseWrapper( DaogenClassConfigHelper.addImport( daogenConfig , DaogenClassConfigHelper.DAO_WRAPPER_BASE, this.getImportList() ) );
this.setExtendsClass( this.getClassBaseWrapper()+"<"+this.getEntityModelName()+">" );
} else if ( DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE_ENABLED.equalsIgnoreCase( daoWrapperNgMode ) ) {
String wrapperNgClass = DaogenClassConfigHelper.findClassConfigProp( daogenConfig, DaogenClassConfigHelper.DAO_WRAPPER_NG_BASE, DaogenClassConfigHelper.DAO_BASE_CLASS );
if ( StringUtils.isNotEmpty( wrapperNgClass ) ) {
this.setClassBaseWrapper( DaogenClassConfigHelper.addImport( daogenConfig , DaogenClassConfigHelper.DAO_WRAPPER_NG_BASE, this.getImportList() ) );
this.setExtendsClass( this.getClassBaseWrapper()+"<"+this.getEntityModelName()+">" );
}
} else {
throw new ConfigException( "Invalid "+DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE+" parameter : "+daoWrapperNgMode );
}
this.getImportList().add( this.getDaogenConfig().getGeneralProp( DaogenCatalogConstants.GEN_PROP_PACKAGE_MODEL )+"."+this.getEntityModelName() );
this.setImplementsInterface( this.getEntityModelName() );
for ( DaogenCatalogRelation relation : this.getCurrentEntity().getRelations() ) {
DaogenCatalogEntity entityTo = this.getDaogenConfig().getListMap( relation.getTo() );
this.getImportList().add( this.getDaogenConfig().getGeneralProp( DaogenCatalogConstants.GEN_PROP_PACKAGE_MODEL )+"."+DaogenCatalogConstants.modelName( entityTo ) );
}
}

private void generateRelations() {
if ( !this.getCurrentEntity().getRelations().isEmpty() ) {
this.getWriter().println( TAB+"/*" );
this.getWriter().println( TAB+" * fields generated for relations " );
this.getWriter().println( TAB+" */" );
this.getWriter().println();
for ( DaogenCatalogRelation relation : this.getCurrentEntity().getRelations() ) {
DaogenCatalogEntity entityTo = this.getDaogenConfig().getListMap( relation.getTo() );
String baseType = DaogenCatalogConstants.modelName( entityTo );
String className = GeneratorNameHelper.toClassName( relation.getName() );
if ( DaogenCatalogRelation.MODE_MANY.equalsIgnoreCase( relation.getMode() ) ) {
baseType = "java.util.List<"+baseType+">";
}
// metodo set
this.getWriter().println( TAB+AT_OVERRIDE );
this.getWriter().println( TAB+"public void set"+className+"( "+baseType+" value ) {" );
this.getWriter().println( TAB_2+"this.unwrapModel().set"+className+"( value );" );
this.getWriter().println( TAB+"}" );
this.getWriter().println();
// metodo get
this.getWriter().println( TAB+AT_OVERRIDE );
this.getWriter().println( TAB+PUBLIC_SPACE_LIT+baseType+" get"+className+"() {" );
this.getWriter().println( TAB_2+"return this.unwrapModel().get"+className+"();" );
this.getWriter().println( TAB+"}" );
this.getWriter().println();
}
}
WrapperUtils.init( daogenConfig, entity, this );
}

@Override
public void generateDaogenBody() throws IOException {
String daoWrapperNgMode = this.getDaogenConfig().getGeneralProp( DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE, DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE_DISABLED );
this.generateSerial( DaogenCatalogConstants.GEN_PROP_DAO_WRAPPER_NG_MODE_DISABLED.equalsIgnoreCase( daoWrapperNgMode ) );
this.getWriter().println( TAB+PUBLIC_SPACE_LIT+this.getEntityWrapperName()+"( "+this.getEntityModelName()+" wrapped ) {" );
this.getWriter().println( TAB_2+"super( wrapped );" );
this.getWriter().println( TAB+"}" );
this.getWriter().println();
this.getWriter().println( TAB+PUBLIC_SPACE_LIT+this.getEntityModelName()+" unwrap( "+this.getEntityWrapperName()+" wrapper ) {" );
this.getWriter().println( TAB_2+""+this.getEntityModelName()+" res = wrapper;" );
if ( this.isJdkVersionAtLeast( DaogenCatalogConstants.GEN_PROP_JDK_TARGET_VERSION_17 ) ) {
this.getWriter().println( TAB_2+"while ( res instanceof "+this.getEntityWrapperName()+" wrappedinstance ) { " );
this.getWriter().println( TAB_3+"res = wrappedinstance.unwrapModel();" );
} else {
this.getWriter().println( TAB_2+"while ( res instanceof "+this.getEntityWrapperName()+" ) { " );
this.getWriter().println( TAB_3+"res = (("+this.getEntityWrapperName()+")res).unwrapModel();" );
}
this.getWriter().println( TAB_2+"}" );
this.getWriter().println( TAB_2+"return res;" );
this.getWriter().println( TAB+"}" );
this.getWriter().println();

boolean relationLast = "true".equalsIgnoreCase( this.getDaogenConfig().getGeneralProp( DaogenCatalogConstants.GEN_PROP_RELATIONS_LAST ) );
if ( !relationLast ) {
this.generateRelations();
}

this.getWriter().println( TAB+"/*" );
this.getWriter().println( TAB+" * fields generated for entity attributes " );
this.getWriter().println( TAB+" */" );
for ( DaogenCatalogField field : this.getCurrentEntity().getAllFields() ) {
// property
String javaSuffix = GeneratorNameHelper.toClassName( field.getId() );
String realJavaType = this.getDaogenConfig().getTypeMapper().mapForModel( field );
// metodo set
this.getWriter().println( TAB+AT_OVERRIDE );
this.getWriter().println( TAB+"public void set"+javaSuffix+"( "+realJavaType+" value ) {" );
this.getWriter().println( TAB_2+"this.unwrapModel().set"+javaSuffix+"( value );" );
this.getWriter().println( TAB+"}" );
this.getWriter().println();
// metodo get
this.getWriter().println( TAB+AT_OVERRIDE );
this.getWriter().println( TAB+PUBLIC_SPACE_LIT+realJavaType+" get"+javaSuffix+"() {" );
this.getWriter().println( TAB_2+"return this.unwrapModel().get"+javaSuffix+"();" );
this.getWriter().println( TAB+"}" );
this.getWriter().println();
}

if ( relationLast ) {
this.generateRelations();
}

if ( BooleanUtils.isTrue( this.getDaogenConfig().getGeneralProp( DaogenCatalogConstants.GEN_PROP_CHECK_EMPTY_INTERFACE ) ) ) {
this.getWriter().println( TAB+AT_OVERRIDE );
this.getWriter().println( TAB+"public boolean isEmpty() {" );
this.getWriter().println( TAB_2+"return this.unwrapModel().isEmpty();" );
this.getWriter().println( TAB+"}" );
this.getWriter().println();
}

WrapperUtils.generateBody( this, f -> null );
}



}
Loading

0 comments on commit 841cc42

Please sign in to comment.