From e19823226f8e6a5b24fd99dff2ca95656861b2b2 Mon Sep 17 00:00:00 2001 From: shuang bai Date: Thu, 7 Feb 2019 20:50:04 +0800 Subject: [PATCH] #add_swagger_gen add class scan tool --- pom.xml | 7 ++- src/main/scala/bootstrap/liftweb/Boot.scala | 3 +- .../ResourceDocsAPIMethods.scala | 12 +++--- .../AccountInformationServiceAISApi.scala | 6 +-- .../berlin/group/v1_3/CommonServicesApi.scala | 6 +-- .../ConfirmationOfFundsServicePIISApi.scala | 6 +-- .../group/v1_3/OBP_BERLIN_GROUP_1_3.scala | 22 +++++----- .../v1_3/PaymentInitiationServicePISApi.scala | 6 +-- .../berlin/group/v1_3/SigningBasketsApi.scala | 6 +-- src/main/scala/code/api/util/APIUtil.scala | 2 +- src/main/scala/code/api/util/ApiVersion.scala | 8 +--- .../scala/code/api/util/ScannedApis.scala | 14 +++--- src/main/scala/code/util/ClassScanUtils.scala | 43 +++++++++++++++++++ 13 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 src/main/scala/code/util/ClassScanUtils.scala diff --git a/pom.xml b/pom.xml index c3234eaa6..bd5d8688f 100644 --- a/pom.xml +++ b/pom.xml @@ -373,7 +373,12 @@ flexmark-all 0.40.8 - + + + org.clapper + classutil_${scala.version} + 1.4.0 + diff --git a/src/main/scala/bootstrap/liftweb/Boot.scala b/src/main/scala/bootstrap/liftweb/Boot.scala index 7753ff920..e9b7e8736 100644 --- a/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/src/main/scala/bootstrap/liftweb/Boot.scala @@ -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) diff --git a/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala b/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala index 4152425e4..894a4897e 100644 --- a/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala +++ b/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala @@ -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}") } diff --git a/src/main/scala/code/api/berlin/group/v1_3/AccountInformationServiceAISApi.scala b/src/main/scala/code/api/berlin/group/v1_3/AccountInformationServiceAISApi.scala index c26f2e929..9df0c1d29 100644 --- a/src/main/scala/code/api/berlin/group/v1_3/AccountInformationServiceAISApi.scala +++ b/src/main/scala/code/api/berlin/group/v1_3/AccountInformationServiceAISApi.scala @@ -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]() diff --git a/src/main/scala/code/api/berlin/group/v1_3/CommonServicesApi.scala b/src/main/scala/code/api/berlin/group/v1_3/CommonServicesApi.scala index 05f7df708..c0efd3449 100644 --- a/src/main/scala/code/api/berlin/group/v1_3/CommonServicesApi.scala +++ b/src/main/scala/code/api/berlin/group/v1_3/CommonServicesApi.scala @@ -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) diff --git a/src/main/scala/code/api/berlin/group/v1_3/ConfirmationOfFundsServicePIISApi.scala b/src/main/scala/code/api/berlin/group/v1_3/ConfirmationOfFundsServicePIISApi.scala index 0f5240a13..f85b5b425 100644 --- a/src/main/scala/code/api/berlin/group/v1_3/ConfirmationOfFundsServicePIISApi.scala +++ b/src/main/scala/code/api/berlin/group/v1_3/ConfirmationOfFundsServicePIISApi.scala @@ -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) diff --git a/src/main/scala/code/api/berlin/group/v1_3/OBP_BERLIN_GROUP_1_3.scala b/src/main/scala/code/api/berlin/group/v1_3/OBP_BERLIN_GROUP_1_3.scala index 22d5ca4b2..b5ce73de5 100644 --- a/src/main/scala/code/api/berlin/group/v1_3/OBP_BERLIN_GROUP_1_3.scala +++ b/src/main/scala/code/api/berlin/group/v1_3/OBP_BERLIN_GROUP_1_3.scala @@ -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.") - } diff --git a/src/main/scala/code/api/berlin/group/v1_3/PaymentInitiationServicePISApi.scala b/src/main/scala/code/api/berlin/group/v1_3/PaymentInitiationServicePISApi.scala index 0633e7092..c5f743e3c 100644 --- a/src/main/scala/code/api/berlin/group/v1_3/PaymentInitiationServicePISApi.scala +++ b/src/main/scala/code/api/berlin/group/v1_3/PaymentInitiationServicePISApi.scala @@ -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) diff --git a/src/main/scala/code/api/berlin/group/v1_3/SigningBasketsApi.scala b/src/main/scala/code/api/berlin/group/v1_3/SigningBasketsApi.scala index 60a70139a..1154d0f9f 100644 --- a/src/main/scala/code/api/berlin/group/v1_3/SigningBasketsApi.scala +++ b/src/main/scala/code/api/berlin/group/v1_3/SigningBasketsApi.scala @@ -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) diff --git a/src/main/scala/code/api/util/APIUtil.scala b/src/main/scala/code/api/util/APIUtil.scala index c3c38dfb6..daa74043d 100644 --- a/src/main/scala/code/api/util/APIUtil.scala +++ b/src/main/scala/code/api/util/APIUtil.scala @@ -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}") } diff --git a/src/main/scala/code/api/util/ApiVersion.scala b/src/main/scala/code/api/util/ApiVersion.scala index c3ed2e969..730105a90 100644 --- a/src/main/scala/code/api/util/ApiVersion.scala +++ b/src/main/scala/code/api/util/ApiVersion.scala @@ -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 { diff --git a/src/main/scala/code/api/util/ScannedApis.scala b/src/main/scala/code/api/util/ScannedApis.scala index f53d0c086..8f426b86f 100644 --- a/src/main/scala/code/api/util/ScannedApis.scala +++ b/src/main/scala/code/api/util/ScannedApis.scala @@ -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 } diff --git a/src/main/scala/code/util/ClassScanUtils.scala b/src/main/scala/code/util/ClassScanUtils.scala new file mode 100644 index 000000000..a3588c75f --- /dev/null +++ b/src/main/scala/code/util/ClassScanUtils.scala @@ -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 + } + } + +} \ No newline at end of file