Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: improve workaround for Scala3 bug 18248 #1349

Merged
merged 1 commit into from
Jun 4, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,44 +38,43 @@ private[pekko] trait ExtensionsImpl extends Extensions { self: ActorSystem[_] wi
* Hook for ActorSystem to load extensions on startup
*/
def loadExtensions(): Unit = {
loadExtensionsFor("pekko.actor.typed.library-extensions", throwOnLoadFail = true)
loadExtensionsFor("pekko.actor.typed.extensions", throwOnLoadFail = false)
}

/*
* @param throwOnLoadFail Throw exception when an extension fails to load (needed for backwards compatibility)
*/
def loadExtensionsFor(key: String, throwOnLoadFail: Boolean): Unit = {

settings.config.getStringList(key).asScala.foreach { extensionIdFQCN =>
// it is either a Scala object or it is a Java class with a static singleton accessor
val idTry = dynamicAccess.getObjectFor[AnyRef](extensionIdFQCN).recoverWith {
case _ => idFromJavaSingletonAccessor(extensionIdFQCN)
}
/*
* @param throwOnLoadFail Throw exception when an extension fails to load (needed for backwards compatibility)
*/
private def loadExtensionsFor(key: String, throwOnLoadFail: Boolean): Unit = {

idTry match {
case Success(id: ExtensionId[_]) => registerExtension(id)
case Success(_) =>
if (!throwOnLoadFail) log.error("[{}] is not an 'ExtensionId', skipping...", extensionIdFQCN)
else throw new RuntimeException(s"[$extensionIdFQCN] is not an 'ExtensionId'")
case Failure(problem) =>
if (!throwOnLoadFail)
log.error(s"While trying to load extension $extensionIdFQCN, skipping...", problem)
else throw new RuntimeException(s"While trying to load extension [$extensionIdFQCN]", problem)
}
settings.config.getStringList(key).asScala.foreach { extensionIdFQCN =>
// it is either a Scala object or it is a Java class with a static singleton accessor
val idTry = dynamicAccess.getObjectFor[AnyRef](extensionIdFQCN).recoverWith {
case _ => idFromJavaSingletonAccessor(extensionIdFQCN)
}
}

def idFromJavaSingletonAccessor(extensionIdFQCN: String): Try[ExtensionId[Extension]] =
dynamicAccess.getClassFor[ExtensionId[Extension]](extensionIdFQCN).flatMap[ExtensionId[Extension]] {
(clazz: Class[_]) =>
Try {
val singletonAccessor = clazz.getDeclaredMethod("getInstance")
singletonAccessor.invoke(null).asInstanceOf[ExtensionId[Extension]]
}
idTry match {
case Success(id: ExtensionId[_]) => registerExtension(id)
case Success(_) =>
if (!throwOnLoadFail) log.error("[{}] is not an 'ExtensionId', skipping...", extensionIdFQCN)
else throw new RuntimeException(s"[$extensionIdFQCN] is not an 'ExtensionId'")
case Failure(problem) =>
if (!throwOnLoadFail)
log.error(s"While trying to load extension $extensionIdFQCN, skipping...", problem)
else throw new RuntimeException(s"While trying to load extension [$extensionIdFQCN]", problem)
}

loadExtensionsFor("pekko.actor.typed.library-extensions", throwOnLoadFail = true)
loadExtensionsFor("pekko.actor.typed.extensions", throwOnLoadFail = false)
}
}

private def idFromJavaSingletonAccessor(extensionIdFQCN: String): Try[ExtensionId[Extension]] =
dynamicAccess.getClassFor[ExtensionId[Extension]](extensionIdFQCN).flatMap[ExtensionId[Extension]] {
(clazz: Class[_]) =>
Try {
val singletonAccessor = clazz.getDeclaredMethod("getInstance")
singletonAccessor.invoke(null).asInstanceOf[ExtensionId[Extension]]
}
}

final override def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean = findExtension(ext) != null

final override def extension[T <: Extension](ext: ExtensionId[T]): T = findExtension(ext) match {
Expand Down