This is an automated email from the ASF dual-hosted git repository.

He-Pin pushed a commit to branch refactor/urlencoder-charset
in repository https://gitbox.apache.org/repos/asf/pekko.git

commit 9ba3a0560c5069c66b76c04057353d47395c451b
Author: 虎鸣 <[email protected]>
AuthorDate: Tue Jun 23 11:54:00 2026 +0800

    refactor: use StandardCharsets.UTF_8 with URLEncoder/URLDecoder
    
    Motivation:
    Multiple files pass charset as a String ("utf-8") or via
    ByteString.UTF_8 (which is StandardCharsets.UTF_8.name()) to
    URLEncoder.encode and URLDecoder.decode. JDK 10 added overloads
    that accept a Charset object directly, avoiding the checked
    UnsupportedEncodingException declaration.
    
    Modification:
    Replace "utf-8" and ByteString.UTF_8 string arguments with
    StandardCharsets.UTF_8 Charset object in 17 call sites across
    8 files. Remove 4 unused ByteString imports.
    
    Result:
    Type-safe charset specification, no UnsupportedEncodingException
    declaration needed, removes ByteString dependency where it was
    only used for charset name constants.
    
    Tests:
    sbt "cluster-sharding/compile" "cluster-sharding-typed/compile"
        "cluster-tools/compile" "persistence-query/compile"
        "stream/compile" — all passed
    
    References:
    Refs #3136
---
 .../sharding/typed/internal/ClusterShardingImpl.scala       |  6 +++---
 .../org/apache/pekko/cluster/sharding/ClusterSharding.scala | 13 ++++++-------
 .../scala/org/apache/pekko/cluster/sharding/Shard.scala     |  2 +-
 .../org/apache/pekko/cluster/sharding/ShardRegion.scala     |  2 +-
 .../org/apache/pekko/cluster/client/ClusterClient.scala     |  2 +-
 .../pekko/cluster/pubsub/DistributedPubSubMediator.scala    |  4 ++--
 .../query/journal/leveldb/scaladsl/LeveldbReadJournal.scala |  5 ++---
 .../src/main/scala/org/apache/pekko/stream/Attributes.scala |  4 ++--
 8 files changed, 18 insertions(+), 20 deletions(-)

diff --git 
a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala
 
b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala
index df01f21032..1c0d892d78 100644
--- 
a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala
+++ 
b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala
@@ -52,7 +52,7 @@ import pekko.japi.function.{ Function => JFunction }
 import pekko.pattern.AskTimeoutException
 import pekko.pattern.PromiseActorRef
 import pekko.pattern.StatusReply
