This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch spring6 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit f4ec5c8b7b0c0b6d2f7fd610e836dca2466281ac Merge: 4388b827a9 6ebd2b91c2 Author: Andi Huber <[email protected]> AuthorDate: Thu Sep 28 10:01:31 2023 +0200 Merge remote-tracking branch 'origin/master' into spring6 .../index/services/repository/EntityState.adoc | 5 +- .../causeway/applib/services/command/Command.java | 22 +-- .../applib/services/repository/EntityState.java | 5 +- .../applib/util/schema/CommonDtoUtils.java | 11 +- .../value/semantics/ValueSemanticsAbstract.java | 2 +- .../core/config/CausewayConfiguration.java | 99 +++++++++++--- .../core/config/DatanucleusConfiguration.java | 4 +- .../core/config/util/ValueMaskingUtil.java | 2 +- .../core/metamodel/facets/DomainEventHelper.java | 3 +- .../ValueSemanticsAnnotationFacetFactory.java | 7 +- .../managed/ParameterNegotiationModel.java | 7 +- .../core/metamodel/spec/feature/ObjectAction.java | 17 ++- .../spec/feature/ObjectActionParameter.java | 37 ++++-- .../specloader/specimpl/ObjectActionDefault.java | 10 +- .../specloader/specimpl/ObjectMemberAbstract.java | 2 +- .../valuesemantics/BigDecimalValueSemantics.java | 21 ++- ...ionParameterAbstractTest_getId_and_getName.java | 2 +- ...anticsProvider_configureDecimalFormat_Test.java | 147 +++++++++++++++++++++ .../command/CommandDtoFactoryDefault.java | 13 +- .../command/CommandExecutorServiceDefault.java | 10 +- .../EntityPropertyChangePublisherDefault.java | 3 + .../session/InteractionServiceDefault.java | 20 ++- .../applib/job/RunBackgroundCommandsJob.java | 25 ++++ .../BackgroundService_IntegTestAbstract.java | 4 - .../commons/CausewayModulePersistenceCommons.java | 3 +- .../changetracking/EntityChangeTrackerDefault.java | 7 +- .../PreAndPostValueEvaluatorService.java} | 27 ++-- .../PreAndPostValueEvaluatorServiceDefault.java | 49 +++++++ .../CausewayModulePersistenceJdoDatanucleus.java | 3 + .../PreAndPostValueEvaluatorServiceJdo.java | 99 ++++++++++++++ ...DecimalFromJdoColumnAnnotationFacetFactory.java | 2 +- ...DecimalFromJpaColumnAnnotationFacetFactory.java | 2 +- .../stubs/CommandPublishingTestAbstract.java | 4 +- .../applib/domaintypes/DomainTypeResource.java | 4 +- .../ActionParameterDescriptionReprRenderer.java | 22 ++- .../domaintypes/DomainTypeReprRenderer.java | 4 +- ...entNegotiationServiceForRestfulObjectsV1_0.java | 3 +- .../swagger/internal/_OpenApiModelFactory.java | 3 + .../viewer/context/ResourceContext.java | 11 +- .../resources/DomainTypeResourceServerside.java | 24 ++-- .../viewer/resources/ObjectActionArgHelper.java | 2 +- .../bootstrap/css/bootstrap-overrides-all-v2.css | 7 +- .../js/causeway-jquery-wicket-viewer.nocompress.js | 11 +- 43 files changed, 589 insertions(+), 176 deletions(-) diff --cc core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactory.java index b39234403c,0c92ddf786..6f06a98ad5 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactory.java @@@ -20,6 -20,9 +20,9 @@@ package org.apache.causeway.core.metamo import java.util.Optional; -import javax.inject.Inject; -import javax.validation.constraints.Digits; ++import jakarta.inject.Inject; ++import jakarta.validation.constraints.Digits; + import org.apache.causeway.applib.annotation.ValueSemantics; import org.apache.causeway.core.metamodel.context.MetaModelContext; import org.apache.causeway.core.metamodel.facetapi.FeatureType; @@@ -122,8 -123,8 +123,8 @@@ extends FacetFactoryAbstract MinFractionalDigitsFacetAbstract.minimum( MinFractionalDigitsFacetFromValueSemanticsAnnotation .create(valueSemanticsIfAny, facetHolder), - // support for @javax.validation.constraints.Digits (if supported) + // support for @jakarta.validation.constraints.Digits (if supported) - getConfiguration().getCore().getMetaModel().getProgrammingModel().isUseScaleForMinFractionalFacet() + getConfiguration().getValueTypes().getBigDecimal().isUseScaleForMinFractionalFacet() ? MinFractionalDigitsFacetFromJavaxValidationDigitsAnnotation .create(digitsIfAny, facetHolder) : Optional.empty() diff --cc core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java index 2fab949b74,628ad9bf79..15ef1c9610 --- 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 @@@ -20,12 -20,16 +20,16 @@@ package org.apache.causeway.core.metamo import java.math.BigDecimal; import java.text.DecimalFormat; + import java.util.Optional; + import java.util.OptionalInt; import java.util.function.UnaryOperator; -import javax.annotation.Priority; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.Priority; +import jakarta.inject.Inject; +import jakarta.inject.Named; + import org.apache.causeway.core.config.CausewayConfiguration; + import org.springframework.stereotype.Component; import org.apache.causeway.applib.annotation.PriorityPrecedence; diff --cc core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/publish/EntityPropertyChangePublisherDefault.java index 484049fafe,cd77ffc77c..dd86acaceb --- a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/publish/EntityPropertyChangePublisherDefault.java +++ b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/publish/EntityPropertyChangePublisherDefault.java @@@ -20,12 -20,14 +20,14 @@@ package org.apache.causeway.core.runtim import java.util.List; -import javax.annotation.PostConstruct; -import javax.annotation.Priority; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Priority; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.inject.Provider; + import org.apache.causeway.applib.services.iactnlayer.InteractionService; + import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; diff --cc extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/job/RunBackgroundCommandsJob.java index df9d3d1a93,ed55916c44..c3c214baba --- a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/job/RunBackgroundCommandsJob.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/job/RunBackgroundCommandsJob.java @@@ -23,8 -23,10 +23,10 @@@ import java.util.Optional import java.util.UUID; import java.util.stream.Collectors; -import javax.inject.Inject; +import jakarta.inject.Inject; + import org.apache.causeway.applib.annotation.Programmatic; + import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; diff --cc persistence/commons/src/main/java/org/apache/causeway/persistence/jpa/integration/changetracking/PreAndPostValueEvaluatorServiceDefault.java index 0000000000,5b6274ca78..5a3df04dee mode 000000,100644..100644 --- a/persistence/commons/src/main/java/org/apache/causeway/persistence/jpa/integration/changetracking/PreAndPostValueEvaluatorServiceDefault.java +++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/jpa/integration/changetracking/PreAndPostValueEvaluatorServiceDefault.java @@@ -1,0 -1,49 +1,49 @@@ + /* + * 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.persistence.jpa.integration.changetracking; + -import javax.annotation.Priority; -import javax.inject.Inject; -import javax.inject.Named; ++import jakarta.annotation.Priority; ++import jakarta.inject.Inject; ++import jakarta.inject.Named; + + import org.springframework.beans.factory.annotation.Qualifier; + import org.springframework.stereotype.Service; + + import org.apache.causeway.applib.annotation.InteractionScope; + import org.apache.causeway.applib.annotation.PriorityPrecedence; + import org.apache.causeway.core.metamodel.services.objectlifecycle.PreAndPostValue; + + import lombok.RequiredArgsConstructor; + import lombok.extern.log4j.Log4j2; + + @Service + @Named("causeway.persistence.commons.PreAndPostValueEvaluatorServiceDefault") + @Priority(PriorityPrecedence.LATE) + @Qualifier("default") + @InteractionScope // see note above regarding this + @RequiredArgsConstructor(onConstructor_ = {@Inject}) + @Log4j2 + public class PreAndPostValueEvaluatorServiceDefault implements PreAndPostValueEvaluatorService { + + @Override + public boolean differ(PreAndPostValue preAndPostValue) { + return preAndPostValue.shouldPublish(); + } + } diff --cc persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/changetracking/PreAndPostValueEvaluatorServiceJdo.java index 0000000000,48509818b4..d46a4697d4 mode 000000,100644..100644 --- a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/changetracking/PreAndPostValueEvaluatorServiceJdo.java +++ b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/changetracking/PreAndPostValueEvaluatorServiceJdo.java @@@ -1,0 -1,99 +1,99 @@@ + /* + * 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.persistence.jdo.datanucleus.changetracking; + + import java.util.Objects; + import java.util.Optional; + -import javax.annotation.Priority; -import javax.inject.Inject; -import javax.inject.Named; ++import jakarta.annotation.Priority; ++import jakarta.inject.Inject; ++import jakarta.inject.Named; + + import org.datanucleus.enhancement.Persistable; + + import org.springframework.beans.factory.annotation.Qualifier; + import org.springframework.stereotype.Service; + + import org.apache.causeway.applib.annotation.InteractionScope; + import org.apache.causeway.applib.annotation.PriorityPrecedence; + import org.apache.causeway.core.metamodel.services.objectlifecycle.PreAndPostValue; + import org.apache.causeway.core.metamodel.services.objectlifecycle.PropertyValuePlaceholder; + import org.apache.causeway.persistence.jdo.datanucleus.entities.DnOidStoreAndRecoverHelper; + import org.apache.causeway.persistence.jpa.integration.changetracking.PreAndPostValueEvaluatorService; + + import lombok.RequiredArgsConstructor; + import lombok.extern.log4j.Log4j2; + + @Service + @Named("causeway.persistence.jdo.PreAndPostValueEvaluatorServiceJdo") + @Priority(PriorityPrecedence.MIDPOINT) // before the default + @Qualifier("jdo") + @InteractionScope // see note above regarding this + @RequiredArgsConstructor(onConstructor_ = {@Inject}) + @Log4j2 + public class PreAndPostValueEvaluatorServiceJdo implements PreAndPostValueEvaluatorService { + + @Override + public boolean differ(PreAndPostValue papv) { + + // don't audit objects that were created and then immediately deleted within the same xactn + if (papv.getPre() == PropertyValuePlaceholder.NEW + && papv.getPost() == PropertyValuePlaceholder.DELETED) { + return false; + } + // but do always audit objects that have just been created or deleted + if (papv.getPre() == PropertyValuePlaceholder.NEW + || papv.getPost() == PropertyValuePlaceholder.DELETED) { + return true; + } + if (papv.getPre() instanceof Persistable) { + Persistable prePersistable = (Persistable) papv.getPre(); + + if (!(papv.getPost() instanceof Persistable)) { + // must be different, so publish + return true; + } + Persistable postPersistable = ((Persistable) papv.getPost()); + + Optional<String> preOidIfAny = DnOidStoreAndRecoverHelper.forEntity(prePersistable).recoverOid(); + Optional<String> postOidIfAny = DnOidStoreAndRecoverHelper.forEntity(postPersistable).recoverOid(); + + if (preOidIfAny.isPresent() || postOidIfAny.isPresent()) { + // at least one of the Persistables is hollow + return !Objects.equals(preOidIfAny, postOidIfAny); + } + + // neither of the Persistables is hollow; should be safe to fall through. + + } else { + + if (papv.getPost() instanceof Persistable) { + // must be different, so publish + return true; + } + + // should be safe to fall through. + } + + // else - for updated objects - audit only if the property value has changed + return !Objects.equals(papv.getPre(), papv.getPost()); + } + + }
