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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 74884907f2 CAUSEWAY-2297: backport from spring6 branch:
74884907f2 is described below

commit 74884907f2bf169d9689d994a46c479370955a99
Author: andi-huber <[email protected]>
AuthorDate: Sat Feb 10 10:24:26 2024 +0100

    CAUSEWAY-2297: backport from spring6 branch:
    
    - deal with deprecations (JDK and other)
    - some methods had been deprecated between java 11 and 21 (Thread, URL,
    Locale, ...)
---
 .../causeway/applib/value/LocalResourcePath.java   | 10 ++++-----
 .../applib/services/user/UserMemento_Test.java     | 24 +++++++++++----------
 .../commons/internal/hardening/_Hardening.java     | 25 ----------------------
 .../causeway/commons/internal/os/_OsUtil.java      |  2 +-
 .../commons/internal/resources/_Resources.java     | 22 ++++++++++++++++---
 .../metamodel/objectmanager/ObjectCreator.java     |  3 +--
 .../core/metamodel/spec/feature/ObjectMember.java  |  3 +--
 .../causeway/core/metamodel/util/Facets.java       |  3 +--
 .../valuesemantics/URLValueSemantics.java          | 20 ++++++-----------
 .../services/AbstractRandomValueGenerator.java     |  6 ++++++
 .../fakedata/applib/services/Collections.java      |  2 +-
 .../testing/fakedata/applib/services/Doubles.java  |  9 ++++----
 .../testing/fakedata/applib/services/Floats.java   |  8 +++----
 .../testing/fakedata/applib/services/Integers.java |  6 ++----
 .../testing/fakedata/applib/services/Longs.java    |  6 ++----
 .../testing/fakedata/applib/services/Urls.java     | 14 +++++-------
 .../applib/jmocking/CausewayActions.java           | 10 +++++----
 .../applib/soap/SoapEndpointSpec.java              | 10 ++++-----
 ...ockery2Test_mockAnnotatedWithNever_sadCase.java |  1 -
 .../projectmodel/maven/SimpleModelResolver.java    | 19 ++++++++--------
 .../viewer/restfulobjects/applib/util/Parser.java  |  9 ++++++--
 21 files changed, 98 insertions(+), 114 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/value/LocalResourcePath.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/value/LocalResourcePath.java
index ac3b5f538b..05976c74cb 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/value/LocalResourcePath.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/value/LocalResourcePath.java
@@ -29,8 +29,7 @@ import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.CausewayModuleApplib;
 import org.apache.causeway.applib.annotation.Value;