-import pekko.util.{ ByteString, Timeout }
+import pekko.util.Timeout
 
 /**
  * INTERNAL API
@@ -196,7 +196,7 @@ import pekko.util.{ ByteString, Timeout }
               override def apply(t: String): 
ActorRef[scaladsl.ClusterSharding.ShardCommand] = {
                 system.systemActorOf(
                   
ShardCommandActor.behavior(stopMessage.getOrElse(PoisonPill)),
-                  URLEncoder.encode(typeKey.name, ByteString.UTF_8) + 
"ShardCommandDelegator")
+                  URLEncoder.encode(typeKey.name, StandardCharsets.UTF_8) + 
"ShardCommandDelegator")
               }
             })
 
@@ -334,7 +334,7 @@ import pekko.util.{ ByteString, Timeout }
       case _ => false
     }
 
-  override val refPrefix = URLEncoder.encode(s"${typeKey.name}-$entityId", 
ByteString.UTF_8)
+  override val refPrefix = URLEncoder.encode(s"${typeKey.name}-$entityId", 
StandardCharsets.UTF_8)
 
   override def tell(msg: M): Unit =
     shardRegion ! ShardingEnvelope(entityId, msg)
diff --git 
a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ClusterSharding.scala
 
b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ClusterSharding.scala
index bb393b299a..25479d07a3 100755
--- 
a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ClusterSharding.scala
+++ 
b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ClusterSharding.scala
@@ -50,7 +50,6 @@ import pekko.cluster.singleton.ClusterSingletonManager
 import pekko.event.Logging
 import pekko.pattern.BackoffOpts
 import pekko.pattern.ask
-import pekko.util.ByteString
 
 /**
  * This extension provides sharding functionality of actors in a cluster.
@@ -754,7 +753,7 @@ private[pekko] class ClusterShardingGuardian extends Actor {
       case Some(ref) => ref
       case None      =>
         val name = role match {
-          case Some(r) => URLEncoder.encode(r, ByteString.UTF_8) + "Replicator"
+          case Some(r) => URLEncoder.encode(r, StandardCharsets.UTF_8) + 
"Replicator"
           case None    => "replicator"
         }
         val ref = context.actorOf(Replicator.props(replicatorSettings(role, 
settings)), name)
@@ -799,7 +798,7 @@ private[pekko] class ClusterShardingGuardian extends Actor {
       settings: ClusterShardingSettings): Unit = {
     import settings.tuningParameters.coordinatorFailureBackoff
 
-    val encName = URLEncoder.encode(typeName, ByteString.UTF_8)
+    val encName = URLEncoder.encode(typeName, StandardCharsets.UTF_8)
     val cName = coordinatorSingletonManagerName(encName)
     if (settings.shouldHostCoordinator(cluster) && 
context.child(cName).isEmpty) {
       val coordinatorProps =
@@ -848,7 +847,7 @@ private[pekko] class ClusterShardingGuardian extends Actor {
           allocationStrategy,
           handOffStopMessage) =>
       try {
-        val encName = URLEncoder.encode(typeName, ByteString.UTF_8)
+        val encName = URLEncoder.encode(typeName, StandardCharsets.UTF_8)
         val cPath = coordinatorPath(encName)
         val shardRegion = context.child(encName).getOrElse {
           val remEntitiesStoreProvider = 
rememberEntitiesStoreProvider(typeName, settings)
@@ -880,12 +879,12 @@ private[pekko] class ClusterShardingGuardian extends 
Actor {
     case StartProxy(typeName, dataCenter, settings, extractEntityId, 
extractShardId) =>
       try {
 
-        val encName = URLEncoder.encode(s"${typeName}Proxy", ByteString.UTF_8)
-        val cPath = coordinatorPath(URLEncoder.encode(typeName, 
ByteString.UTF_8))
+        val encName = URLEncoder.encode(s"${typeName}Proxy", 
StandardCharsets.UTF_8)
+        val cPath = coordinatorPath(URLEncoder.encode(typeName, 
StandardCharsets.UTF_8))
         // it must be possible to start several proxies, one per data center
         val actorName = dataCenter match {
           case None    => encName
-          case Some(t) => URLEncoder.encode(typeName + "-" + t, 
ByteString.UTF_8)
+          case Some(t) => URLEncoder.encode(typeName + "-" + t, 
StandardCharsets.UTF_8)
         }
         val shardRegion = context.child(actorName).getOrElse {
           context.actorOf(
diff --git 
a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/Shard.scala 
b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/Shard.scala
index 2d4b1165db..db7be7c795 100644
--- 
a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/Shard.scala
+++ 
b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/Shard.scala
@@ -1128,7 +1128,7 @@ private[pekko] class Shard(
     entities.entity(id) match {
       case OptionVal.Some(child) => child
       case _                     =>
-        val name = URLEncoder.encode(id, "utf-8")
+        val name = URLEncoder.encode(id, StandardCharsets.UTF_8)
         val a = context.actorOf(entityProps(id), name)
         context.watchWith(a, EntityTerminated(a))
         log.debug("{}: Started entity [{}] with entity id [{}] in shard [{}]", 
typeName, a, id, shardId)
diff --git 
a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardRegion.scala
 
b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardRegion.scala
index 86dd77d8c5..0a27357f65 100644
--- 
a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardRegion.scala
+++ 
b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardRegion.scala
@@ -1341,7 +1341,7 @@ private[pekko] class ShardRegion(
         .orElse(entityProps match {
           case Some(props) if !shardsByRef.values.exists(_ == id) =>
             log.debug(ShardingLogMarker.shardStarted(typeName, id), "{}: 
Starting shard [{}] in region", typeName, id)
-            val name = URLEncoder.encode(id, "utf-8")
+            val name = URLEncoder.encode(id, StandardCharsets.UTF_8)
             val shard = context.watch(
               context.actorOf(
                 Shard
diff --git 
a/cluster-tools/src/main/scala/org/apache/pekko/cluster/client/ClusterClient.scala
 
b/cluster-tools/src/main/scala/org/apache/pekko/cluster/client/ClusterClient.scala
index 1b617b9f13..a567e1727d 100644
--- 
a/cluster-tools/src/main/scala/org/apache/pekko/cluster/client/ClusterClient.scala
+++ 
b/cluster-tools/src/main/scala/org/apache/pekko/cluster/client/ClusterClient.scala
@@ -1007,7 +1007,7 @@ final class ClusterReceptionist(pubSubMediator: ActorRef, 
settings: ClusterRecep
   def matchingRole(m: Member): Boolean = role.forall(m.hasRole)
 
   def responseTunnel(client: ActorRef): ActorRef = {
-    val encName = URLEncoder.encode(client.path.toSerializationFormat, "utf-8")
+    val encName = URLEncoder.encode(client.path.toSerializationFormat, 
StandardCharsets.UTF_8)
     context.child(encName) match {
       case Some(tunnel) => tunnel
       case None         =>
diff --git 
a/cluster-tools/src/main/scala/org/apache/pekko/cluster/pubsub/DistributedPubSubMediator.scala
 
b/cluster-tools/src/main/scala/org/apache/pekko/cluster/pubsub/DistributedPubSubMediator.scala
index 09dfef508c..e14426ec9c 100644
--- 
a/cluster-tools/src/main/scala/org/apache/pekko/cluster/pubsub/DistributedPubSubMediator.scala
+++ 
b/cluster-tools/src/main/scala/org/apache/pekko/cluster/pubsub/DistributedPubSubMediator.scala
@@ -341,7 +341,7 @@ object DistributedPubSubMediator {
       override def message = msg
     }
 
-    def encName(s: String) = URLEncoder.encode(s, "utf-8")
+    def encName(s: String) = URLEncoder.encode(s, StandardCharsets.UTF_8)
 
     def mkKey(ref: ActorRef): String = mkKey(ref.path)
 
@@ -845,7 +845,7 @@ class DistributedPubSubMediator(settings: 
DistributedPubSubSettings)
       if key.startsWith(topicPrefix)
       topic = key.substring(topicPrefix.length + 1)
       if !topic.contains('/') // exclude group topics
-    } yield URLDecoder.decode(topic, "utf-8")).toSet
+    } yield URLDecoder.decode(topic, StandardCharsets.UTF_8)).toSet
   }
 
   def registerTopic(ref: ActorRef): Unit = {
diff --git 
a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/scaladsl/LeveldbReadJournal.scala
 
b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/scaladsl/LeveldbReadJournal.scala
index e5aeb0032d..f6eae33004 100644
--- 
a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/scaladsl/LeveldbReadJournal.scala
+++ 
b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/scaladsl/LeveldbReadJournal.scala
@@ -31,7 +31,6 @@ import 
pekko.persistence.query.journal.leveldb.EventsByTagStage
 import pekko.persistence.query.scaladsl._
 import pekko.persistence.query.scaladsl.ReadJournal
 import pekko.stream.scaladsl.Source
-import pekko.util.ByteString
 
 import com.typesafe.config.Config
 
@@ -245,7 +244,7 @@ class LeveldbReadJournal(system: ExtendedActorSystem, 
config: Config)
                   writeJournalPluginId,
                   refreshInterval,
                   mat))
-              .named("eventsByTag-" + URLEncoder.encode(tag, ByteString.UTF_8))
+              .named("eventsByTag-" + URLEncoder.encode(tag, 
StandardCharsets.UTF_8))
 
           case NoOffset => eventsByTag(tag, Sequence(0L)) // recursive
           case _        =>
@@ -268,7 +267,7 @@ class LeveldbReadJournal(system: ExtendedActorSystem, 
config: Config)
             Source
               .fromGraph(
                 new EventsByTagStage(tag, seq.value, maxBufSize, 
Long.MaxValue, writeJournalPluginId, None, mat))
-              .named("currentEventsByTag-" + URLEncoder.encode(tag, 
ByteString.UTF_8))
+              .named("currentEventsByTag-" + URLEncoder.encode(tag, 
StandardCharsets.UTF_8))
           case NoOffset => currentEventsByTag(tag, Sequence(0L))
           case _        =>
             throw new IllegalArgumentException(
diff --git a/stream/src/main/scala/org/apache/pekko/stream/Attributes.scala 
b/stream/src/main/scala/org/apache/pekko/stream/Attributes.scala
index 4f6d346c31..5cb9235886 100644
--- a/stream/src/main/scala/org/apache/pekko/stream/Attributes.scala
+++ b/stream/src/main/scala/org/apache/pekko/stream/Attributes.scala
@@ -14,6 +14,7 @@
 package org.apache.pekko.stream
 
 import java.net.URLEncoder
+import java.nio.charset.StandardCharsets
 import java.time.Duration
 import java.util.Optional
 
@@ -33,7 +34,6 @@ import pekko.annotation.InternalApi
 import pekko.event.Logging
 import pekko.japi.function
 import pekko.stream.impl.TraversalBuilder
-import pekko.util.ByteString
 import pekko.util.Helpers
 import pekko.util.LineNumbers
 
@@ -242,7 +242,7 @@ final class Attributes private[pekko] (
   }
 
   @InternalApi private[pekko] def nameForActorRef(default: String = 
"unnamed"): String = {
-    getName().map(name => URLEncoder.encode(name, 
ByteString.UTF_8)).getOrElse(default)
+    getName().map(name => URLEncoder.encode(name, 
StandardCharsets.UTF_8)).getOrElse(default)
   }
 
   /**


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to