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]
