refactor/clean the connector generator code

This commit is contained in:
hongwei 2024-10-30 11:41:11 +01:00
parent 144f8283ec
commit 2da41e6df8
13 changed files with 85 additions and 107 deletions

View File

@ -1,49 +0,0 @@
package code.bankconnectors
import scala.concurrent.Future
import scala.reflect.runtime.{universe => ru}
object CommonsCaseClassGenerator extends App {
def extractReturnModel(tp: ru.Type): ru.Type = {
if (tp.typeArgs.isEmpty) {
tp
} else {
extractReturnModel(tp.typeArgs(0))
}
}
private val mirror: ru.Mirror = ru.runtimeMirror(this.getClass.getClassLoader)
private val clazz: ru.ClassSymbol = mirror.typeOf[Connector].typeSymbol.asClass
private val retureFutureMethods: Iterable[ru.Type] = mirror.typeOf[Connector].decls.filter(symbol => {
val isMethod = symbol.isMethod && !symbol.asMethod.isVal && !symbol.asMethod.isVar && !symbol.asMethod.isConstructor
isMethod
}).map(it => it.asMethod.returnType)
.filter(it => it <:< ru.typeOf[Future[_]])
val returnModels: Iterable[ru.Type] = retureFutureMethods
.map(extractReturnModel)
.filter(it => {
val symbol = it.typeSymbol
val isAbstract = symbol.isAbstract
val isOurClass = symbol.fullName.matches("(code\\.|com.openbankproject\\.).+")
isAbstract && isOurClass
})
.toSet
returnModels.map(_.typeSymbol.fullName).foreach(it => println(s"import $it"))
def mkClass(tp: ru.Type) = {
val varibles = tp.decls.map(it => s"${it.name} :${it.typeSignature.typeSymbol.name}").mkString(", \n ")
s"""
|case class ${tp.typeSymbol.name}Commons(
| $varibles) extends ${tp.typeSymbol.name}
|object ${tp.typeSymbol.name}Commons extends Converter[${tp.typeSymbol.name}, ${tp.typeSymbol.name}Commons]
""".stripMargin
}
// private val str: String = ru.typeOf[Bank].decls.map(it => s"${it.name} :${it.typeSignature.typeSymbol.name}").mkString(", \n")
returnModels.map(mkClass).foreach(println)
println()
}

View File