-import org.apache.causeway.commons.internal.base._Blackhole;
-import org.apache.causeway.commons.internal.hardening._Hardening;
+import org.apache.causeway.commons.internal.resources._Resources;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -124,9 +123,10 @@ public final class LocalResourcePath implements 
Serializable {
         }
         try {
             // path syntax check
-            
_Blackhole.consume(_Hardening.toUrlWithXssGuard("http://localhost/"+path));
-        } catch (IllegalArgumentException e) {
-            throw new IllegalArgumentException(String.format("the given local 
path has an invalid syntax: '%s'", path), e);
+            _Resources.url("http://localhost/"+path);
+        } catch (Exception e) {
+            throw new IllegalArgumentException(
+                    String.format("the given local path has an invalid syntax: 
'%s'", path), e);
         }
     }
 
diff --git 
a/api/applib/src/test/java/org/apache/causeway/applib/services/user/UserMemento_Test.java
 
b/api/applib/src/test/java/org/apache/causeway/applib/services/user/UserMemento_Test.java
index 35ebf8531c..df2b251a65 100644
--- 
a/api/applib/src/test/java/org/apache/causeway/applib/services/user/UserMemento_Test.java
+++ 
b/api/applib/src/test/java/org/apache/causeway/applib/services/user/UserMemento_Test.java
@@ -24,6 +24,8 @@ import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
+import static org.apache.causeway.commons.internal.resources._Resources.url;
+
 import lombok.val;
 
 class UserMemento_Test {
@@ -93,7 +95,7 @@ class UserMemento_Test {
         void user_and_roles_and_avatarUrl_preserved_and_real_name_set() throws 
MalformedURLException {
             // copy
             val userMemento = UserMemento.ofNameAndRoleNames("fredflintstone", 
"CAVEMAN", "HUSBAND")
-                    .withAvatarUrl(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+                    
.withAvatarUrl(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
 
             // when
             val userMemento2 = userMemento.withRealName("Fred Flintstone");
@@ -106,7 +108,7 @@ class UserMemento_Test {
             Assertions.assertThat(userMemento2.getRoles().size()).isEqualTo(2);
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("CAVEMAN"));
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("HUSBAND"));
-            Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            
Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
             Assertions.assertThat(userMemento2.getRealName()).isEqualTo("Fred 
Flintstone");
 
             // then original unchanged
@@ -114,7 +116,7 @@ class UserMemento_Test {
             Assertions.assertThat(userMemento.getRoles().size()).isEqualTo(2);
             Assertions.assertThat(userMemento.streamRoleNames()).anyMatch(x -> 
x.equals("CAVEMAN"));
             Assertions.assertThat(userMemento.streamRoleNames()).anyMatch(x -> 
x.equals("HUSBAND"));
-            Assertions.assertThat(userMemento.getAvatarUrl()).isEqualTo(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            
Assertions.assertThat(userMemento.getAvatarUrl()).isEqualTo(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
             Assertions.assertThat(userMemento.getRealName()).isNull();
         }
     }
@@ -129,7 +131,7 @@ class UserMemento_Test {
             val userMemento = UserMemento.ofNameAndRoleNames("fredflintstone", 
"CAVEMAN", "HUSBAND");
 
             // when
-            val userMemento2 = userMemento.withAvatarUrl(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            val userMemento2 = 
userMemento.withAvatarUrl(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
 
             // then copy created
             Assertions.assertThat(userMemento2).isNotSameAs(userMemento);
@@ -139,7 +141,7 @@ class UserMemento_Test {
             Assertions.assertThat(userMemento2.getRoles().size()).isEqualTo(2);
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("CAVEMAN"));
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("HUSBAND"));
-            Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            
Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
 
             // then original unchanged
             
Assertions.assertThat(userMemento.getName()).isEqualTo("fredflintstone");
@@ -156,7 +158,7 @@ class UserMemento_Test {
             val userMemento = UserMemento.ofNameAndRoleNames("fredflintstone", 
"CAVEMAN", "HUSBAND").withRealName("Fred Flintstone");
 
             // when
-            val userMemento2 = userMemento.withAvatarUrl(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            val userMemento2 = 
userMemento.withAvatarUrl(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
 
             // then copy created
             Assertions.assertThat(userMemento2).isNotSameAs(userMemento);
@@ -166,7 +168,7 @@ class UserMemento_Test {
             Assertions.assertThat(userMemento2.getRoles().size()).isEqualTo(2);
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("CAVEMAN"));
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("HUSBAND"));
-            Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            
Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
             Assertions.assertThat(userMemento2.getRealName()).isEqualTo("Fred 
Flintstone");
 
             // then original unchanged
@@ -265,7 +267,7 @@ class UserMemento_Test {
             val userMemento = UserMemento.ofName("fredflintstone")
                     .withRoleAdded("CAVEMAN")
                     .withRoleAdded("HUSBAND")
-                    .withAvatarUrl(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";))
+                    
.withAvatarUrl(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";))
                     .withRealName("Fred Flintstone")
                     .withMultiTenancyToken("/USA/Bedrock")
                     ;
@@ -275,7 +277,7 @@ class UserMemento_Test {
             Assertions.assertThat(userMemento.getRoles().size()).isEqualTo(2);
             Assertions.assertThat(userMemento.streamRoleNames()).anyMatch(x -> 
x.equals("CAVEMAN"));
             Assertions.assertThat(userMemento.streamRoleNames()).anyMatch(x -> 
x.equals("HUSBAND"));
-            Assertions.assertThat(userMemento.getAvatarUrl()).isEqualTo(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            
Assertions.assertThat(userMemento.getAvatarUrl()).isEqualTo(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
             Assertions.assertThat(userMemento.getRealName()).isEqualTo("Fred 
Flintstone");
             Assertions.assertThat(userMemento.isImpersonating()).isFalse();
 
@@ -290,7 +292,7 @@ class UserMemento_Test {
             Assertions.assertThat(userMemento2.getRoles().size()).isEqualTo(2);
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("CAVEMAN"));
             Assertions.assertThat(userMemento2.streamRoleNames()).anyMatch(x 
-> x.equals("HUSBAND"));
-            Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            
Assertions.assertThat(userMemento2.getAvatarUrl()).isEqualTo(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
             Assertions.assertThat(userMemento2.getRealName()).isEqualTo("Fred 
Flintstone");
             Assertions.assertThat(userMemento2.isImpersonating()).isTrue();
             
Assertions.assertThat(userMemento2.getMultiTenancyToken()).isEqualTo("/USA/Bedrock");
@@ -300,7 +302,7 @@ class UserMemento_Test {
             Assertions.assertThat(userMemento.getRoles().size()).isEqualTo(2);
             Assertions.assertThat(userMemento.streamRoleNames()).anyMatch(x -> 
x.equals("CAVEMAN"));
             Assertions.assertThat(userMemento.streamRoleNames()).anyMatch(x -> 
x.equals("HUSBAND"));
-            Assertions.assertThat(userMemento.getAvatarUrl()).isEqualTo(new 
java.net.URL("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
+            
Assertions.assertThat(userMemento.getAvatarUrl()).isEqualTo(url("https://upload.wikimedia.org/wikipedia/en/a/ad/Fred_Flintstone.png";));
             Assertions.assertThat(userMemento.getRealName()).isEqualTo("Fred 
Flintstone");
             Assertions.assertThat(userMemento.isImpersonating()).isFalse();
             
Assertions.assertThat(userMemento.getMultiTenancyToken()).isEqualTo("/USA/Bedrock");
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/hardening/_Hardening.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/hardening/_Hardening.java
index 23ad2c5e01..984bf6f129 100644
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/hardening/_Hardening.java
+++ 
b/commons/src/main/java/org/apache/causeway/commons/internal/hardening/_Hardening.java
@@ -18,10 +18,6 @@
  */
 package org.apache.causeway.commons.internal.hardening;
 
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Optional;
-
 import org.jsoup.Jsoup;
 import org.jsoup.safety.Safelist;
 import org.springframework.lang.Nullable;
@@ -35,27 +31,6 @@ import org.apache.causeway.commons.internal.base._Strings;
  */
 public class _Hardening {
 
-    // -- XSS GUARDS
-
-    /**
-     * @throws IllegalArgumentException - when an XSS attack is encountered, 
or the URL is not parseable
-     * @implNote unfortunately has potential for false positives; but shall do 
for now
-     */
-    public static Optional<URL> toUrlWithXssGuard(final @Nullable String 
untrustedUrl) {
-        if(_Strings.isEmpty(untrustedUrl)) {
-            return Optional.empty();
-        }
-        if(_Strings.condenseWhitespaces(untrustedUrl.toLowerCase(), 
"").contains("javascript:")) {
-            // simple guard against XSS attacks like javascript:alert(document)
-            throw new IllegalArgumentException("Not parseable as an URL ('" + 
untrustedUrl + "').");
-        }
-        try {
-            return Optional.of(new java.net.URL(untrustedUrl));
-        } catch (final MalformedURLException ex) {
-            throw new IllegalArgumentException("Not parseable as an URL ('" + 
untrustedUrl + "').", ex);
-        }
-    }
-
     /**
      * @see "https://jsoup.org/cookbook/cleaning-html/safelist-sanitizer";
      */
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/os/_OsUtil.java 
b/commons/src/main/java/org/apache/causeway/commons/internal/os/_OsUtil.java
index 2c28ec3fde..243b64b4f6 100644
--- a/commons/src/main/java/org/apache/causeway/commons/internal/os/_OsUtil.java
+++ b/commons/src/main/java/org/apache/causeway/commons/internal/os/_OsUtil.java
@@ -139,7 +139,7 @@ public class _OsUtil {
         default:
             throw _Exceptions.unsupportedOperation("OS " + os + " not (yet) 
supported");
         }
-        rt.exec(cmd);
+        rt.exec(new String[]{cmd});
     }
 
     /**
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/resources/_Resources.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/resources/_Resources.java
index 5294c55962..3dc065dca9 100644
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/resources/_Resources.java
+++ 
b/commons/src/main/java/org/apache/causeway/commons/internal/resources/_Resources.java
@@ -20,6 +20,7 @@ package org.apache.causeway.commons.internal.resources;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -50,6 +51,24 @@ import lombok.val;
  */
 public final class _Resources {
 
+    // -- URL UTILITY
+
+    /**
+     * Returns {@code null} for {@code null}. Throws on invalid input.
+     * @implNote XSS detection has potential for false positives
+     */
+    @SneakyThrows
+    public static URL url(final @Nullable String url) {
+        if(url == null) {
+            return null;
+        }
+        // simple guard against XSS attacks like javascript:alert(document)
+        if(_Strings.condenseWhitespaces(url.toLowerCase(), 
"").contains("javascript:")) {
+            throw new IllegalArgumentException("Not parseable as an URL ('" + 
url + "').");
+        }
+        return new URI(url).toURL();
+    }
+
     // -- CLASS PATH RESOURCE LOADING
 
     /**
@@ -166,7 +185,4 @@ public final class _Resources {
         return name;
     }
 
-
-
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectCreator.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectCreator.java
index 3186cdde8f..1d1e05961c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectCreator.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectCreator.java
@@ -21,7 +21,6 @@ package org.apache.causeway.core.metamodel.objectmanager;
 import java.lang.reflect.Array;
 import java.lang.reflect.Modifier;
 
-import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.commons.internal.factory._InstanceUtil;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
@@ -101,7 +100,7 @@ interface ObjectCreator {
 
             try {
 
-                val newInstance = _InstanceUtil.createInstance(type, 
_Constants.emptyObjects);
+                val newInstance = _InstanceUtil.createInstance(type);
                 return newInstance;
 
             } catch (Exception  e) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java
index e7f6cd3f19..151ec4fa72 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java
@@ -28,7 +28,6 @@ import java.util.stream.Stream;
 import org.apache.causeway.applib.annotation.CollectionLayout;
 import org.apache.causeway.applib.annotation.TableDecorator;
 import org.apache.causeway.applib.annotation.Where;
-import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.base._Strings;
@@ -293,7 +292,7 @@ public interface ObjectMember extends ObjectFeature {
         }
 
         val pojoComparator = _Casts.<Comparator<Object>>uncheckedCast(
-                _InstanceUtil.createInstance(sortedBy, 
_Constants.emptyObjects));
+                _InstanceUtil.createInstance(sortedBy));
         
getMetaModelContext().getServiceInjector().injectServicesInto(pojoComparator);
 
         return Optional.of((a, b) -> pojoComparator.compare(a.getPojo(), 
b.getPojo()));
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
index 5a92042cd2..35f3a29586 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
@@ -36,7 +36,6 @@ import org.apache.causeway.applib.id.LogicalType;
 import org.apache.causeway.applib.layout.grid.bootstrap.BSGrid;
 import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
@@ -365,7 +364,7 @@ public final class Facets {
                 .stream()
                 .map(TableDecoratorFacet::value)
                 .map(decoratorClass -> {
-                    val decorator = 
_InstanceUtil.createInstance(decoratorClass, decoratorClass, 
_Constants.emptyObjects);
+                    val decorator = 
_InstanceUtil.createInstance(decoratorClass, decoratorClass);
                     return facetHolders[0].injectServicesInto(decorator);
                 })
                 .findFirst();
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
index e458ea5801..ac3e2f2965 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
@@ -18,7 +18,6 @@
  */
 package org.apache.causeway.core.metamodel.valuesemantics;
 
-import java.net.MalformedURLException;
 import java.net.URL;
 
 import javax.annotation.Priority;
@@ -34,11 +33,10 @@ import 
org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.commons.internal.hardening._Hardening;
+import org.apache.causeway.commons.internal.resources._Resources;
 import org.apache.causeway.schema.common.v2.ValueType;
 
 import lombok.SneakyThrows;
-import lombok.val;
 
 @Component
 @Named("causeway.metamodel.value.URLValueSemantics")
@@ -73,8 +71,8 @@ implements
 
     private java.net.URL parseUrlElseNull(final String url) {
         try {
-            return new java.net.URL(url);
-        } catch (MalformedURLException e) {
+            return _Resources.url(url);
+        } catch (Exception e) {
             return null; // ignore
         }
     }
@@ -107,11 +105,7 @@ implements
 
     @Override
     public java.net.URL parseTextRepresentation(final 
ValueSemanticsProvider.Context context, final String text) {
-        val input = _Strings.blankToNullOrTrim(text);
-        if(input==null) {
-            return null;
-        }
-        return _Hardening.toUrlWithXssGuard(input).orElse(null);
+        return _Resources.url(_Strings.blankToNullOrTrim(text));
     }
 
     @Override
@@ -128,9 +122,9 @@ implements
     @Override
     public Can<URL> getExamples() {
         return Can.of(
-                new URL("https://maps.google.com";),
-                new URL("https://en.wikipedia.org/wiki/Domain-driven_design";)
-        );
+                "https://maps.google.com";,
+                "https://en.wikipedia.org/wiki/Domain-driven_design";)
+        .map(_Resources::url);
     }
 
 }
diff --git 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/AbstractRandomValueGenerator.java
 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/AbstractRandomValueGenerator.java
index 66f6a39380..eff0323278 100644
--- 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/AbstractRandomValueGenerator.java
+++ 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/AbstractRandomValueGenerator.java
@@ -18,6 +18,8 @@
  */
 package org.apache.causeway.testing.fakedata.applib.services;
 
+import java.util.concurrent.ThreadLocalRandom;
+
 /**
  * @since 2.0 {@index}
  */
@@ -29,4 +31,8 @@ abstract class AbstractRandomValueGenerator {
         this.fake = fake;
     }
 
+    protected static ThreadLocalRandom random() {
+        return ThreadLocalRandom.current();
+    }
+
 }
diff --git 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Collections.java
 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Collections.java
index c2d3524af9..066f66a79b 100644
--- 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Collections.java
+++ 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Collections.java
@@ -154,7 +154,7 @@ public class Collections extends 
AbstractRandomValueGenerator {
         return find(() -> anyOf(elements), except);
     }
 
-    public <T> T anyOf(final T... elements) {
+    public <T> T anyOf(@SuppressWarnings("unchecked") final T... elements) {
         final int randomIdx = fake.ints().upTo(elements.length);
         return elements[randomIdx];
     }
diff --git 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Doubles.java
 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Doubles.java
index 1aa23d85d8..1f529dcbb3 100644
--- 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Doubles.java
+++ 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Doubles.java
@@ -18,8 +18,6 @@
  */
 package org.apache.causeway.testing.fakedata.applib.services;
 
-import org.apache.commons.lang3.RandomUtils;
-
 /**
  * Returns random <code>double</code> values, optionally constrained within a 
range,
  *
@@ -33,11 +31,12 @@ public class Doubles extends AbstractRandomValueGenerator {
 
     public double any() {
         return fake.booleans().coinFlip()
-                ?  RandomUtils.nextDouble() * Double.MAX_VALUE
-                : -RandomUtils.nextDouble() * Double.MAX_VALUE;
+                ?  random().nextDouble() * Double.MAX_VALUE
+                : -random().nextDouble() * Double.MAX_VALUE;
     }
 
     public double upTo(final double max) {
-        return RandomUtils.nextDouble() * max;
+        return random().nextDouble() * max;
     }
+
 }
diff --git 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Floats.java
 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Floats.java
index 63107c2c2b..9028138987 100644
--- 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Floats.java
+++ 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Floats.java
@@ -18,8 +18,6 @@
  */
 package org.apache.causeway.testing.fakedata.applib.services;
 
-import org.apache.commons.lang3.RandomUtils;
-
 /**
  * Returns random <code>float</code> values, optionally constrained within a 
range,
  *
@@ -33,11 +31,11 @@ public class Floats extends AbstractRandomValueGenerator {
 
     public float any() {
         return fake.booleans().coinFlip()
-                ?  RandomUtils.nextFloat() * Float.MAX_VALUE
-                : -RandomUtils.nextFloat() * Float.MAX_VALUE;
+                ?  random().nextFloat() * Float.MAX_VALUE
+                : -random().nextFloat() * Float.MAX_VALUE;
     }
 
     public float upTo(final float max) {
-        return RandomUtils.nextFloat() * max;
+        return random().nextFloat() * max;
     }
 }
diff --git 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Integers.java
 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Integers.java
index ae365c9a0e..1dc4e98e0c 100644
--- 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Integers.java
+++ 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Integers.java
@@ -18,8 +18,6 @@
  */
 package org.apache.causeway.testing.fakedata.applib.services;
 
-import org.apache.commons.lang3.RandomUtils;
-
 /**
  * Returns random <code>int</code>eger values, optionally constrained within a 
range,
  *
@@ -33,8 +31,8 @@ public class Integers extends AbstractRandomValueGenerator {
 
     public int any() {
         return fake.booleans().coinFlip()
-                ?   RandomUtils.nextInt()
-                : - RandomUtils.nextInt();
+                ?   random().nextInt()
+                : - random().nextInt();
 
     }
 
diff --git 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Longs.java
 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Longs.java
index db12aa1360..0e484bcc99 100644
--- 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Longs.java
+++ 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Longs.java
@@ -18,8 +18,6 @@
  */
 package org.apache.causeway.testing.fakedata.applib.services;
 
-import org.apache.commons.lang3.RandomUtils;
-
 /**
  * Returns random <code>long</code> values, optionally constrained within a 
range,
  *
@@ -33,8 +31,8 @@ public class Longs extends AbstractRandomValueGenerator {
 
     public long any() {
         return fake.booleans().coinFlip()
-                ?   RandomUtils.nextLong()
-                : - RandomUtils.nextLong();
+                ?   random().nextLong()
+                : - random().nextLong();
     }
 
     public long upTo(final long upTo) {
diff --git 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Urls.java
 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Urls.java
index 2836fae604..ffe8cbb903 100644
--- 
a/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Urls.java
+++ 
b/testing/fakedata/applib/src/main/java/org/apache/causeway/testing/fakedata/applib/services/Urls.java
@@ -18,9 +18,10 @@
  */
 package org.apache.causeway.testing.fakedata.applib.services;
 
-import java.net.MalformedURLException;
 import java.net.URL;
 
+import org.apache.causeway.commons.internal.resources._Resources;
+
 /**
  * Returns random but well-formed {@link URL}s.
  *
@@ -33,13 +34,8 @@ public class Urls extends AbstractRandomValueGenerator {
     }
 
     public URL any() {
-        try {
-            final String protocol = fake.booleans().coinFlip() ? "http" : 
"https:";
-            final String url = fake.comms().url();
-            return new URL(String.format("%s://%s", protocol, url));
-        } catch (MalformedURLException e) {
-            // not expected
-            throw new RuntimeException(e);
-        }
+        final String protocol = fake.booleans().coinFlip() ? "http" : "https:";
+        final String url = fake.comms().url();
+        return _Resources.url(String.format("%s://%s", protocol, url));
     }
 }
diff --git 
a/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/CausewayActions.java
 
b/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/CausewayActions.java
index 1541f2cfa1..4d2e775a1a 100644
--- 
a/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/CausewayActions.java
+++ 
b/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/CausewayActions.java
@@ -22,6 +22,8 @@ import org.hamcrest.Description;
 import org.jmock.api.Action;
 import org.jmock.api.Invocation;
 
+import org.apache.causeway.commons.internal.factory._InstanceUtil;
+
 /**
  * @since 2.0 {@index}
  */
@@ -47,14 +49,14 @@ public final class CausewayActions {
         return new Action(){
 
             @Override
-            public void describeTo(Description description) {
+            public void describeTo(final Description description) {
                 description.appendText("new transient instance");
             }
 
             @Override
-            public Object invoke(Invocation invocation) throws Throwable {
-                Class<?> cls = (Class<?>) invocation.getParameter(0);
-                return cls.newInstance();
+            public Object invoke(final Invocation invocation) throws Throwable 
{
+                var cls = (Class<?>) invocation.getParameter(0);
+                return _InstanceUtil.createInstance(cls);
             }
         };
     }
diff --git 
a/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/soap/SoapEndpointSpec.java
 
b/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/soap/SoapEndpointSpec.java
index e97f60ba8e..f0fc2bb65e 100644
--- 
a/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/soap/SoapEndpointSpec.java
+++ 
b/testing/unittestsupport/applib/src/main/java/org/apache/causeway/testing/unittestsupport/applib/soap/SoapEndpointSpec.java
@@ -20,6 +20,8 @@ package 
org.apache.causeway.testing.unittestsupport.applib.soap;
 
 import java.util.function.Supplier;
 
+import org.apache.causeway.commons.internal.factory._InstanceUtil;
+
 public class SoapEndpointSpec {
 
     static SoapEndpointSpec asSoapEndpointSpec(final Class<?> input) {
@@ -61,7 +63,7 @@ public class SoapEndpointSpec {
     /**
      * Populated when published if not otherwise.
      */
-    void setEndpointAddress(String endpointAddress) {
+    void setEndpointAddress(final String endpointAddress) {
         this.endpointAddress = endpointAddress;
     }
 
@@ -74,11 +76,7 @@ public class SoapEndpointSpec {
 
         @Override
         public Object get() {
-            try {
-                return endpointClass.newInstance();
-            } catch (InstantiationException | IllegalAccessException e) {
-                throw new RuntimeException(e);
-            }
+            return _InstanceUtil.createInstance(endpointClass);
         }
     }
 
diff --git 
a/testing/unittestsupport/applib/src/test/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/JUnitRuleMockery2Test_mockAnnotatedWithNever_sadCase.java
 
b/testing/unittestsupport/applib/src/test/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/JUnitRuleMockery2Test_mockAnnotatedWithNever_sadCase.java
index 9593638dfc..78870d16c4 100644
--- 
a/testing/unittestsupport/applib/src/test/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/JUnitRuleMockery2Test_mockAnnotatedWithNever_sadCase.java
+++ 
b/testing/unittestsupport/applib/src/test/java/org/apache/causeway/testing/unittestsupport/applib/jmocking/JUnitRuleMockery2Test_mockAnnotatedWithNever_sadCase.java
@@ -35,7 +35,6 @@ public class 
JUnitRuleMockery2Test_mockAnnotatedWithNever_sadCase {
     @Rule
     public JUnitRuleMockery2 context = 
JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-    @SuppressWarnings("unused")
     @Never
     @Mock
     private Collaborator collaborator;
diff --git 
a/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java
 
b/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java
index ab0ab71987..f990d6465c 100644
--- 
a/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java
+++ 
b/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java
@@ -19,7 +19,7 @@
 package org.apache.causeway.tooling.projectmodel.maven;
 
 import java.io.File;
-import java.net.URL;
+import java.net.URI;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -62,7 +62,7 @@ public class SimpleModelResolver implements ModelResolver {
     }
 
     @Override
-    public ModelSource resolveModel(String groupId, String artifactId, String 
version)
+    public ModelSource resolveModel(final String groupId, final String 
artifactId, final String version)
             throws UnresolvableModelException {
 
         val key = String.format("%s:%s:%s", groupId, artifactId, version);
@@ -83,13 +83,14 @@ public class SimpleModelResolver implements ModelResolver {
             for(val entry : repositories.entrySet()) {
                 val repo = entry.getValue();
 
-                val pomUrl = new URL(String.format("%s/%s/%s/%s/%s-%s.pom",
+                val pomUrl = new URI(String.format("%s/%s/%s/%s/%s-%s.pom",
                         repo.getUrl(),
                         groupId.replace('.', '/'),
                         artifactId,
                         version,
                         artifactId,
-                        version));
+                        version))
+                    .toURL();
 
                 try {
                     val urlConn = pomUrl.openConnection();
@@ -111,13 +112,13 @@ public class SimpleModelResolver implements ModelResolver 
{
     }
 
     @Override
-    public ModelSource resolveModel(Parent parent) throws 
UnresolvableModelException {
+    public ModelSource resolveModel(final Parent parent) throws 
UnresolvableModelException {
         log.info("resolveModel-parent");
         return resolveModel(parent.getGroupId(), parent.getArtifactId(), 
parent.getVersion());
     }
 
     @Override
-    public ModelSource resolveModel(Dependency dependency) throws 
UnresolvableModelException {
+    public ModelSource resolveModel(final Dependency dependency) throws 
UnresolvableModelException {
         log.info("resolveModel-dependency");
         return resolveModel(
                 dependency.getGroupId(),
@@ -126,13 +127,13 @@ public class SimpleModelResolver implements ModelResolver 
{
     }
 
     @Override
-    public void addRepository(Repository repository) throws 
InvalidRepositoryException {
+    public void addRepository(final Repository repository) throws 
InvalidRepositoryException {
         log.info("adding repository {}", repository.getUrl());
         repositories.put(repository.getId(), repository);
     }
 
     @Override
-    public void addRepository(Repository repository, boolean replace) throws 
InvalidRepositoryException {
+    public void addRepository(final Repository repository, final boolean 
replace) throws InvalidRepositoryException {
         addRepository(repository);
     }
 
@@ -142,7 +143,7 @@ public class SimpleModelResolver implements ModelResolver {
     }
 
 
-    public Model lookupCatalogForSubmoduleOf(Model mavenProj, String 
realtivePath) {
+    public Model lookupCatalogForSubmoduleOf(final Model mavenProj, final 
String realtivePath) {
 
         final String localPath;
         try {
diff --git 
a/viewers/restfulobjects/applib/src/main/java/org/apache/causeway/viewer/restfulobjects/applib/util/Parser.java
 
b/viewers/restfulobjects/applib/src/main/java/org/apache/causeway/viewer/restfulobjects/applib/util/Parser.java
index 90e59ccd47..1f3f20b7d2 100644
--- 
a/viewers/restfulobjects/applib/src/main/java/org/apache/causeway/viewer/restfulobjects/applib/util/Parser.java
+++ 
b/viewers/restfulobjects/applib/src/main/java/org/apache/causeway/viewer/restfulobjects/applib/util/Parser.java
@@ -28,6 +28,7 @@ import java.util.stream.Collectors;
 
 import javax.ws.rs.core.CacheControl;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.ext.RuntimeDelegate;
 
 import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.base._NullSafe;
@@ -115,12 +116,15 @@ public abstract class Parser<T> {
 
     public static Parser<CacheControl> forCacheControl() {
         return new Parser<CacheControl>() {
+
             @Override
             public CacheControl valueOf(final String str) {
                 if (str == null) {
                     return null;
                 }
-                final CacheControl cacheControl = CacheControl.valueOf(str);
+                CacheControl cacheControl =
+                        
RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class)
+                        .fromString(str);
                 // workaround for bug in CacheControl's equals() method
                 cacheControl.getCacheExtension();
                 cacheControl.getNoCacheFields();
@@ -129,7 +133,8 @@ public abstract class Parser<T> {
 
             @Override
             public String asString(final CacheControl cacheControl) {
-                return cacheControl.toString();
+                return 
RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class)
+                        .toString(cacheControl);
             }
         };
     }


Reply via email to