You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2025/06/13 09:26:20 UTC

(causeway) branch v4 updated: CAUSEWAY-3892: work on deprecations (3)

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

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


The following commit(s) were added to refs/heads/v4 by this push:
     new 2e370a2ee9c CAUSEWAY-3892: work on deprecations (3)
2e370a2ee9c is described below

commit 2e370a2ee9c47c0627d1aca340675d9239416fa9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jun 13 11:26:15 2025 +0200

    CAUSEWAY-3892: work on deprecations (3)
---
 .../applib/services/bookmark/IdStringifier.java    |  80 ---------
 .../applib/services/email/EmailService.java        |   8 +-
 .../services/wrapper/events/ParseValueEvent.java   |  62 -------
 .../commons/internal/exceptions/_Exceptions.java   |  46 -----
 .../core/config/CausewayConfiguration.java         | 197 +--------------------
 .../core/config/CausewayModuleCoreConfig.java      |  35 ++++
 .../causeway/core/config/EmailConfiguration.java   |  24 +--
 .../core/metamodel/object/ManagedObject.java       |   2 -
 .../metamodel/spec/HasObjectSpecification.java     |   2 -
 .../valuesemantics/BigDecimalValueSemantics.java   |   4 +-
 .../BigDecimalValueSemanticsProviderTest.java      |   2 +-
 ...anticsProvider_configureDecimalFormat_Test.java |   6 +-
 .../CausewayModuleCoreRuntimeServices.java         |   4 +-
 .../runtimeservices/email/EmailServiceDefault.java | 120 +++----------
 .../restclient/api/delete/DeleteMessage.java       |   2 -
 .../api/deleteMany/DeleteManyMessage.java          |   2 -
 .../applib/user/events/UserCreatedEvent.java       |   5 -
 .../fc/res/FullCalendarCssReference.java           |  50 ------
 .../extensions/sse/applib/service/SseChannel.java  |   3 -
 .../sse/wicket/services/SseServiceDefault.java     |   4 +-
 .../repository/RepositoryServiceDefault.java       |   3 +-
 .../persistence/jpa/eclipselink/inject/_Util.java  |  24 +--
 .../integration/entity/_JpaEntityStateUtil.java    |  45 -----
 .../viewers/jpa/wkt/InteractionTestJpaWkt.java     |   2 +-
 .../client/auth/basic/BasicCreds.java              |   3 -
 .../client/auth/oauth2/Oauth2Creds.java            |   5 -
 .../service/valuerender/_JsonValueConverters.java  |   6 -
 .../scalars/jdkmath/BigDecimalConverterTest.java   |   7 +-
 28 files changed, 103 insertions(+), 650 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/IdStringifier.java b/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/IdStringifier.java
index ec82d17f005..7fb7b34c1ba 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/IdStringifier.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/IdStringifier.java
@@ -20,9 +20,6 @@
 
 package org.apache.causeway.applib.services.bookmark;
 
-import org.apache.causeway.commons.internal.assertions._Assert;
-
-import lombok.Getter;
 import org.jspecify.annotations.NonNull;
 
 /**
@@ -44,7 +41,6 @@
  *
  * @since 2.0 {@index}
  */
-@SuppressWarnings("javadoc")
 public interface IdStringifier<T> {
 
     public final static char SEPARATOR = '_';
@@ -104,80 +100,4 @@ default T destring(final @NonNull Class<?> targetEntityClass, final @NonNull Str
 
     }
 
-    /**
-     * Provided for backward compatibility with some v1 Ids that used a prefix to determine their actual type.
-     * <p>
-     * (In v2 we provide this so in the constructor, so there's no need to encode the type in the stringified form
-     * of the value).
-     *
-     * @param <T>
-     *
-     * @deprecated not used within the framework; eventually remove
-     */
-    @Deprecated
-    abstract class AbstractWithPrefix<T> implements IdStringifier<T> {
-
-        /**
-         * eg <code>Integer.class</code>, or JDO-specific <code>DatastoreId</code>,
-         * or a custom class for application-defined PKs.
-         */
-        @Getter private final Class<T> correspondingClass;
-
-        private final String prefix;
-
-        public AbstractWithPrefix(
-                final @NonNull Class<T> correspondingClass,
-                final @NonNull String typeCode) {
-            _Assert.assertFalse(correspondingClass.isPrimitive(),
-                    ()->String.format("not allowed to be initialzed with a primitive class (%s), "
-                            + "use the boxed variant instead",
-                            correspondingClass));
-            this.correspondingClass = correspondingClass;
-            this.prefix = typeCode + SEPARATOR;
-        }
-
-        @Override
-        public final String enstring(final @NonNull T value) {
-            return prefix + doEnstring(value);
-        }
-
-        /**
-         * Overridable hook
-         */
-        protected String doEnstring(final T value) {
-            return value.toString();
-        }
-
-        @Override
-        public final T destring(
-                final @NonNull Class<?> targetEntityClass,
-                final @NonNull String stringified) {
-            var suffix = removePrefix(stringified);
-            return doDestring(suffix, targetEntityClass);
-        }
-
-        /**
-         * Mandatory hook
-         */
-        protected abstract T doDestring(
-                final @NonNull String idStr,
-                final @NonNull Class<?> targetEntityClass);
-
-        private String removePrefix(final String str) {
-            if (str.startsWith(prefix)) {
-                return str.substring(prefix.length());
-            }
-            throw new IllegalArgumentException(
-                    String.format("expected id to start with '%s', but got '%s'", prefix, str));
-        }
-
-        /**
-         * Not API
-         */
-        public boolean recognizes(final String stringified) {
-            return stringified.startsWith(prefix);
-        }
-
-    }
-
 }
diff --git a/api/applib/src/main/java/org/apache/causeway/applib/services/email/EmailService.java b/api/applib/src/main/java/org/apache/causeway/applib/services/email/EmailService.java
index 87e37f39aff..1a1810be8e0 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/services/email/EmailService.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/services/email/EmailService.java
@@ -18,14 +18,11 @@
  */
 package org.apache.causeway.applib.services.email;
 
-import java.io.Serializable;
 import java.util.List;
 
 import jakarta.activation.DataSource;
-import jakarta.annotation.PostConstruct;
 
 /**
- *
  * The `EmailService` provides the ability to send HTML emails, with
  * attachments, to one or more recipients.
  *
@@ -36,10 +33,7 @@
  *
  * @since 1.x {@index}
  */