@ -1,8 +1,6 @@
package code.bankconnectors
import java.lang.reflect.Method
import code.api.util.{CallContext, CustomJsonFormats, OptionalFieldSerializer, OBPQueryParam}
import code.api.util.{CallContext, CustomJsonFormats, OBPQueryParam, OptionalFieldSerializer}
import com.openbankproject.commons.ExecutionContext.Implicits.global
import com.openbankproject.commons.dto.{InBoundTrait, OutInBoundTransfer}
import com.openbankproject.commons.model.TopicTrait
@ -13,43 +11,12 @@ import net.liftweb.json.JsonDSL._
import net.liftweb.json.{Formats, JObject, JValue}
import net.sf.cglib.proxy.{Enhancer, MethodInterceptor, MethodProxy}
import org.apache.commons.lang3.StringUtils
import java.lang.reflect.Method
import scala.concurrent.Future
import scala.reflect.runtime.universe
import scala.reflect.ManifestFactory
import scala.reflect.runtime.universe
object ConnectorUtils {
/**
* //def getAdapterInfo(callContext: Option[CallContext]) : Future[Box[(InboundAdapterInfoInternal, Option[CallContext])]] = ???
* //def validateAndCheckIbanNumber(iban: String, callContext: Option[CallContext]): OBPReturnType[Box[IbanChecker]] = ???
*
* This method will only extact the first return class from the method, this is the OBP pattern.
* so we can use it for gernerate the commons case class.
*
* eg: getAdapterInfo --> return InboundAdapterInfoInternal
* validateAndCheckIbanNumber -->return IbanChecker
*/
def extractReturnModel(tp: universe.Type): universe.Type = {
if (tp.typeArgs.isEmpty) {
tp
} else {
extractReturnModel(tp.typeArgs(0))
}
}
val mirror: universe.Mirror = universe.runtimeMirror(this.getClass.getClassLoader)
val clazz: universe.ClassSymbol = mirror.typeOf[Connector].typeSymbol.asClass
val connectorDecls= mirror.typeOf[Connector].decls
val connectorDeclsMethods= connectorDecls.filter(symbol => {
val isMethod = symbol.isMethod && !symbol.asMethod.isVal && !symbol.asMethod.isVar && !symbol.asMethod.isConstructor && !symbol.isProtected
isMethod})
val connectorDeclsMethodsReturnOBPRequiredType = connectorDeclsMethods
.map(it => it.asMethod)
.filter(it => {
extractReturnModel(it.returnType).typeSymbol.fullName.matches("((code\\.|com.openbankproject\\.).+)|(scala\\.Boolean)") //to make sure, it returned the OBP class and Boolean.
})
lazy val proxyConnector: Connector = {
val excludeProxyMethods = Set("getDynamicEndpoints", "dynamicEntityProcess", "setAccountHolder", "updateUserAccountViewsOld")

View File

@ -1,6 +1,6 @@
package code.bankconnectors.akka
import code.bankconnectors.ConnectorBuilderUtil._
import code.bankconnectors.generator.ConnectorBuilderUtil._
import scala.language.postfixOps

View File

@ -0,0 +1,33 @@
package code.bankconnectors.generator
import code.bankconnectors.generator.ConnectorBuilderUtil._
import scala.reflect.runtime.{universe => ru}
object CommonsCaseClassGenerator extends App {
val returnModels: Iterable[ru.Type] = connectorDeclsMethodsReturnOBPRequiredType
.map(it => it.asMethod.returnType)
.filter(it => {
val symbol = it.typeSymbol
val isAbstract = symbol.isAbstract
isAbstract //Depends here, maybe no need this guard for some commons classes.
})
.toSet
returnModels.map(_.typeSymbol.fullName).foreach(it => println(s"import $it"))
def mkClass(tp: ru.Type) = {
val varibles = tp.decls.map(it => s"${it.name} :${it.typeSignature.typeSymbol.name}").mkString(", \n ")
s"""
|case class ${tp.typeSymbol.name}Commons(
| $varibles) extends ${tp.typeSymbol.name}
|object ${tp.typeSymbol.name}Commons extends Converter[${tp.typeSymbol.name}, ${tp.typeSymbol.name}Commons]
""".stripMargin
}
// private val str: String = ru.typeOf[Bank].decls.map(it => s"${it.name} :${it.typeSignature.typeSymbol.name}").mkString(", \n")
returnModels.map(mkClass).foreach(println)
println()
}

View File

@ -1,16 +1,15 @@
package code.bankconnectors
package code.bankconnectors.generator
import java.io.File
import java.util.Date
import code.api.util.{APIUtil, CallContext}
import code.api.util.CodeGenerateUtils.createDocExample
import code.api.util.{APIUtil, CallContext}
import code.bankconnectors.Connector
import code.bankconnectors.vSept2018.KafkaMappedConnector_vSept2018
import com.openbankproject.commons.util.ReflectUtils
import org.apache.commons.io.FileUtils
import org.apache.commons.lang3.StringUtils.uncapitalize
import scala.collection.immutable.List
import java.io.File
import java.util.Date
import scala.language.postfixOps
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{universe => ru}
@ -31,9 +30,38 @@ object ConnectorBuilderUtil {
// if(ctClass != null) ctClass.detach()
}
private val mirror: ru.Mirror = ru.runtimeMirror(getClass().getClassLoader)
private val clazz: ru.ClassSymbol = ru.typeOf[Connector].typeSymbol.asClass
/**
* //def getAdapterInfo(callContext: Option[CallContext]) : Future[Box[(InboundAdapterInfoInternal, Option[CallContext])]] = ???
* //def validateAndCheckIbanNumber(iban: String, callContext: Option[CallContext]): OBPReturnType[Box[IbanChecker]] = ???
*
* This method will only extact the first return class from the method, this is the OBP pattern.
* so we can use it for gernerate the commons case class.
*
* eg: getAdapterInfo --> return InboundAdapterInfoInternal
* validateAndCheckIbanNumber -->return IbanChecker
*/
def extractReturnModel(tp: ru.Type): ru.Type = {
if (tp.typeArgs.isEmpty) {
tp
} else {
extractReturnModel(tp.typeArgs(0))
}
}
val mirror: ru.Mirror = ru.runtimeMirror(this.getClass.getClassLoader)
val clazz: ru.ClassSymbol = mirror.typeOf[Connector].typeSymbol.asClass
val connectorDecls: MemberScope = mirror.typeOf[Connector].decls
val connectorDeclsMethods: Iterable[Symbol] = connectorDecls.filter(symbol => {
val isMethod = symbol.isMethod && !symbol.asMethod.isVal && !symbol.asMethod.isVar && !symbol.asMethod.isConstructor && !symbol.isProtected
isMethod})
val connectorDeclsMethodsReturnOBPRequiredType: Iterable[MethodSymbol] = connectorDeclsMethods
.map(it => it.asMethod)
.filter(it => {
extractReturnModel(it.returnType).typeSymbol.fullName.matches("((code\\.|com.openbankproject\\.).+)|(scala\\.Boolean)") //to make sure, it returned the OBP class and Boolean.
})
private val classMirror: ru.ClassMirror = mirror.reflectClass(clazz)
/*
* generateMethods and buildMethods has the same function, only responseExpression parameter type
* different, because overload method can't compile for different responseExpression parameter.

View File

@ -1,6 +1,6 @@
package code.bankconnectors
package code.bankconnectors.generator
import code.bankconnectors.ConnectorUtils._
import code.bankconnectors.generator.ConnectorBuilderUtil._
object InOutCaseClassGenerator extends App {

View File

@ -1,12 +1,11 @@
package code.bankconnectors.rabbitmq.Adapter
import code.api.ResourceDocs1_4_0.MessageDocsSwaggerDefinitions.{outboundAdapterAuthInfo, successStatus}
import code.api.ResourceDocs1_4_0.MessageDocsSwaggerDefinitions.successStatus
import code.api.util.APIUtil.MessageDoc
import code.api.util.CustomJsonFormats.formats
import code.api.util.{APIUtil, NewStyle, OptionalFieldSerializer}
import code.bankconnectors.{Connector, ConnectorBuilderUtil}
import code.bankconnectors.Connector.connector
import code.bankconnectors.ConnectorBuilderUtil._
import code.api.util.{APIUtil, NewStyle}
import code.bankconnectors.generator.ConnectorBuilderUtil
import code.bankconnectors.generator.ConnectorBuilderUtil._
import code.bankconnectors.rabbitmq.RabbitMQConnector_vOct2024
import com.openbankproject.commons.model.{Status, TopicTrait}
import com.openbankproject.commons.util.Functions

View File

@ -1,6 +1,6 @@
package code.bankconnectors.rabbitmq
import code.bankconnectors.ConnectorBuilderUtil._
import code.bankconnectors.generator.ConnectorBuilderUtil._
import net.liftweb.util.StringHelpers
import scala.language.postfixOps

View File

@ -1,6 +1,6 @@
package code.bankconnectors.rest
import code.bankconnectors.ConnectorBuilderUtil._
import code.bankconnectors.generator.ConnectorBuilderUtil._
import scala.language.postfixOps

View File

@ -7,7 +7,7 @@ import code.api.ResourceDocs1_4_0.MessageDocsSwaggerDefinitions.successStatus
import code.api.util.APIUtil.MessageDoc
import code.api.util.CustomJsonFormats.formats
import code.api.util.{APIUtil, OptionalFieldSerializer}
import code.bankconnectors.ConnectorBuilderUtil._
import code.bankconnectors.generator.ConnectorBuilderUtil._
import com.openbankproject.commons.model.Status
import com.openbankproject.commons.util.Functions
import net.liftweb.json

View File

@ -1,6 +1,6 @@
package code.bankconnectors.storedprocedure
import code.bankconnectors.ConnectorBuilderUtil._
import code.bankconnectors.generator.ConnectorBuilderUtil._
import net.liftweb.util.StringHelpers
import scala.language.postfixOps

View File

@ -1,6 +1,6 @@
package code.bankconnectors.vMay2019
import code.bankconnectors.ConnectorBuilderUtil._
import code.bankconnectors.generator.ConnectorBuilderUtil._
import scala.collection.immutable.List
import scala.language.postfixOps

View File

@ -1,6 +1,6 @@
package code.bankconnectors.vSept2018
import code.bankconnectors.ConnectorBuilderUtil._
import code.bankconnectors.generator.ConnectorBuilderUtil._
import scala.collection.immutable.List
import scala.language.postfixOps