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

mdedetrich pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko-http.git


The following commit(s) were added to refs/heads/main by this push:
     new 156720f4f Use new pekko-core OptionalUtil
156720f4f is described below

commit 156720f4f3c6f0b6b69dba1d4b3703223e937d76
Author: Matthew de Detrich <[email protected]>
AuthorDate: Wed Dec 10 10:24:08 2025 +1100

    Use new pekko-core OptionalUtil
---
 .../java/org/apache/pekko/http/impl/util/Util.java | 48 ++--------------------
 .../pekko/http/javadsl/model/ContentRange.java     |  5 ++-
 .../apache/pekko/http/javadsl/model/DateTime.java  |  4 +-
 .../http/javadsl/model/headers/HttpCookie.java     | 29 ++++++-------
 .../http/javadsl/model/headers/RetryAfter.java     |  6 +--
 .../http/javadsl/model/sse/ServerSentEvent.java    |  8 ++--
 .../use-pekko-core-optionalutil.excludes           | 21 ++++++++++
 .../pekko/http/scaladsl/model/HttpMessage.scala    |  5 ++-
 .../pekko/http/scaladsl/model/Multipart.scala      |  8 ++--
 9 files changed, 58 insertions(+), 76 deletions(-)

diff --git a/http-core/src/main/java/org/apache/pekko/http/impl/util/Util.java 
b/http-core/src/main/java/org/apache/pekko/http/impl/util/Util.java
index 254ead19e..dbee9590c 100644
--- a/http-core/src/main/java/org/apache/pekko/http/impl/util/Util.java
+++ b/http-core/src/main/java/org/apache/pekko/http/impl/util/Util.java
@@ -13,29 +13,19 @@
 
 package org.apache.pekko.http.impl.util;
 
-import scala.None$;
 import scala.collection.immutable.Map$;
 import scala.collection.immutable.Seq;
-import scala.jdk.javaapi.OptionConverters;
 
 import org.apache.pekko.stream.scaladsl.Source;
 import org.apache.pekko.http.ccompat.MapHelpers;
