#add_swagger_gen add class scan tool

This commit is contained in:
shuang bai 2019-02-07 20:50:04 +08:00
parent 11f9b74d70
commit e19823226f
13 changed files with 92 additions and 49 deletions

View File

@ -373,7 +373,12 @@
<artifactId>flexmark-all</artifactId>
<version>0.40.8</version>
</dependency>
<!--scala utils, for type scan-->
<dependency>
<groupId>org.clapper</groupId>
<artifactId>classutil_${scala.version}</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
<build>

View File

@ -270,6 +270,7 @@ class Boot extends MdcLoggable {
}
// Add the various API versions
ScannedApis.versionMapScannedApis.keys.foreach(enableVersionIfAllowed)
enableVersionIfAllowed(ApiVersion.v1_2_1)
enableVersionIfAllowed(ApiVersion.v1_3_0)
enableVersionIfAllowed(ApiVersion.v1_4_0)
@ -279,11 +280,9 @@ class Boot extends MdcLoggable {
enableVersionIfAllowed(ApiVersion.v3_0_0)
enableVersionIfAllowed(ApiVersion.v3_1_0)
enableVersionIfAllowed(ApiVersion.berlinGroupV1)
enableVersionIfAllowed(ApiVersion.berlinGroupV1_3)
enableVersionIfAllowed(ApiVersion.ukOpenBankingV200)
enableVersionIfAllowed(ApiVersion.apiBuilder)
// TODO Wrap these with enableVersionIfAllowed as well
//add management apis
LiftRules.statelessDispatch.append(ImporterAPI)

View File

@ -10,7 +10,7 @@ import code.api.cache.Caching
import code.api.util.APIUtil._
import code.api.util.ApiTag._
import code.api.util.ApiRole._
import code.api.util.{APIUtil, ApiVersion}
import code.api.util.{APIUtil, ApiVersion, ScannedApiVersion, ScannedApis}
import code.api.v1_4_0.{APIMethods140, JSONFactory1_4_0, OBPAPI1_4_0}
import code.api.v2_2_0.{APIMethods220, OBPAPI2_2_0}
import code.api.v3_0_0.OBPAPI3_0_0
@ -115,7 +115,6 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
val resourceDocs = requestedApiVersion match {
case ApiVersion.`apiBuilder` => OBP_APIBuilder.allResourceDocs
case ApiVersion.`ukOpenBankingV200` => OBP_UKOpenBanking_200.allResourceDocs
case ApiVersion.`berlinGroupV1_3` => OBP_BERLIN_GROUP_1_3.allResourceDocs
case ApiVersion.`berlinGroupV1` => OBP_BERLIN_GROUP_1.allResourceDocs
case ApiVersion.v3_1_0 => OBPAPI3_1_0.allResourceDocs
case ApiVersion.v3_0_0 => OBPAPI3_0_0.allResourceDocs
@ -125,6 +124,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
case ApiVersion.v1_4_0 => Implementations1_4_0.resourceDocs ++ Implementations1_3_0.resourceDocs ++ Implementations1_2_1.resourceDocs
case ApiVersion.v1_3_0 => Implementations1_3_0.resourceDocs ++ Implementations1_2_1.resourceDocs
case ApiVersion.v1_2_1 => Implementations1_2_1.resourceDocs
case version: ScannedApiVersion => ScannedApis.versionMapScannedApis(version).allResourceDocs
case _ => ArrayBuffer.empty[ResourceDoc]
}
@ -133,7 +133,6 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
val versionRoutes = requestedApiVersion match {
case ApiVersion.`apiBuilder` => OBP_APIBuilder.routes
case ApiVersion.`ukOpenBankingV200` => OBP_UKOpenBanking_200.routes
case ApiVersion.`berlinGroupV1_3` => OBP_BERLIN_GROUP_1_3.routes
case ApiVersion.`berlinGroupV1` => OBP_BERLIN_GROUP_1.routes
case ApiVersion.v3_1_0 => OBPAPI3_1_0.routes
case ApiVersion.v3_0_0 => OBPAPI3_0_0.routes
@ -143,6 +142,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
case ApiVersion.v1_4_0 => OBPAPI1_4_0.routes
case ApiVersion.v1_3_0 => OBPAPI1_3_0.routes
case ApiVersion.v1_2_1 => OBPAPI1_2_1.routes
case version: ScannedApiVersion => ScannedApis.versionMapScannedApis(version).routes
case _ => Nil
}
@ -166,8 +166,8 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
{
case ApiVersion.`apiBuilder` => ;
case ApiVersion.`ukOpenBankingV200` => ;
case ApiVersion.`berlinGroupV1_3` => ;
case ApiVersion.`berlinGroupV1` => ;
case version: ScannedApiVersion => ;
case _ => activePlusLocalResourceDocs ++= localResourceDocs
}
// activePlusLocalResourceDocs ++= localResourceDocs
@ -183,23 +183,23 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
x <- activePlusLocalResourceDocs
// This is the "implemented in" url
url = x.implementedInApiVersion match {
case ApiVersion.`berlinGroupV1_3` => s"/berlin-group/${x.implementedInApiVersion.vDottedApiVersion}${x.requestUrl}"
case ApiVersion.`berlinGroupV1` => s"/berlin-group/${x.implementedInApiVersion.vDottedApiVersion}${x.requestUrl}"
case ApiVersion.`ukOpenBankingV200` => s"/open-banking/${x.implementedInApiVersion.vDottedApiVersion}${x.requestUrl}"
case ApiVersion.`apiBuilder` => s"/api-builder/${x.implementedInApiVersion.vDottedApiVersion}${x.requestUrl}"
// We add the /obp/vX prefix here
case version: ScannedApiVersion => s"/${version.urlPrefix}/${x.implementedInApiVersion.vDottedApiVersion}${x.requestUrl}"
case _ => s"/obp/${x.implementedInApiVersion.vDottedApiVersion}${x.requestUrl}"
}
y = x.copy(isFeatured = getIsFeaturedApi(x.partialFunctionName),
specialInstructions = getSpecialInstructions(x.partialFunctionName),
requestUrl = url,
specifiedUrl = x.implementedInApiVersion match {
case ApiVersion.`berlinGroupV1_3` => Some(url)
case ApiVersion.`berlinGroupV1` => Some(url)
case ApiVersion.`ukOpenBankingV200` => Some(url)
case ApiVersion.`apiBuilder` => Some(url)
// We add the /obp/vX prefix here - but this is the requested API version by the resource docs endpoint. i.e. we know this endpoint
// is also available here as well as the requestUrl. See the resource doc for resource doc!
case version: ScannedApiVersion => Some(url)
case _ => Some(s"/obp/${requestedApiVersion.vDottedApiVersion}${x.requestUrl}")
}

View File

@ -1,10 +1,9 @@
package code.api.builder.AccountInformationServiceAISApi
import code.api.APIFailureNewStyle
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.berlin.group.v1_3.{JSONFactory_BERLIN_GROUP_1_3, JvalueCaseClass, OBP_BERLIN_GROUP_1_3}
import net.liftweb.json
import net.liftweb.json._
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3
import code.api.util.APIUtil.{defaultBankId, _}
import code.api.util.{ApiVersion, NewStyle}
import code.api.util.ErrorMessages._
@ -17,13 +16,14 @@ import code.views.Views
import net.liftweb.common.Full
import net.liftweb.http.rest.RestHelper
import com.github.dwickern.macros.NameOf.nameOf
import scala.collection.immutable.Nil
import scala.collection.mutable.ArrayBuffer
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object APIMethods_AccountInformationServiceAISApi extends RestHelper {
val apiVersion: ApiVersion = ApiVersion.berlinGroupV1_3
val apiVersion: ApiVersion = OBP_BERLIN_GROUP_1_3.version
val resourceDocs = ArrayBuffer[ResourceDoc]()
val apiRelations = ArrayBuffer[ApiRelation]()

View File

@ -1,10 +1,9 @@
package code.api.builder.CommonServicesApi
import code.api.APIFailureNewStyle
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.berlin.group.v1_3.{JSONFactory_BERLIN_GROUP_1_3, JvalueCaseClass, OBP_BERLIN_GROUP_1_3}
import net.liftweb.json
import net.liftweb.json._
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3
import code.api.util.APIUtil.{defaultBankId, _}
import code.api.util.{ApiVersion, NewStyle}
import code.api.util.ErrorMessages._
@ -17,13 +16,14 @@ import code.views.Views
import net.liftweb.common.Full
import net.liftweb.http.rest.RestHelper
import com.github.dwickern.macros.NameOf.nameOf
import scala.collection.immutable.Nil
import scala.collection.mutable.ArrayBuffer
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object APIMethods_CommonServicesApi extends RestHelper {
val apiVersion: ApiVersion = ApiVersion.berlinGroupV1_3
val apiVersion: ApiVersion = OBP_BERLIN_GROUP_1_3.version
val resourceDocs = ArrayBuffer[ResourceDoc]()
val apiRelations = ArrayBuffer[ApiRelation]()
val codeContext = CodeContext(resourceDocs, apiRelations)

View File

@ -1,10 +1,9 @@
package code.api.builder.ConfirmationOfFundsServicePIISApi
import code.api.APIFailureNewStyle
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.berlin.group.v1_3.{JSONFactory_BERLIN_GROUP_1_3, JvalueCaseClass, OBP_BERLIN_GROUP_1_3}
import net.liftweb.json
import net.liftweb.json._
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3
import code.api.util.APIUtil.{defaultBankId, _}
import code.api.util.{ApiVersion, NewStyle}
import code.api.util.ErrorMessages._
@ -17,13 +16,14 @@ import code.views.Views
import net.liftweb.common.Full
import net.liftweb.http.rest.RestHelper
import com.github.dwickern.macros.NameOf.nameOf
import scala.collection.immutable.Nil
import scala.collection.mutable.ArrayBuffer
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object APIMethods_ConfirmationOfFundsServicePIISApi extends RestHelper {
val apiVersion: ApiVersion = ApiVersion.berlinGroupV1_3
val apiVersion: ApiVersion = OBP_BERLIN_GROUP_1_3.version
val resourceDocs = ArrayBuffer[ResourceDoc]()
val apiRelations = ArrayBuffer[ApiRelation]()
protected implicit def JvalueToSuper(what: JValue): JvalueCaseClass = JvalueCaseClass(what)

View File

@ -38,31 +38,30 @@ import code.api.builder.ConfirmationOfFundsServicePIISApi.APIMethods_Confirmatio
import code.api.builder.PaymentInitiationServicePISApi.APIMethods_PaymentInitiationServicePISApi
import code.api.builder.SigningBasketsApi.APIMethods_SigningBasketsApi
import code.api.util.APIUtil.{OBPEndpoint, ResourceDoc, getAllowedEndpoints}
import code.api.util.ApiVersion
import code.api.util.{APIUtil, ApiVersion, ScannedApiVersion, ScannedApis}
import code.util.Helper.MdcLoggable
import scala.collection.immutable.Nil
import scala.collection.mutable.ArrayBuffer
/*
This file defines which endpoints from all the versions are available in v1
*/
object OBP_BERLIN_GROUP_1_3 extends OBPRestHelper with MdcLoggable with ScannedApis {
object OBP_BERLIN_GROUP_1_3 extends OBPRestHelper with MdcLoggable {
val version = ApiVersion.berlinGroupV1_3
override val apiVersion = ScannedApiVersion("berlin-group", "ScannedApiVersion", "BG PSD2 API")
val versionStatus = "DRAFT"
private val endpointsOf1_3 = // Implementations1_3.endpoints ++
private val endpoints =
APIMethods_AccountInformationServiceAISApi.endpoints ++
APIMethods_CommonServicesApi.endpoints ++
APIMethods_ConfirmationOfFundsServicePIISApi.endpoints ++
APIMethods_PaymentInitiationServicePISApi.endpoints ++
APIMethods_SigningBasketsApi.endpoints
val allResourceDocs = //Implementations1_3.resourceDocs ++
override val allResourceDocs: ArrayBuffer[ResourceDoc] =
APIMethods_AccountInformationServiceAISApi.resourceDocs ++
APIMethods_CommonServicesApi.resourceDocs ++
APIMethods_ConfirmationOfFundsServicePIISApi.resourceDocs ++
@ -74,13 +73,12 @@ object OBP_BERLIN_GROUP_1_3 extends OBPRestHelper with MdcLoggable {
}
// Filter the possible endpoints by the disabled / enabled Props settings and add them together
val routes : List[OBPEndpoint] = getAllowedEndpoints(endpointsOf1_3, allResourceDocs)
override val routes : List[OBPEndpoint] = getAllowedEndpoints(endpoints, allResourceDocs)
// Make them available for use!
routes.foreach(route => {
oauthServe(("berlin-group" / version.vDottedApiVersion()).oPrefix{route}, findResourceDoc(route))
oauthServe((apiVersion.urlPrefix / version.vDottedApiVersion()).oPrefix{route}, findResourceDoc(route))
})
logger.info(s"version $version has been run! There are ${routes.length} routes.")
}

View File

@ -1,10 +1,9 @@
package code.api.builder.PaymentInitiationServicePISApi
import code.api.APIFailureNewStyle
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.berlin.group.v1_3.{JSONFactory_BERLIN_GROUP_1_3, JvalueCaseClass, OBP_BERLIN_GROUP_1_3}
import net.liftweb.json
import net.liftweb.json._
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3
import code.api.util.APIUtil.{defaultBankId, _}
import code.api.util.{ApiVersion, NewStyle}
import code.api.util.ErrorMessages._
@ -17,13 +16,14 @@ import code.views.Views
import net.liftweb.common.Full
import net.liftweb.http.rest.RestHelper
import com.github.dwickern.macros.NameOf.nameOf
import scala.collection.immutable.Nil
import scala.collection.mutable.ArrayBuffer
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object APIMethods_PaymentInitiationServicePISApi extends RestHelper {
val apiVersion: ApiVersion = ApiVersion.berlinGroupV1_3
val apiVersion: ApiVersion = OBP_BERLIN_GROUP_1_3.version
val resourceDocs = ArrayBuffer[ResourceDoc]()
val apiRelations = ArrayBuffer[ApiRelation]()
protected implicit def JvalueToSuper(what: JValue): JvalueCaseClass = JvalueCaseClass(what)

View File

@ -1,10 +1,9 @@
package code.api.builder.SigningBasketsApi
import code.api.APIFailureNewStyle
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.berlin.group.v1_3.{JSONFactory_BERLIN_GROUP_1_3, JvalueCaseClass, OBP_BERLIN_GROUP_1_3}
import net.liftweb.json
import net.liftweb.json._
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3
import code.api.util.APIUtil.{defaultBankId, _}
import code.api.util.{ApiVersion, NewStyle}
import code.api.util.ErrorMessages._
@ -17,13 +16,14 @@ import code.views.Views
import net.liftweb.common.Full
import net.liftweb.http.rest.RestHelper
import com.github.dwickern.macros.NameOf.nameOf
import scala.collection.immutable.Nil
import scala.collection.mutable.ArrayBuffer
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object APIMethods_SigningBasketsApi extends RestHelper {
val apiVersion: ApiVersion = ApiVersion.berlinGroupV1_3
val apiVersion: ApiVersion = OBP_BERLIN_GROUP_1_3.version
val resourceDocs = ArrayBuffer[ResourceDoc]()
val apiRelations = ArrayBuffer[ApiRelation]()
protected implicit def JvalueToSuper(what: JValue): JvalueCaseClass = JvalueCaseClass(what)

View File

@ -1656,9 +1656,9 @@ Returns a string showed to the developer
case ApiVersion.v3_0_0 => LiftRules.statelessDispatch.append(v3_0_0.OBPAPI3_0_0)
case ApiVersion.v3_1_0 => LiftRules.statelessDispatch.append(v3_1_0.OBPAPI3_1_0)
case ApiVersion.`berlinGroupV1` => LiftRules.statelessDispatch.append(OBP_BERLIN_GROUP_1)
case ApiVersion.`berlinGroupV1_3` => LiftRules.statelessDispatch.append(OBP_BERLIN_GROUP_1_3)
case ApiVersion.`ukOpenBankingV200` => LiftRules.statelessDispatch.append(OBP_UKOpenBanking_200)
case ApiVersion.`apiBuilder` => LiftRules.statelessDispatch.append(OBP_APIBuilder)
case version: ScannedApiVersion => LiftRules.statelessDispatch.append(ScannedApis.versionMapScannedApis(version))
case _ => logger.info(s"There is no ${version.toString}")
}

View File

@ -53,12 +53,7 @@ object ApiVersion {
override def toString() = "v1"
//override def toString() = "berlin_group_v1" // TODO don't want to confuse with OBP
}
case class BerlinGroupV1_3() extends ApiVersion {
override def toString() = "v1_3"
//override def toString() = "berlin_group_v1" // TODO don't want to confuse with OBP
}
lazy val berlinGroupV1 = BerlinGroupV1()
lazy val berlinGroupV1_3 = BerlinGroupV1_3()
case class UKOpenBankingV200() extends ApiVersion {
override def toString() = "v2_0"
// override def toString() = "uk_v2.0.0" // TODO don't want to confuse with OBP
@ -95,10 +90,9 @@ object ApiVersion {
openIdConnect1 ::
sandbox ::
berlinGroupV1 ::
berlinGroupV1_3 ::
ukOpenBankingV200 ::
apiBuilder::
Nil
ScannedApis.versionMapScannedApis.keysIterator.toList
def valueOf(value: String): ApiVersion = {
versions.filter(_.vDottedApiVersion == value) match {

View File

@ -1,15 +1,19 @@
package code.api.util
import code.api.util.APIUtil.{ApiRelation, ResourceDoc}
import code.api.util.APIUtil.{ApiRelation, OBPEndpoint, ResourceDoc}
import code.util.ClassScanUtils
import net.liftweb.http.LiftRules
import scala.collection.mutable.ArrayBuffer
trait ScannedApis {
trait ScannedApis extends LiftRules.DispatchPF {
val apiVersion: ScannedApiVersion
val resourceDocs: ArrayBuffer[ResourceDoc]
val apiRelations: ArrayBuffer[ApiRelation]
lazy val version: ApiVersion = this.apiVersion
val allResourceDocs: ArrayBuffer[ResourceDoc]
val routes: List[OBPEndpoint]
// val apiRelations: ArrayBuffer[ApiRelation]
}
object ScannedApis {
lazy val versionMapScannedApis: Map[ScannedApiVersion, ScannedApis] = ClassScanUtils.getImplementClass(classOf[ScannedApis]).map(it=> (it.apiVersion, it)).toMap
}

View File

@ -0,0 +1,43 @@
package code.util
import java.io.File
import code.api.berlin.group.v1_3.OBP_BERLIN_GROUP_1_3
import code.model.dataAccess.ViewImpl
import net.liftweb.mapper.LongKeyedMapper
import org.apache.commons.lang3.StringUtils
import org.clapper.classutil.ClassInfo
import org.clapper.classutil.ClassFinder
import scala.reflect.runtime.universe.TypeTag
object ClassScanUtils {
lazy val finder = ClassFinder(List(getClassPath(this.getClass)))
def companion[U:TypeTag](name : String) : U = {
val className = if(name.endsWith("$")) name else name + "$"
Class.forName(className).getDeclaredField("MODULE$").get(null).asInstanceOf[U]
}
def getImplementClass[T:TypeTag](clazz: Class[T]) = {
//finder.getClasses().filter(_.implements(clazz.getName)).map(_.name).map(companion[T](_)).toList
List(OBP_BERLIN_GROUP_1_3)
}
private[this] def getClassPath(clazz: Class[_]) = {
val classFile = "/" + clazz.getName.replace('.', '/') + ".class"
val uri = clazz.getResource(classFile).toURI.toString
val path = uri.replaceFirst("^(jar:|file:)?(.*)\\!?\\Q" + classFile + "\\E$", "$2")
new File(path)
}
def getMappers(packageName:String = ""): Seq[ClassInfo] = {
val mapperInterface = "net.liftweb.mapper.LongKeyedMapper"
val infoes = finder.getClasses().filter(it => it.interfaces.contains(mapperInterface))
if(StringUtils.isNoneBlank()) {
infoes.filter(classInfo => classInfo.name.startsWith(packageName))
} else {
infoes
}
}
}