-public interface EmailService extends Serializable {
-
-    @PostConstruct
-    public void init() ;
+public interface EmailService {
 
     /**
      * The main API to send the email (and optional attachments).
diff --git a/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/events/ParseValueEvent.java b/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/events/ParseValueEvent.java
deleted file mode 100644
index 25b6007432b..00000000000
--- a/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/events/ParseValueEvent.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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.
- */
-package org.apache.causeway.applib.services.wrapper.events;
-
-import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.services.wrapper.WrapperFactory;
-
-/**
- * Supported only by {@link WrapperFactory},
- * represents a check as to whether the proposed values of the value type is valid.
- * <p>
- * If {@link #getReason()} is not <tt>null</tt> then provides the reason why the
- * proposed value is invalid, otherwise the new value is acceptable.
- *
- * @since 1.x {@index}
- */
-@Deprecated // not used
-public class ParseValueEvent extends ValidityEvent {
-
-    private static Object coalesce(final Object source, final String proposed) {
-        return source != null ? source : proposed;
-    }
-
-    private final String proposed;
-
-    public ParseValueEvent(final Object source, final Identifier classIdentifier, final String proposed) {
-        super(coalesce(source, proposed), classIdentifier);
-        this.proposed = proposed;
-    }
-
-    /**
-     * Will be the source provided in the
-     * {@link #ParseValueEvent(Object, Identifier, String) constructor} if not
-     * null, otherwise will fallback to the proposed value.
-     */
-    @Override
-    public Object getSource() {
-        return super.getSource();
-    }
-
-    @Override
-    public String getProposed() {
-        return proposed;
-    }
-
-}
diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/exceptions/_Exceptions.java b/commons/src/main/java/org/apache/causeway/commons/internal/exceptions/_Exceptions.java
index 7ee17ae6dc7..1aac4c6a198 100644
--- a/commons/src/main/java/org/apache/causeway/commons/internal/exceptions/_Exceptions.java
+++ b/commons/src/main/java/org/apache/causeway/commons/internal/exceptions/_Exceptions.java
@@ -254,52 +254,6 @@ public static void throwUnexpectedCodeReach() {
         throw unexpectedCodeReach();
     }
 
-    /**
-     * Used to hide from the compiler the fact, that this call always throws.
-     *
-     * <pre>{
-     *    throw notImplemented();
-     *    return 0; // won't compile: unreachable code
-     *}</pre>
-     *
-     * hence ...
-     *
-     * <pre>{
-     *    throwNotImplemented();
-     *    return 0;
-     *}</pre>
-     *
-     */
-    @Deprecated
-    public static void throwNotImplemented() {
-        dumpStackTrace();
-        throw notImplemented();
-    }
-
-    // -- SELECTIVE ERROR SUPPRESSION
-
-    //	/**
-    //	 * Allows to selectively ignore unchecked exceptions. Most likely used framework internally
-    //	 * for workarounds, not properly dealing with the root cause. This way at least we know, where
-    //	 * we placed such workarounds.
-    //	 *
-    //	 * @param runnable that might throw an unchecked exception
-    //	 * @param suppress predicate that decides whether to suppress an exception
-    //	 */
-    //	public static void catchSilently(
-    //			Runnable runnable,
-    //			Predicate<RuntimeException> suppress) {
-    //
-    //		try {
-    //			runnable.run();
-    //		} catch (RuntimeException cause) {
-    //			if(suppress.test(cause)) {
-    //				return;
-    //			}
-    //			throw cause;
-    //		}
-    //	}
-
     // -- SELECTIVE THROW
 
     public static <E extends Exception> void throwWhenTrue(final E cause, final Predicate<E> test) throws E {
diff --git a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
index de9f58f0161..bea650d6512 100644
--- a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
@@ -63,7 +63,6 @@
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
 import org.springframework.boot.info.BuildProperties;
 import org.springframework.core.env.ConfigurableEnvironment;
 import org.springframework.core.env.EnumerablePropertySource;
@@ -1847,51 +1846,15 @@ public static class Runtime {
         public static class RuntimeServices {
 
             private final Email email = new Email();
+            /**
+             * Mail specific configuration in addition to Spring's <code>spring.mail.*</code>.
+             * See also spring.mail.port, spring.mail.properties.mail.smtp.connectiontimeout,
+             * spring.mail.properties.mail.smtp.timeout, spring.mail.host, spring.mail.username,
+             * spring.mail.password, spring.mail.javamail.properties.mail.smtp.starttls.enable
+             */
             @Data
             public static class Email {
 
-                @Deprecated
-                private int port = 587;
-
-                /**
-                 * The port to use for sending email.
-                 *
-                 * @deprecated  - ignored, instead use <code>spring.mail.port</code>
-                 */
-                @Deprecated
-                @DeprecatedConfigurationProperty(replacement = "spring.mail.port")
-                public int getPort() {
-                    return port;
-                }
-
-                @Deprecated
-                private int socketConnectionTimeout = 2000;
-
-                /**
-                 * The maximum number of millseconds to wait to obtain a socket connection before timing out.
-                 *
-                 * @deprecated  - ignored, instead use <code>spring.mail.properties.mail.smtp.connectiontimeout</code>
-                 */
-                @Deprecated
-                @DeprecatedConfigurationProperty(replacement = "spring.mail.properties.mail.smtp.connectiontimeout")
-                public int getSocketConnectionTimeout() {
-                    return socketConnectionTimeout;
-                }
-
-                @Deprecated
-                private int socketTimeout = 2000;
-
-                /**
-                 * The maximum number of milliseconds to wait to obtain a socket before timing out.
-                 *
-                 * @deprecated  - ignored, instead use <code>spring.mail.properties.mail.smtp.timeout</code>
-                 */
-                @Deprecated
-                @DeprecatedConfigurationProperty(replacement = "spring.mail.properties.mail.smtp.timeout")
-                public int getSocketTimeout() {
-                    return socketTimeout;
-                }
-
                 /**
                  * If an email fails to send, whether to propagate the exception (meaning that potentially the end-user
                  * might see the exception), or whether instead to just indicate failure through the return value of
@@ -1927,63 +1890,6 @@ public static class Override {
                 @Data
                 public static class Sender {
 
-                    @Deprecated
-                    private String hostname;
-
-                    /**
-                     * Specifies the host running the SMTP service.
-                     *
-                     * <p>
-                     *     If not specified, then the value used depends upon the email implementation.  The default
-                     *     implementation will use the <code>mail.smtp.host</code> system property.
-                     * </p>
-                     *
-                     * @deprecated - now ignored, instead use <code>spring.mail.host</code>
-                     */
-                    @Deprecated
-                    @DeprecatedConfigurationProperty(replacement = "spring.mail.host")
-                    public String getHostname() {
-                        return hostname;
-                    }
-
-                    @Deprecated
-                    private String username;
-
-                    /**
-                     * Specifies the username to use to connect to the SMTP service.
-                     *
-                     * <p>
-                     *     If not specified, then the sender's {@link #getAddress() email address} will be used instead.
-                     * </p>
-                     *
-                     * @deprecated - now ignored, instead use <code>spring.mail.username</code>
-                     */
-                    @Deprecated
-                    @DeprecatedConfigurationProperty(replacement = "spring.mail.username")
-                    public String getUsername() {
-                        return username;
-                    }
-
-                    @Deprecated
-                    private String password;
-
-                    /**
-                     * Specifies the password (corresponding to the {@link #getUsername() username} to connect to the
-                     * SMTP service.
-                     *
-                     * <p>
-                     *     This configuration property is mandatory (for the default implementation of the
-                     *     {@link org.apache.causeway.applib.services.email.EmailService}, at least).
-                     * </p>
-                     *
-                     * @deprecated - now ignored, instead use <code>spring.mail.password</code>
-                     */
-                    @Deprecated
-                    @DeprecatedConfigurationProperty(replacement = "spring.mail.password")
-                    public String getPassword() {
-                        return password;
-                    }
-
                     /**
                      * Specifies the email address of the user sending the email.
                      *
@@ -2001,25 +1907,6 @@ public String getPassword() {
                     private String address;
                 }
 
-                @Deprecated
-                private final Tls tls = new Tls();
-                @Deprecated
-                @Data
-                public static class Tls {
-                    @Deprecated
-                    private boolean enabled = true;
-
-                    /**
-                     * Whether TLS encryption should be started (that is, <code>STARTTLS</code>).
-                     *
-                     * @deprecated  - now ignored, instead use <code>spring.mail.javamail.properties.mail.smtp.starttls.enable</code>
-                     */
-                    @Deprecated
-                    @DeprecatedConfigurationProperty(replacement = "spring.mail.javamail.properties.mail.smtp.starttls.enable")
-                    public boolean isEnabled() {
-                        return enabled;
-                    }
-                }
             }
 
             private final ApplicationFeatures applicationFeatures = new ApplicationFeatures();
@@ -2034,27 +1921,6 @@ public static class ApplicationFeatures {
                 ApplicationFeaturesInitConfiguration init = ApplicationFeaturesInitConfiguration.NOT_SPECIFIED;
             }
 
-            private final RepositoryService repositoryService = new RepositoryService();
-            @Data
-            public static class RepositoryService {
-                private boolean disableAutoFlush = false;
-
-                /**
-                 * Normally any queries are automatically preceded by flushing pending executions.
-                 *
-                 * <p>
-                 * This key allows this behaviour to be disabled.
-                 * </p>
-                 *
-                 * @deprecated - use instead <code>causeway.persistence.commons.repository-service.disable-auto-flush</code>
-                 */
-                @Deprecated
-                @DeprecatedConfigurationProperty(replacement = "causeway.persistence.commons.repository-service.disable-auto-flush")
-                public boolean isDisableAutoFlush() {
-                    return disableAutoFlush;
-                }
-            }
-
             private final ExceptionRecognizer exceptionRecognizer = new ExceptionRecognizer();
             @Data
             public static class ExceptionRecognizer {
@@ -3584,23 +3450,6 @@ public static class BigDecimal {
              */
             private boolean useScaleForMinFractionalFacet = true;
 
-            /**
-             * The minimum scale to use for all {@link java.math.BigDecimal}s.
-             *
-             * <p>
-             * Is only used if the minimum scale has not been specified explicitly by some other means, typically
-             * either {@link Digits#fraction()} or an ORM semantic such as the (JPA) {@link Column#scale()}.
-             *
-             * @deprecated - use {@link Display#getMinScale()} instead
-             */
-            @Deprecated(since = "2.2.0")
-            private Integer minScale = null;
-
-            @DeprecatedConfigurationProperty(replacement = "causeway.value-types.big-decimal.display.min-scale", reason = "Moved")
-            public Integer getMinScale() {
-                return minScale;
-            }
-
             private final Editing editing = new Editing();
             @Data
             public static class Editing {
@@ -3661,40 +3510,6 @@ public static class Display {
                 private boolean useGroupingSeparator = true;
             }
 
-            /**
-             * A common use of {@link java.math.BigDecimal} is as a money value.  In some locales (eg English), the
-             * &quot;,&quot; (comma) is the grouping (thousands) separator wihle the &quot;.&quot; (period) acts as a
-             * decimal point, but in others (eg France, Italy) it is the other way around.
-             *
-             * <p>
-             *     Surprisingly perhaps, a string such as "123,99", when parsed ((by {@link java.text.DecimalFormat})
-             *     in an English locale, is not rejected but instead is evaluated as the value 12399L.  That's almost
-             *     certainly not what the end-user would have expected, and results in a money value 100x too large.
-             * </p>
-             *
-             * <p>
-             *     The purpose of this configuration property is to remove the confusion by simply disallowing the
-             *     thousands separator from being part of the input string.
-             * </p>
-             *
-             * <p>
-             *     For maximum safety, allowing the grouping separator is disallowed, but the alternate (original)
-             *     behaviour can be reinstated by setting this config property back to <code>true</code>.
-             * </p>
-             *
-             * <p>
-             *     The same configuration property is also used for rendering the value.
-             * </p>
-             *
-             * @deprecated - use {@link Editing#isUseGroupingSeparator()} instead.
-             */
-            @Deprecated(since = "2.2.0")
-            private boolean useGroupingSeparator = false;
-
-            @DeprecatedConfigurationProperty(replacement = "causeway.value-types.big-decimal.editing.use-grouping-separator")
-            public boolean isUseGroupingSeparator() {
-                return useGroupingSeparator;
-            }
         }
 
         private final Kroki kroki = new Kroki();
diff --git a/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java b/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java
index 77cded292af..2cfc7dbedb9 100644
--- a/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java
@@ -18,10 +18,13 @@
  */
 package org.apache.causeway.core.config;
 
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
+import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.core.config.applib.RestfulPathProvider;
 import org.apache.causeway.core.config.beans.CausewayBeanFactoryPostProcessor;
 import org.apache.causeway.core.config.converters.PatternsConverter;
@@ -62,4 +65,36 @@ public class CausewayModuleCoreConfig {
 
     public static final String NAMESPACE = "causeway.config";
 
+    @Bean
+    public EmailConfiguration emailConfiguration(
+        CausewayConfiguration conf,
+        @Value("#{systemProperties['spring.mail.username']}") String senderEmailUsername,
+        @Value("#{systemProperties['spring.mail.password']}") String senderEmailPassword,
+        @Value("#{systemProperties['spring.mail.host']}") String senderEmailHostName,
+        @Value("#{systemProperties['spring.mail.port']}") Integer senderEmailPort,
+        @Value("#{systemProperties['spring.mail.javamail.properties.mail.smtp.starttls.enable']}") Boolean senderEmailTlsEnabled,
+        @Value("#{systemProperties['spring.mail.properties.mail.smtp.timeout']}") Integer smtpTimeout,
+        @Value("#{systemProperties['spring.mail.properties.mail.smtp.connectiontimeout']}") Integer smtpConnectionTimeout) {
+
+
+        var emailConfiguration = conf.getCore().getRuntimeServices().getEmail();
+
+        String senderUsername = _Strings.emptyToNull(senderEmailUsername);
+        String senderPassword = _Strings.emptyToNull(senderEmailPassword);
+        String senderHostName = _Strings.emptyToNull(senderEmailHostName);
+        int senderPort = senderEmailPort!=null ? senderEmailPort : 587;
+        boolean isSenderTlsEnabled = senderEmailTlsEnabled!=null ? senderEmailTlsEnabled : true;
+        int socketTimeout = smtpTimeout!=null ? smtpTimeout : 2000;
+        int socketConnectionTimeout = smtpConnectionTimeout!=null ? smtpConnectionTimeout : 2000;
+        boolean isThrowExceptionOnFail = emailConfiguration.isThrowExceptionOnFail();
+        String senderAddress = emailConfiguration.getSender().getAddress();
+        String overrideTo = emailConfiguration.getOverride().getTo();
+        String overrideCc = emailConfiguration.getOverride().getCc();
+        String overrideBcc = emailConfiguration.getOverride().getBcc();
+
+        return new EmailConfiguration(senderUsername, senderPassword, senderHostName, senderPort,
+            isSenderTlsEnabled, socketTimeout, socketConnectionTimeout,
+            isThrowExceptionOnFail, senderAddress, overrideTo, overrideCc, overrideBcc);
+    }
+
 }
diff --git a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/basic/BasicCreds.java b/core/config/src/main/java/org/apache/causeway/core/config/EmailConfiguration.java
similarity index 67%
copy from viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/basic/BasicCreds.java
copy to core/config/src/main/java/org/apache/causeway/core/config/EmailConfiguration.java
index 9efa49e4fb4..6774f9f2331 100644
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/basic/BasicCreds.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/EmailConfiguration.java
@@ -16,15 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.restfulobjects.client.auth.basic;
+package org.apache.causeway.core.config;
 
-import lombok.Builder;
-
-@Builder
-public record BasicCreds(
-        String username,
-        String password) {
-
-    @Deprecated public String getUsername() { return username(); }
-    @Deprecated public String getPassword() { return password(); }
+public record EmailConfiguration(
+    String senderUsername,
+    String senderPassword,
+    String senderHostName,
+    int senderPort,
+    boolean isSenderTlsEnabled,
+    int socketTimeout,
+    int socketConnectionTimeout,
+    boolean isThrowExceptionOnFail,
+    String senderAddress,
+    String overrideTo,
+    String overrideCc,
+    String overrideBcc) {
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java
index b52b51d71ed..d51f16d4975 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java
@@ -352,8 +352,6 @@ <T> T assertCompliance(
      */
     Specialization specialization();
 
-    @Deprecated default Specialization getSpecialization() { return specialization(); }
-
     @Override default Specialization.BookmarkPolicy getBookmarkPolicy() {
         return specialization().getBookmarkPolicy();
     }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/HasObjectSpecification.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/HasObjectSpecification.java
index d4939f3c4f4..0e64e4d5f5f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/HasObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/HasObjectSpecification.java
@@ -30,8 +30,6 @@
  */
 public interface HasObjectSpecification {
 
-    @Deprecated default ObjectSpecification getSpecification() { return objSpec(); }
-
     ObjectSpecification objSpec();
 
     // -- SHORTCUTS
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
index 6e9b17db5d7..d42cff650f4 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
@@ -137,7 +137,7 @@ public BigDecimal parseTextRepresentation(final ValueSemanticsProvider.Context c
     }
 
     private boolean isUseGroupingSeparatorFrom(final CausewayConfiguration.ValueTypes.BigDecimal bigDecimalConfig) {
-        return bigDecimalConfig.getEditing().isUseGroupingSeparator() || bigDecimalConfig.isUseGroupingSeparator();
+        return bigDecimalConfig.getEditing().isUseGroupingSeparator() || bigDecimalConfig.getDisplay().isUseGroupingSeparator();
     }
 
     @Override
@@ -185,7 +185,7 @@ protected void configureDecimalFormat(
 
     private static Optional<Integer> minScaleFrom(final CausewayConfiguration.ValueTypes.BigDecimal bigDecimalConfig) {
         return Optional.ofNullable(bigDecimalConfig.getDisplay().getMinScale())
-                       .or(() -> Optional.ofNullable(bigDecimalConfig.getMinScale()));
+                       .or(() -> Optional.ofNullable(bigDecimalConfig.getDisplay().getMinScale()));
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
index c47f43d0f7e..4e97d6a2ad1 100644
--- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
@@ -109,7 +109,7 @@ void titleOf() {
 
     @Test
     void titleOfWhenUseGroupingSeparator() {
-        causewayConfiguration.getValueTypes().getBigDecimal().setUseGroupingSeparator(true);
+        causewayConfiguration.getValueTypes().getBigDecimal().getDisplay().setUseGroupingSeparator(true);
 
         assertEquals("34,132.199", value.titlePresentation(null, bigDecimal));
     }
diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemanticsProvider_configureDecimalFormat_Test.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemanticsProvider_configureDecimalFormat_Test.java
index 86a1b5d95db..bb8ec84542b 100644
--- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemanticsProvider_configureDecimalFormat_Test.java
+++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemanticsProvider_configureDecimalFormat_Test.java
@@ -58,7 +58,7 @@ void setUpObjects() throws Exception {
         context = new ValueSemanticsProvider.Context(mockIdentifier, null);
 
         causewayConfiguration = CausewayConfiguration.builder().build();
-        causewayConfiguration.getValueTypes().getBigDecimal().setMinScale(null);
+        causewayConfiguration.getValueTypes().getBigDecimal().getDisplay().setMinScale(null);
 
         // expecting
         Mockito.lenient().when(mockSpecificationLoader.loadFeature(mockIdentifier)).thenReturn(Optional.of(mockObjectFeature));
@@ -101,7 +101,7 @@ void min_facets_not_set_but_fallback() {
         Mockito.lenient().when(mockObjectFeature.lookupFacet(MinFractionalDigitsFacet.class))
                .thenReturn(Optional.empty());
 
-        causewayConfiguration.getValueTypes().getBigDecimal().setMinScale(fallbackScale);
+        causewayConfiguration.getValueTypes().getBigDecimal().getDisplay().setMinScale(fallbackScale);
 
         // when
         DecimalFormat format = new DecimalFormat();
@@ -124,7 +124,7 @@ void min_facets_not_set_and_no_fallback() {
         Mockito.lenient().when(mockObjectFeature.lookupFacet(MinFractionalDigitsFacet.class))
                .thenReturn(Optional.empty());
 
-        causewayConfiguration.getValueTypes().getBigDecimal().setMinScale(null);
+        causewayConfiguration.getValueTypes().getBigDecimal().getDisplay().setMinScale(null);
 
         // when
         DecimalFormat format = new DecimalFormat();
diff --git a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java
index 26a96b1db13..2ec2bbaff05 100644
--- a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java
+++ b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java
@@ -18,8 +18,6 @@
  */
 package org.apache.causeway.core.runtimeservices;
 
-import jakarta.inject.Singleton;
-
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -136,7 +134,7 @@ public class CausewayModuleCoreRuntimeServices {
 
     public static final String NAMESPACE = "causeway.runtimeservices";
 
-    @Bean @Singleton // also used by _Spring utility
+    @Bean // also used by _Spring utility
     public OrderComparator orderComparator() {
         return new AnnotationAwareOrderComparator();
     }
diff --git a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/email/EmailServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/email/EmailServiceDefault.java
index 4a6b70e9d56..25c332c60c5 100644
--- a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/email/EmailServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/email/EmailServiceDefault.java
@@ -22,7 +22,6 @@
 import java.util.List;
 
 import jakarta.activation.DataSource;
-import jakarta.annotation.PostConstruct;
 import jakarta.annotation.Priority;
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
@@ -33,13 +32,17 @@
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.services.email.EmailService;
 import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.core.config.CausewayConfiguration;
+import org.apache.causeway.core.config.EmailConfiguration;
 import org.apache.causeway.core.runtimeservices.CausewayModuleCoreRuntimeServices;
 
+import lombok.Getter;
+import lombok.SneakyThrows;
+import lombok.experimental.Accessors;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -60,97 +63,26 @@
 @Slf4j
 public class EmailServiceDefault implements EmailService {
 
-    private static final long serialVersionUID = 1L;
-    public static class EmailServiceException extends RuntimeException {
-        static final long serialVersionUID = 1L;
-        public EmailServiceException(final Exception cause) {
-            super(cause);
-        }
-    }
-
-    @Inject private CausewayConfiguration configuration;
-
-    @Inject private Provider<JavaMailSender> emailSenderProvider;
-
-    // -- INIT
-
-    private boolean initialized;
-
-    /**
-     * Loads responsive email templates borrowed from http://zurb.com/ink/templates.php (Basic)
-     */
-    @Override
-    @PostConstruct
-    public void init() {
-
-        if (initialized) {
-            return;
-        }
-
-        initialized = true;
-
-        if (!isConfigured()) {
-            log.warn("NOT configured");
-        } else {
-            log.debug("configured");
-        }
-    }
-
-    protected String getSenderEmailUsername() {
-        return configuration.getCore().getRuntimeServices().getEmail().getSender().getUsername();
-    }
-
-    protected String getSenderEmailAddress() {
-        return configuration.getCore().getRuntimeServices().getEmail().getSender().getAddress();
-    }
-
-    protected String getSenderEmailPassword() {
-        return configuration.getCore().getRuntimeServices().getEmail().getSender().getPassword();
-    }
-
-    protected String getSenderEmailHostName() {
-        return configuration.getCore().getRuntimeServices().getEmail().getSender().getHostname();
-    }
-
-    protected Integer getSenderEmailPort() {
-        return configuration.getCore().getRuntimeServices().getEmail().getPort();
-    }
+    @Getter private final EmailConfiguration configuration;
+    private final Provider<JavaMailSender> emailSenderProvider;
 
-    protected Boolean getSenderEmailTlsEnabled() {
-        return configuration.getCore().getRuntimeServices().getEmail().getTls().isEnabled();
-    }
+    @Getter(onMethod_={@Override}) @Accessors(fluent=true)
+    private final boolean isConfigured;
 
-    protected boolean isThrowExceptionOnFail() {
-        return configuration.getCore().getRuntimeServices().getEmail().isThrowExceptionOnFail();
-    }
+    @Inject
+    public EmailServiceDefault(
+        EmailConfiguration configuration,
+        Provider<JavaMailSender> emailSenderProvider) {
 
-    protected int getSocketTimeout() {
-        return configuration.getCore().getRuntimeServices().getEmail().getSocketTimeout();
-    }
-
-    protected int getSocketConnectionTimeout() {
-        return configuration.getCore().getRuntimeServices().getEmail().getSocketConnectionTimeout();
-    }
+        this.configuration = configuration;
+        this.emailSenderProvider = emailSenderProvider;
 
-    protected String getEmailOverrideTo() {
-        return configuration.getCore().getRuntimeServices().getEmail().getOverride().getTo();
-    }
-
-    protected String getEmailOverrideCc() {
-        return configuration.getCore().getRuntimeServices().getEmail().getOverride().getCc();
-    }
-
-    protected String getEmailOverrideBcc() {
-        return configuration.getCore().getRuntimeServices().getEmail().getOverride().getBcc();
-    }
-
-    @Override
-    public boolean isConfigured() {
-        final String senderEmailAddress = getSenderEmailAddress();
-        final String senderEmailPassword = getSenderEmailPassword();
-        return !_Strings.isNullOrEmpty(senderEmailAddress) && !_Strings.isNullOrEmpty(senderEmailPassword);
+        this.isConfigured = StringUtils.hasLength(configuration.senderAddress())
+            && StringUtils.hasLength(configuration.senderPassword());
+        if (!isConfigured()) log.warn("NOT configured");
     }
 
+    @SneakyThrows
     @Override
     public boolean send(
             final List<String> toList,
@@ -161,13 +93,12 @@ public boolean send(
             final DataSource... attachments) {
 
         try {
-
             var javaMailSender = emailSenderProvider.get();
 
             var email = javaMailSender.createMimeMessage();
             var emailHelper = new MimeMessageHelper(email, true);
 
-            emailHelper.setFrom(getSenderEmailAddress());
+            emailHelper.setFrom(configuration.senderAddress());
 
             emailHelper.setSubject(subject);
             boolean html = true;
@@ -179,9 +110,9 @@ public boolean send(
                 }
             }
 
-            final String overrideToList = getEmailOverrideTo();
-            final String overrideCc = getEmailOverrideCc();
-            final String overrideBcc = getEmailOverrideBcc();
+            final String overrideToList = configuration.overrideTo();
+            final String overrideCc = configuration.overrideCc();
+            final String overrideBcc = configuration.overrideBcc();
 
             final String[] toListElseOverride = originalUnlessOverridden(toList, overrideToList);
             if (notEmpty(toListElseOverride)) {
@@ -200,10 +131,7 @@ public boolean send(
 
         } catch (MessagingException e) {
             log.error("An error occurred while trying to send an email", e);
-            final Boolean throwExceptionOnFail = isThrowExceptionOnFail();
-            if (throwExceptionOnFail) {
-                throw new EmailServiceException(e);
-            }
+            if (configuration.isThrowExceptionOnFail()) throw e;
             return false;
         }
 
diff --git a/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/delete/DeleteMessage.java b/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/delete/DeleteMessage.java
index 90eb1143985..31a2510030e 100644
--- a/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/delete/DeleteMessage.java
+++ b/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/delete/DeleteMessage.java
@@ -23,8 +23,6 @@ public record DeleteMessage(
         StringValue interactionId,
         IntValue sequence) {
 
-    @Deprecated public StringValue getInteractionId() { return interactionId(); }
-    @Deprecated public IntValue getSequence() { return sequence(); }
 
     public DeleteMessage(final String interactionId, final int sequence) {
         this(new StringValue(interactionId), new IntValue(sequence));
diff --git a/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/deleteMany/DeleteManyMessage.java b/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/deleteMany/DeleteManyMessage.java
index 9c03f3ff923..380d7735050 100644
--- a/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/deleteMany/DeleteManyMessage.java
+++ b/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/deleteMany/DeleteManyMessage.java
@@ -22,8 +22,6 @@
 
 public record DeleteManyMessage(StringValue interactionsDtoXml) {
 
-    @Deprecated public StringValue getInteractionsDtoXml() { return interactionsDtoXml(); }
-
     public DeleteManyMessage(final String interactionsDtoXml) {
         this(new StringValue(interactionsDtoXml));
     }
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/events/UserCreatedEvent.java b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/events/UserCreatedEvent.java
index eadb3dd1c4b..ec537d51041 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/events/UserCreatedEvent.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/events/UserCreatedEvent.java
@@ -44,11 +44,6 @@
  */
 public record UserCreatedEvent(@NonNull ApplicationUser user) {
 
-    /**
-     * @deprecated use {@link #user()} instead
-     */
-    @Deprecated public ApplicationUser getUser() { return user(); }
-
     // -- SHORTCUTS
 
     public AccountType getAccountType() {
diff --git a/extensions/vw/fullcalendar/wicket/integration/src/main/java/org/apache/causeway/extensions/fullcalendar/wkt/integration/fc/res/FullCalendarCssReference.java b/extensions/vw/fullcalendar/wicket/integration/src/main/java/org/apache/causeway/extensions/fullcalendar/wkt/integration/fc/res/FullCalendarCssReference.java
deleted file mode 100644
index 61e7a9fb3b1..00000000000
--- a/extensions/vw/fullcalendar/wicket/integration/src/main/java/org/apache/causeway/extensions/fullcalendar/wkt/integration/fc/res/FullCalendarCssReference.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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.
- */
-package org.apache.causeway.extensions.fullcalendar.wkt.integration.fc.res;
-
-import org.apache.wicket.markup.head.CssHeaderItem;
-import org.apache.wicket.markup.head.HeaderItem;
-
-import lombok.Getter;
-import lombok.experimental.Accessors;
-
-import de.agilecoders.wicket.webjars.request.resource.WebjarsCssResourceReference;
-
-@Deprecated // no longer available since fullcalendar 6.x
-public class FullCalendarCssReference
-extends WebjarsCssResourceReference {
-
-    private static final long serialVersionUID = 1L;
-
-    @Getter(lazy = true) @Accessors(fluent = true)
-    private static final FullCalendarCssReference instance =
-        new FullCalendarCssReference();
-
-    private FullCalendarCssReference() {
-        super("fullcalendar/6.1.10/index.global.min.css");
-    }
-
-    /**
-     * @return this resource reference singleton instance as header item
-     */
-    public static HeaderItem asHeaderItem() {
-        return CssHeaderItem.forReference(instance());
-    }
-
-}
diff --git a/extensions/vw/sse/applib/src/main/java/org/apache/causeway/extensions/sse/applib/service/SseChannel.java b/extensions/vw/sse/applib/src/main/java/org/apache/causeway/extensions/sse/applib/service/SseChannel.java
index e1bc017ae39..9337f62ef94 100644
--- a/extensions/vw/sse/applib/src/main/java/org/apache/causeway/extensions/sse/applib/service/SseChannel.java
+++ b/extensions/vw/sse/applib/src/main/java/org/apache/causeway/extensions/sse/applib/service/SseChannel.java
@@ -35,9 +35,6 @@ public interface SseChannel {
     UUID uuid();
     Class<?> sourceType();
 
-    @Deprecated default UUID getId() { return uuid(); }
-    @Deprecated default Class<?> getSourceType() { return sourceType(); }
-
     void listenWhile(Predicate<SseSource> listener);
 
     void fire(SseSource source);
diff --git a/extensions/vw/sse/wicket/src/main/java/org/apache/causeway/extensions/sse/wicket/services/SseServiceDefault.java b/extensions/vw/sse/wicket/src/main/java/org/apache/causeway/extensions/sse/wicket/services/SseServiceDefault.java
index 4a0755b3470..44beb7c1257 100644
--- a/extensions/vw/sse/wicket/src/main/java/org/apache/causeway/extensions/sse/wicket/services/SseServiceDefault.java
+++ b/extensions/vw/sse/wicket/src/main/java/org/apache/causeway/extensions/sse/wicket/services/SseServiceDefault.java
@@ -114,7 +114,7 @@ private void run(final SseSource task) {
         var eventStreamLifecycle = eventStreamPool.acquireLifecycleForType(sourceType);
         var eventStream = eventStreamLifecycle.getEventStream();
 
-        log.debug("submitting task type='{}' -> stream='{}'", sourceType, eventStream.getId());
+        log.debug("submitting task type='{}' -> stream='{}'", sourceType, eventStream.uuid());
 
         try {
 
@@ -174,7 +174,7 @@ public void release() {
             synchronized ($LOCK) {
                 remaining = --runningTasksCounter;
                 if(remaining<1) {
-                    eventStreamPool.eventStreamsByType.remove(eventStream.getSourceType());
+                    eventStreamPool.eventStreamsByType.remove(eventStream.sourceType());
                 }
             }
 
diff --git a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/repository/RepositoryServiceDefault.java b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/repository/RepositoryServiceDefault.java
index cc3a21ca011..c9a410ef820 100644
--- a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/repository/RepositoryServiceDefault.java
+++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/repository/RepositoryServiceDefault.java
@@ -93,8 +93,7 @@ public class RepositoryServiceDefault
     @PostConstruct
     public void init() {
         var disableAutoFlush =
-                causewayConfiguration.getPersistence().getCommons().getRepositoryService().isDisableAutoFlush() ||
-                causewayConfiguration.getCore().getRuntimeServices().getRepositoryService().isDisableAutoFlush();
+                causewayConfiguration.getPersistence().getCommons().getRepositoryService().isDisableAutoFlush();
         this.autoFlush = !disableAutoFlush;
     }
 
diff --git a/persistence/jpa/eclipselink/src/main/java/org/apache/causeway/persistence/jpa/eclipselink/inject/_Util.java b/persistence/jpa/eclipselink/src/main/java/org/apache/causeway/persistence/jpa/eclipselink/inject/_Util.java
index 4f506f6ad74..74af28b4d17 100644
--- a/persistence/jpa/eclipselink/src/main/java/org/apache/causeway/persistence/jpa/eclipselink/inject/_Util.java
+++ b/persistence/jpa/eclipselink/src/main/java/org/apache/causeway/persistence/jpa/eclipselink/inject/_Util.java
@@ -69,50 +69,42 @@ public Class<T> getJavaClass() {
 
             @Override
             public Type getBaseType() {
-                _Exceptions.throwNotImplemented();
-                return null;
+                throw _Exceptions.notImplemented();
             }
 
             @Override
             public Set<Type> getTypeClosure() {
-                _Exceptions.throwNotImplemented();
-                return null;
+                throw _Exceptions.notImplemented();
             }
 
             @Override
             public <X extends Annotation> X getAnnotation(final Class<X> annotationType) {
-                _Exceptions.throwNotImplemented();
-                return null;
+                throw _Exceptions.notImplemented();
             }
 
             @Override
             public Set<Annotation> getAnnotations() {
-                _Exceptions.throwNotImplemented();
-                return null;
+                throw _Exceptions.notImplemented();
             }
 
             @Override
             public boolean isAnnotationPresent(final Class<? extends Annotation> annotationType) {
-                _Exceptions.throwNotImplemented();
-                return false;
+                throw _Exceptions.notImplemented();
             }
 
             @Override
             public Set<AnnotatedConstructor<T>> getConstructors() {
-                _Exceptions.throwNotImplemented();
-                return null;
+                throw _Exceptions.notImplemented();
             }
 
             @Override
             public Set<AnnotatedMethod<? super T>> getMethods() {
-                _Exceptions.throwNotImplemented();
-                return null;
+                throw _Exceptions.notImplemented();
             }
 
             @Override
             public Set<AnnotatedField<? super T>> getFields() {
-                _Exceptions.throwNotImplemented();
-                return null;
+                throw _Exceptions.notImplemented();
             }
         };
     }
diff --git a/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/_JpaEntityStateUtil.java b/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/_JpaEntityStateUtil.java
index 1131bc8b4f4..490b5800f14 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/_JpaEntityStateUtil.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/_JpaEntityStateUtil.java
@@ -88,49 +88,4 @@ EntityState getEntityState(
                 : EntityState.TRANSIENT_OR_REMOVED;
     }
 
-    @Deprecated
-    EntityState getEntityStateLegacy(
-            final EntityManager entityManager,
-            final PersistenceUnitUtil persistenceUnitUtil,
-            final Class<?> entityClass,
-            final PrimaryKeyType<?> primaryKeyType,
-            final Object pojo) {
-        if (entityManager.contains(pojo)) {
-            var primaryKey = persistenceUnitUtil.getIdentifier(pojo);
-            if (primaryKey == null) {
-                return EntityState.ATTACHED_NO_OID;
-            }
-            return EntityState.ATTACHED;
-        }
-
-        try {
-            var primaryKey = persistenceUnitUtil.getIdentifier(pojo);
-            if (primaryKey == null) {
-                return EntityState.TRANSIENT_OR_REMOVED;
-            } else {
-                // detect shallow primary key
-                //TODO this is a hack - see whether we can actually ask the EntityManager to give us an accurate answer
-                return primaryKeyType.isValid(primaryKey)
-                    ? EntityState.DETACHED
-                    : EntityState.TRANSIENT_OR_REMOVED;
-            }
-        } catch (PersistenceException ex) {
-            /* horrible hack, but encountered NPEs if using a composite key (eg CommandLogEntry)
-                (this was without any weaving) */
-            Throwable cause = ex.getCause();
-            if (cause instanceof DescriptorException) {
-                DescriptorException descriptorException = (DescriptorException) cause;
-                Throwable internalException = descriptorException.getInternalException();
-                if (internalException instanceof NullPointerException) {
-                    return EntityState.TRANSIENT_OR_REMOVED;
-                }
-            }
-            if (cause instanceof NullPointerException) {
-                // horrible hack, encountered if using composite key (eg ExecutionLogEntry) with dynamic weaving
-                return EntityState.TRANSIENT_OR_REMOVED;
-            }
-            throw ex;
-        }
-    }
-
 }
diff --git a/regressiontests/viewers-jpa/src/test/java/org/apache/causeway/testdomain/viewers/jpa/wkt/InteractionTestJpaWkt.java b/regressiontests/viewers-jpa/src/test/java/org/apache/causeway/testdomain/viewers/jpa/wkt/InteractionTestJpaWkt.java
index 502f68a7331..90e642ed70a 100644
--- a/regressiontests/viewers-jpa/src/test/java/org/apache/causeway/testdomain/viewers/jpa/wkt/InteractionTestJpaWkt.java
+++ b/regressiontests/viewers-jpa/src/test/java/org/apache/causeway/testdomain/viewers/jpa/wkt/InteractionTestJpaWkt.java
@@ -208,7 +208,7 @@ void loadBookPage_Dune_then_change_Isbn() {
 
         //System.err.printf("pageParameters %s%n", pageParameters);
 
-        assertEquals(ManagedObject.Specialization.ENTITY, bookAdapter.getSpecialization());
+        assertEquals(ManagedObject.Specialization.ENTITY, bookAdapter.specialization());
         assertTrue(bookAdapter.isBookmarkMemoized(), "bookAdapter should be bookmarked");
 
         // open Dune page
diff --git a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/basic/BasicCreds.java b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/basic/BasicCreds.java
index 9efa49e4fb4..9cfd6300389 100644
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/basic/BasicCreds.java
+++ b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/basic/BasicCreds.java
@@ -24,7 +24,4 @@
 public record BasicCreds(
         String username,
         String password) {
-
-    @Deprecated public String getUsername() { return username(); }
-    @Deprecated public String getPassword() { return password(); }
 }
diff --git a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/oauth2/Oauth2Creds.java b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/oauth2/Oauth2Creds.java
index 11a9b3e8055..4297b48c737 100644
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/oauth2/Oauth2Creds.java
+++ b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/auth/oauth2/Oauth2Creds.java
@@ -25,9 +25,4 @@ public record Oauth2Creds(
         String tenantId,
         String clientId,
         String clientSecret) {
-
-    @Deprecated public String getTenantId() { return tenantId(); }
-    @Deprecated public String getClientId() { return clientId(); }
-    @Deprecated public String getClientSecret() { return clientSecret(); }
-
 }
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/_JsonValueConverters.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/_JsonValueConverters.java
index d55b888e960..99f22fc89e9 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/_JsonValueConverters.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/_JsonValueConverters.java
@@ -51,12 +51,6 @@ enum DefaultFormat {
         BIGINTEGER(BigInteger.class, "big-integer(18)", "javamathbiginteger"),
         @Deprecated //should be covered 100% per {@link ValueSemanticsProvider}
         BIGDECIMAL(BigDecimal.class, "big-decimal", "javamathbigdecimal"),
-//        @Deprecated //should be covered 100% per {@link ValueSemanticsProvider}
-//        JODALOCALDATE(LocalDate.class, "date", "jodalocaldate"),
-//        @Deprecated //should be covered 100% per {@link ValueSemanticsProvider}
-//        JODALOCALDATETIME(LocalDateTime.class, "date-time", "jodalocaldatetime"),
-//        @Deprecated //should be covered 100% per {@link ValueSemanticsProvider}
-//        JODADATETIME(DateTime.class, "date-time", "jodadatetime"),
         @Deprecated //should be covered 100% per {@link ValueSemanticsProvider}
         JAVAUTILDATE(java.util.Date.class, "date-time", "javautildate"),
         @Deprecated //should be covered 100% per {@link ValueSemanticsProvider}
diff --git a/viewers/wicket/ui-test/src/test/java/org/apache/causeway/viewer/wicket/ui/test/components/scalars/jdkmath/BigDecimalConverterTest.java b/viewers/wicket/ui-test/src/test/java/org/apache/causeway/viewer/wicket/ui/test/components/scalars/jdkmath/BigDecimalConverterTest.java
index fa4b94b4485..04cdcfb7446 100644
--- a/viewers/wicket/ui-test/src/test/java/org/apache/causeway/viewer/wicket/ui/test/components/scalars/jdkmath/BigDecimalConverterTest.java
+++ b/viewers/wicket/ui-test/src/test/java/org/apache/causeway/viewer/wicket/ui/test/components/scalars/jdkmath/BigDecimalConverterTest.java
@@ -91,7 +91,8 @@ void scale2_italian() {
 
     @Test
     void scale2_english_withThousandSeparators_not_allowed() {
-        assertThat(converterTester.getConfigurationForBigDecimalValueType().isUseGroupingSeparator()).isFalse();
+        converterTester.getConfigurationForBigDecimalValueType().getDisplay().setUseGroupingSeparator(false);
+        assertThat(converterTester.getConfigurationForBigDecimalValueType().getDisplay().isUseGroupingSeparator()).isFalse();
 
         converterTester.setScenario(Locale.ENGLISH, newConverter(CustomerScale2.class));
         converterTester.assertConversionFailure("789,123.45", "Invalid value '789,123.45'; do not use the ',' grouping separator");
@@ -99,8 +100,8 @@ void scale2_english_withThousandSeparators_not_allowed() {
 
     @Test
     void scale2_english_withThousandSeparators_allowed() {
-        converterTester.getConfigurationForBigDecimalValueType().setUseGroupingSeparator(true);
-        assertThat(converterTester.getConfigurationForBigDecimalValueType().isUseGroupingSeparator()).isTrue();
+        converterTester.getConfigurationForBigDecimalValueType().getDisplay().setUseGroupingSeparator(true);
+        assertThat(converterTester.getConfigurationForBigDecimalValueType().getDisplay().isUseGroupingSeparator()).isTrue();
 
         converterTester.setScenario(Locale.ENGLISH, newConverter(CustomerScale2.class));
         converterTester.assertRoundtrip(bd_789123_45_scale2, "789123.45");