+import org.apache.pekko.util.OptionalUtil;
 
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
-import java.util.OptionalInt;
-import java.util.OptionalLong;
 
 /** Contains internal helper methods. */
 public abstract class Util {
-  @SuppressWarnings("unchecked") // no support for covariance of option in Java
-  // needed to provide covariant conversions that the Java interfaces don't 
provide automatically.
-  // The alternative would be having to cast around everywhere instead of 
doing it here in a central
-  // place.
-  public static <U, T extends U> Optional<U> convertOption(scala.Option<T> o) {
-    return (Optional<U>) (Object) OptionConverters.toJava(o);
-  }
 
   @SuppressWarnings("unchecked") // no support for covariance of Publisher in 
Java
   // needed to provide covariant conversions that the Java interfaces don't 
provide automatically.
@@ -55,41 +45,9 @@ public abstract class Util {
     return MapHelpers.convertMapToScala(map);
   }
 
-  @SuppressWarnings("unchecked") // contains an upcast
-  public static <T, U extends T> scala.Option<U> 
convertOptionalToScala(Optional<T> o) {
-    return OptionConverters.toScala((Optional<U>) o);
-  }
-
-  // This is needed to be used in Java source code that calls Scala code which 
expects scala.Long
-  // since an implicit cast from java.lang.Long to scala.Long is not available 
in Java source
-  public static scala.Option<Object> convertOptionalToScala(OptionalLong o) {
-    if (o.isPresent()) {
-      return new scala.Some(o.getAsLong());
-    } else {
-      return scala.Option.empty();
-    }
-  }
-
-  // This is needed to be used in Java source code that calls Scala code which 
expects scala.Int
-  // since an implicit cast from java.lang.Int to scala.Int is not available 
in Java source
-  public static scala.Option<Object> convertOptionalToScala(OptionalInt o) {
-    if (o.isPresent()) {
-      return new scala.Some(o.getAsInt());
-    } else {
-      return scala.Option.empty();
-    }
-  }
-
   public static final scala.collection.immutable.Map<String, String> emptyMap =
       Map$.MODULE$.<String, String>empty();
 
-  private static final scala.Option<?> noneValue = None$.MODULE$;
-
-  @SuppressWarnings("unchecked")
-  public static <T> scala.Option<T> scalaNone() {
-    return (scala.Option<T>) noneValue;
-  }
-
   @SuppressWarnings("unchecked")
   public static <T, U extends T> Seq<U> convertIterable(Iterable<T> els) {
     return 
scala.collection.JavaConverters.iterableAsScalaIterableConverter((Iterable<U>) 
els)
@@ -103,7 +61,7 @@ public abstract class Util {
 
   public static <J, V extends J> Optional<J> lookupInRegistry(
       ObjectRegistry<Object, V> registry, int key) {
-    return Util.<J, V>convertOption(registry.getForKey(key));
+    return OptionalUtil.<J, V>convertOption(registry.getForKey(key));
   }
 
   public static <J, V extends J> Optional<J> lookupInRegistry(
@@ -113,6 +71,6 @@ public abstract class Util {
 
   public static <K, J, V extends J> Optional<J> lookupInRegistry(
       ObjectRegistry<K, V> registry, K key) {
-    return Util.<J, V>convertOption(registry.getForKey(key));
+    return OptionalUtil.<J, V>convertOption(registry.getForKey(key));
   }
 }
diff --git 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/ContentRange.java 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/ContentRange.java
index 38c1415f9..9dc38202d 100644
--- 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/ContentRange.java
+++ 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/ContentRange.java
@@ -17,7 +17,7 @@ import org.apache.pekko.http.scaladsl.model.ContentRange$;
 
 import java.util.Optional;
 import java.util.OptionalLong;
-import org.apache.pekko.http.impl.util.Util;
+import org.apache.pekko.util.OptionalUtil;
 
 public abstract class ContentRange {
   public abstract boolean isByteContentRange();
@@ -44,7 +44,8 @@ public abstract class ContentRange {
 
   @SuppressWarnings("unchecked")
   public static ContentRange create(long first, long last, OptionalLong 
instanceLength) {
-    return ContentRange$.MODULE$.apply(first, last, 
Util.convertOptionalToScala(instanceLength));
+    return ContentRange$.MODULE$.apply(
+        first, last, OptionalUtil.convertOptionalToScala(instanceLength));
   }
 
   public static ContentRange createUnsatisfiable(long length) {
diff --git 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/DateTime.java 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/DateTime.java
index 2968f53b2..7456a68b4 100644
--- a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/DateTime.java
+++ b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/DateTime.java
@@ -13,7 +13,7 @@
 
 package org.apache.pekko.http.javadsl.model;
 
-import org.apache.pekko.http.impl.util.Util;
+import org.apache.pekko.util.OptionalUtil;
 
 import java.util.Optional;
 
@@ -90,7 +90,7 @@ public abstract class DateTime {
    * if parsing has failed.
    */
   public static Optional<DateTime> fromIsoDateTimeString(String 
isoDateTimeString) {
-    return Util.<DateTime, 
org.apache.pekko.http.scaladsl.model.DateTime>convertOption(
+    return OptionalUtil.<DateTime, 
org.apache.pekko.http.scaladsl.model.DateTime>convertOption(
         
org.apache.pekko.http.scaladsl.model.DateTime.fromIsoDateTimeString(isoDateTimeString));
   }
 
diff --git 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/HttpCookie.java
 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/HttpCookie.java
index a053a2571..b9ec8834f 100644
--- 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/HttpCookie.java
+++ 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/HttpCookie.java
@@ -15,7 +15,7 @@ package org.apache.pekko.http.javadsl.model.headers;
 
 import org.apache.pekko.annotation.DoNotInherit;
 import org.apache.pekko.http.javadsl.model.DateTime;
-import org.apache.pekko.http.impl.util.Util;
+import org.apache.pekko.util.OptionalUtil;
 
 import java.util.Optional;
 import java.util.OptionalLong;
@@ -50,14 +50,14 @@ public abstract class HttpCookie {
     return new org.apache.pekko.http.scaladsl.model.headers.HttpCookie(
         name,
         value,
-        Util.<org.apache.pekko.http.scaladsl.model.DateTime>scalaNone(),
-        Util.scalaNone(),
-        Util.<String>scalaNone(),
-        Util.<String>scalaNone(),
+        
OptionalUtil.<org.apache.pekko.http.scaladsl.model.DateTime>scalaNone(),
+        OptionalUtil.scalaNone(),
+        OptionalUtil.<String>scalaNone(),
+        OptionalUtil.<String>scalaNone(),
         false,
         false,
-        Util.<String>scalaNone(),
-        
Util.<org.apache.pekko.http.scaladsl.model.headers.SameSite>scalaNone());
+        OptionalUtil.<String>scalaNone(),
+        
OptionalUtil.<org.apache.pekko.http.scaladsl.model.headers.SameSite>scalaNone());
   }
 
   public static HttpCookie create(
@@ -65,14 +65,14 @@ public abstract class HttpCookie {
     return new org.apache.pekko.http.scaladsl.model.headers.HttpCookie(
         name,
         value,
-        Util.<org.apache.pekko.http.scaladsl.model.DateTime>scalaNone(),
-        Util.scalaNone(),
+        
OptionalUtil.<org.apache.pekko.http.scaladsl.model.DateTime>scalaNone(),
+        OptionalUtil.scalaNone(),
         OptionConverters.toScala(domain),
         OptionConverters.toScala(path),
         false,
         false,
-        Util.<String>scalaNone(),
-        
Util.<org.apache.pekko.http.scaladsl.model.headers.SameSite>scalaNone());
+        OptionalUtil.<String>scalaNone(),
+        
OptionalUtil.<org.apache.pekko.http.scaladsl.model.headers.SameSite>scalaNone());
   }
 
   @SuppressWarnings("unchecked")
@@ -90,9 +90,10 @@ public abstract class HttpCookie {
     return new org.apache.pekko.http.scaladsl.model.headers.HttpCookie(
         name,
         value,
-        Util.<DateTime, 
org.apache.pekko.http.scaladsl.model.DateTime>convertOptionalToScala(
-            expires),
-        Util.convertOptionalToScala(maxAge),
+        OptionalUtil
+            .<DateTime, 
org.apache.pekko.http.scaladsl.model.DateTime>convertOptionalToScala(
+                expires),
+        OptionalUtil.convertOptionalToScala(maxAge),
         OptionConverters.toScala(domain),
         OptionConverters.toScala(path),
         secure,
diff --git 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/RetryAfter.java
 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/RetryAfter.java
index da18ff64a..ffa60ceee 100644
--- 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/RetryAfter.java
+++ 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/headers/RetryAfter.java
@@ -11,11 +11,11 @@
 package org.apache.pekko.http.javadsl.model.headers;
 
 import java.util.Optional;
-import org.apache.pekko.http.impl.util.Util;
 import org.apache.pekko.http.javadsl.model.DateTime;
 import org.apache.pekko.http.scaladsl.model.headers.Retry$minusAfter;
 import org.apache.pekko.http.scaladsl.model.headers.RetryAfterDuration;
 import org.apache.pekko.http.scaladsl.model.headers.RetryAfterDateTime;
+import org.apache.pekko.util.OptionalUtil;
 /**
  * Model for the `Retry-After` header. Specification:
  * //https://tools.ietf.org/html/rfc7231#section-7.1.3
@@ -28,12 +28,12 @@ public abstract class RetryAfter extends 
org.apache.pekko.http.scaladsl.model.Ht
 
   /** number of seconds for the retry attempt, if available */
   public Optional<Long> getDelaySeconds() {
-    return Util.convertOption(delaySeconds());
+    return OptionalUtil.convertOption(delaySeconds());
   }
 
   /** the date for the retry attempt, if available */
   public Optional<DateTime> getDateTime() {
-    return Util.convertOption(dateTime());
+    return OptionalUtil.convertOption(dateTime());
   }
 
   public static RetryAfter create(Long delaySeconds) {
diff --git 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/sse/ServerSentEvent.java
 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/sse/ServerSentEvent.java
index fd71c54e0..d93b9e2da 100644
--- 
a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/sse/ServerSentEvent.java
+++ 
b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/sse/ServerSentEvent.java
@@ -22,7 +22,7 @@ import java.util.OptionalInt;
 import scala.Option;
 import scala.jdk.javaapi.OptionConverters;
 
-import org.apache.pekko.http.impl.util.Util;
+import org.apache.pekko.util.OptionalUtil;
 
 /**
  * Representation of a server-sent event. According to the specification, an 
empty data field
@@ -30,9 +30,9 @@ import org.apache.pekko.http.impl.util.Util;
  */
 public abstract class ServerSentEvent {
 
-  private static final Option<String> stringNone = Util.scalaNone();
+  private static final Option<String> stringNone = OptionalUtil.scalaNone();
 
-  private static final Option<Object> intNone = Util.scalaNone();
+  private static final Option<Object> intNone = OptionalUtil.scalaNone();
 
   /** Provides a [[ServerSentEvent]] with empty data which can be used as a 
heartbeat */
   public static ServerSentEvent heartbeat() {
@@ -94,7 +94,7 @@ public abstract class ServerSentEvent {
         data,
         OptionConverters.toScala(type),
         OptionConverters.toScala(id),
-        Util.convertOptionalToScala(retry));
+        OptionalUtil.convertOptionalToScala(retry));
   }
 
   /** Data, may span multiple lines. */
diff --git 
a/http-core/src/main/mima-filters/2.0.x.backwards.excludes/use-pekko-core-optionalutil.excludes
 
b/http-core/src/main/mima-filters/2.0.x.backwards.excludes/use-pekko-core-optionalutil.excludes
new file mode 100644
index 000000000..d3d805d5f
--- /dev/null
+++ 
b/http-core/src/main/mima-filters/2.0.x.backwards.excludes/use-pekko-core-optionalutil.excludes
@@ -0,0 +1,21 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Use OptionalUtil from pekko-core
+ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.pekko.http.impl.util.Util.convertOption")
+ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.pekko.http.impl.util.Util.convertOptionalToScala")
+ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.pekko.http.impl.util.Util.scalaNone")
diff --git 
a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
 
b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
index 9e300ebe9..019135276 100644
--- 
a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
+++ 
b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
@@ -36,6 +36,7 @@ import pekko.http.scaladsl.util.FastFuture._
 import pekko.http.scaladsl.model.headers._
 import pekko.stream.scaladsl.Flow
 import pekko.stream.{ FlowShape, Graph, Materializer, SystemMaterializer }
+import pekko.util.OptionalUtil
 
 /**
  * Common base class of HttpRequest and HttpResponse.
@@ -218,7 +219,7 @@ sealed trait HttpMessage extends jm.HttpMessage {
   /** Java API */
   def getHeader(headerName: String): Optional[jm.HttpHeader] = {
     val lowerCased = headerName.toRootLowerCase
-    Util.convertOption(headers.find(_.is(lowerCased))) // Upcast because of 
invariance
+    OptionalUtil.convertOption(headers.find(_.is(lowerCased))) // Upcast 
because of invariance
   }
 
   /** Java API */
@@ -231,7 +232,7 @@ sealed trait HttpMessage extends jm.HttpMessage {
 
   /** Java API */
   def getAttribute[T](attributeKey: jm.AttributeKey[T]): Optional[T] =
-    Util.convertOption(attribute(attributeKey))
+    OptionalUtil.convertOption(attribute(attributeKey))
 
   /** Java API */
   def toStrict(timeoutMillis: Long, ec: Executor, materializer: Materializer): 
CompletionStage[Self] = {
diff --git 
a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Multipart.scala 
b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Multipart.scala
index 48142cefe..2533ef633 100644
--- 
a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Multipart.scala
+++ 
b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Multipart.scala
@@ -22,7 +22,7 @@ import org.apache.pekko
 import pekko.annotation.InternalApi
 import pekko.event.LoggingAdapter
 import pekko.http.impl.engine.rendering.BodyPartRenderer
-import pekko.http.impl.util.{ DefaultNoLogging, Util }
+import pekko.http.impl.util.DefaultNoLogging
 import pekko.http.impl.util.JavaMapping.Implicits._
 import pekko.http.javadsl.{ model => jm }
 import pekko.http.scaladsl.util.FastFuture
@@ -31,7 +31,7 @@ import pekko.http.scaladsl.model.headers._
 import pekko.stream.Materializer
 import pekko.stream.javadsl.{ Source => JSource }
 import pekko.stream.scaladsl._
-import pekko.util.ConstantFun
+import pekko.util.{ ConstantFun, OptionalUtil }
 
 import scala.concurrent.duration.FiniteDuration
 import scala.concurrent.Future
@@ -189,13 +189,13 @@ object Multipart {
 
     /** Java API */
     def getContentDispositionHeader: Optional[jm.headers.ContentDisposition] =
-      Util.convertOption(contentDispositionHeader)
+      OptionalUtil.convertOption(contentDispositionHeader)
 
     /** Java API */
     def getDispositionParams: java.util.Map[String, String] = 
dispositionParams.asJava
 
     /** Java API */
-    def getDispositionType: Optional[jm.headers.ContentDispositionType] = 
Util.convertOption(dispositionType)
+    def getDispositionType: Optional[jm.headers.ContentDispositionType] = 
OptionalUtil.convertOption(dispositionType)
 
     /** Java API */
     def toStrict(timeoutMillis: Long, materializer: Materializer): 
CompletionStage[_ <: jm.Multipart.BodyPart.Strict] =


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

Reply via email to