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