diff --git a/api/applib/src/main/java/org/apache/causeway/applib/services/appfeat/ApplicationFeatureFilter.java b/api/applib/src/main/java/org/apache/causeway/applib/services/appfeat/ApplicationFeatureFilter.java
new file mode 100644
index 00000000000..7a055cdd650
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/causeway/applib/services/appfeat/ApplicationFeatureFilter.java
@@ -0,0 +1,41 @@
+/*
+ * 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.appfeat;
+
+/**
+ * The various viewer implementations will individually honor any filters registered with Spring,
+ * based on a matching qualifier ('Graphql', 'Restful', etc.).
+ *
+ *
All filters that match a qualifier are consulted until any one rejects the {@link ApplicationFeature}.
+ *
+ *
If no filters match a qualifier, any {@link ApplicationFeature} is accepted.
+ *
+ *
'NoViewer' is a reserved string internally used to mean 'no filtering', hence it should not be used to qualify a filter.
+ *
+ * @since 4.0 {@index}
+ */
+@FunctionalInterface
+public interface ApplicationFeatureFilter {
+
+ /**
+ * Whether to include given {@link ApplicationFeature}.
+ */
+ boolean filter(ApplicationFeature feature);
+
+}
diff --git a/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/control/SyncControl.java b/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/control/SyncControl.java
index cb2896057fa..bd21a063650 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/control/SyncControl.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/control/SyncControl.java
@@ -20,8 +20,9 @@
import java.util.UUID;
-import org.jspecify.annotations.Nullable;
+import org.springframework.util.StringUtils;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.iactnlayer.InteractionContext;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.schema.cmd.v2.CommandDto;
@@ -31,7 +32,7 @@
/**
* Controls the way that a (synchronous) wrapper works.
*
- * @since 2.0 revised for 3.4 {@index}
+ * @since 2.0 revised for 3.4 and 4.0 {@index}
*/
public record SyncControl(
/**
@@ -50,7 +51,12 @@ public record SyncControl(
*
*
The default behaviour is to rethrow the exception.
*/
- ExceptionHandler exceptionHandler) {
+ ExceptionHandler exceptionHandler,
+ /**
+ * Simulated viewerId, honoring feature filtering.
+ */
+ String viewerId,
+ Where where) {
//TODO can this be further simplified, or is there already an API we can reuse?
@@ -79,22 +85,22 @@ public void onCommand(
}
public static SyncControl defaults() {
- return new SyncControl(false, false, null, null);
+ return new SyncControl(false, false, null, null, null, null);
}
- public SyncControl(
- boolean isSkipRules,
- boolean isSkipExecute,
- @Nullable Can commandListeners,
- @Nullable ExceptionHandler exceptionHandler) {
- this.isSkipRules = isSkipRules;
- this.isSkipExecute = isSkipExecute;
- this.commandListeners = commandListeners!=null
- ? commandListeners
- : Can.empty();
- this.exceptionHandler = exceptionHandler!=null
- ? exceptionHandler
- : exception -> { throw exception; };
+ public SyncControl {
+ commandListeners = commandListeners!=null
+ ? commandListeners
+ : Can.empty();
+ exceptionHandler = exceptionHandler!=null
+ ? exceptionHandler
+ : exception -> { throw exception; };
+ viewerId = StringUtils.hasText(viewerId)
+ ? viewerId
+ : "NoViewer";
+ where = where!=null
+ ? where
+ : Where.ANYWHERE;
}
/**
@@ -102,27 +108,27 @@ public SyncControl(
* executing the underlying property or action
*/
public SyncControl withSkipRules() {
- return new SyncControl(true, isSkipExecute, commandListeners, exceptionHandler);
+ return new SyncControl(true, isSkipExecute, commandListeners, exceptionHandler, viewerId, where);
}
public SyncControl withCheckRules() {
- return new SyncControl(false, isSkipExecute, commandListeners, exceptionHandler);
+ return new SyncControl(false, isSkipExecute, commandListeners, exceptionHandler, viewerId, where);
}
/**
* Explicitly set the action to be executed.
*/
public SyncControl withExecute() {
- return new SyncControl(isSkipRules, false, commandListeners, exceptionHandler);
+ return new SyncControl(isSkipRules, false, commandListeners, exceptionHandler, viewerId, where);
}
/**
* Explicitly set the action to not be executed, in other words a 'dry run'.
*/
public SyncControl withNoExecute() {
- return new SyncControl(isSkipRules, true, commandListeners, exceptionHandler);
+ return new SyncControl(isSkipRules, true, commandListeners, exceptionHandler, viewerId, where);
}
- public SyncControl listen(@NonNull CommandListener commandListener) {
- return new SyncControl(isSkipRules, isSkipExecute, commandListeners.add(commandListener), exceptionHandler);
+ public SyncControl listen(@NonNull final CommandListener commandListener) {
+ return new SyncControl(isSkipRules, isSkipExecute, commandListeners.add(commandListener), exceptionHandler, viewerId, where);
}
/**
@@ -131,13 +137,21 @@ public SyncControl listen(@NonNull CommandListener commandListener) {
* The default behaviour is to rethrow the exception.
*/
public SyncControl withExceptionHandler(final @NonNull ExceptionHandler exceptionHandler) {
- return new SyncControl(isSkipRules, isSkipExecute, commandListeners, exceptionHandler);
+ return new SyncControl(isSkipRules, isSkipExecute, commandListeners, exceptionHandler, viewerId, where);
+ }
+
+ public SyncControl withViewerId(final String viewerId) {
+ return new SyncControl(isSkipRules, isSkipExecute, commandListeners, exceptionHandler, viewerId, where);
+ }
+
+ public SyncControl withWhere(final Where where) {
+ return new SyncControl(isSkipRules, isSkipExecute, commandListeners, exceptionHandler, viewerId, where);
}
/**
* @return whether this and other share the same execution mode, ignoring exceptionHandling
*/
- public boolean isEquivalent(SyncControl other) {
+ public boolean isEquivalent(final SyncControl other) {
return this.isSkipExecute == other.isSkipExecute
&& this.isSkipRules == other.isSkipRules;
}
diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/SpringContextHolder.java b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/SpringContextHolder.java
index edae73de62a..d1c14fa31e3 100644
--- a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/SpringContextHolder.java
+++ b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/SpringContextHolder.java
@@ -105,7 +105,6 @@ public Optional get(final @NonNull Class requiredType) {
* @see #select(Class, Annotation[])
* @see #getSingletonElseFail(Class)
*/
- @SuppressWarnings("javadoc")
public Can select(final @NonNull Class requiredType) {
var allMatchingBeans = springContext.getBeanProvider(requiredType)
.orderedStream()
@@ -128,7 +127,6 @@ public Can select(final @NonNull Class requiredType) {
*
* @see #select(Class)
*/
- @SuppressWarnings("javadoc")
public Can select(
final @NonNull Class requiredType,
final @Nullable Annotation[] qualifiers) {
@@ -165,7 +163,6 @@ public Can select(
* @return IoC managed singleton
* @throws NoSuchElementException - if the singleton is not resolvable
*/
- @SuppressWarnings("javadoc")
public T getSingletonElseFail(final @NonNull Class type) {
var candidates = select(type);
if (candidates.getCardinality() == Cardinality.ZERO) {
diff --git a/commons/src/main/java/org/apache/causeway/commons/io/JaxbUtils.java b/commons/src/main/java/org/apache/causeway/commons/io/JaxbUtils.java
index f8726d3f1d0..ce6c8310f48 100644
--- a/commons/src/main/java/org/apache/causeway/commons/io/JaxbUtils.java
+++ b/commons/src/main/java/org/apache/causeway/commons/io/JaxbUtils.java
@@ -24,7 +24,6 @@
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collections;
-import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
diff --git a/commons/src/test/java/org/apache/causeway/commons/net/DataUriTest.java b/commons/src/test/java/org/apache/causeway/commons/net/DataUriTest.java
index 3fd6f9b17ef..4bfba4e4eec 100644
--- a/commons/src/test/java/org/apache/causeway/commons/net/DataUriTest.java
+++ b/commons/src/test/java/org/apache/causeway/commons/net/DataUriTest.java
@@ -27,8 +27,6 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
-import org.apache.causeway.commons.net.DataUri;
-
import lombok.RequiredArgsConstructor;
class DataUriTest {
diff --git a/core/interaction/src/main/java/module-info.java b/core/interaction/src/main/java/module-info.java
index 0f71704d9c1..ecf9de42631 100644
--- a/core/interaction/src/main/java/module-info.java
+++ b/core/interaction/src/main/java/module-info.java
@@ -18,6 +18,7 @@
*/
module org.apache.causeway.core.interaction {
exports org.apache.causeway.core.interaction;
+ exports org.apache.causeway.core.interaction.core;
exports org.apache.causeway.core.interaction.scope;
exports org.apache.causeway.core.interaction.session;
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacet.java b/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/AccessRestriction.java
similarity index 76%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacet.java
rename to core/interaction/src/main/java/org/apache/causeway/core/interaction/core/AccessRestriction.java
index f05d8e798ed..43b8f3ef348 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacet.java
+++ b/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/AccessRestriction.java
@@ -16,8 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.causeway.core.metamodel.facets.object.hidden;
+package org.apache.causeway.core.interaction.core;
-public interface HiddenTypeFacet extends HiddenInstanceFacet {
+import java.util.Optional;
+import org.apache.causeway.core.metamodel.consent.Consent;
+
+public record AccessRestriction(
+ boolean canView,
+ boolean canEdit,
+ Optional vetoReasonOpt
+ ) {
}
+
diff --git a/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/ApplicationFeatureFilters.java b/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/ApplicationFeatureFilters.java
new file mode 100644
index 00000000000..7bf7f815473
--- /dev/null
+++ b/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/ApplicationFeatureFilters.java
@@ -0,0 +1,85 @@
+/*
+ * 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.core.interaction.core;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import org.jspecify.annotations.Nullable;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.util.StringUtils;
+
+import org.apache.causeway.applib.services.appfeat.ApplicationFeatureFilter;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.base._NullSafe;
+import org.apache.causeway.commons.internal.collections._Multimaps;
+
+record ApplicationFeatureFilters(
+ Can unqualifiedFilters,
+ Map> filtersByQualifier) {
+
+ // -- FACTORIES
+
+ static ApplicationFeatureFilters empty() {
+ return new ApplicationFeatureFilters(Can.empty(), Collections.emptyMap());
+ }
+
+ static ApplicationFeatureFilters collectFrom(final @Nullable ApplicationContext springContext) {
+ if(springContext==null)
+ //JUnit Support
+ return ApplicationFeatureFilters.empty();
+
+ var unqualifiedFilters = new ArrayList();
+ var filtersByQualifier = _Multimaps.newListMultimap();
+
+ Stream.of(springContext.getBeanNamesForType(ApplicationFeatureFilter.class))
+ .forEach(beanName->{
+ var filterBean = springContext.getBean(beanName, ApplicationFeatureFilter.class);
+ @SuppressWarnings("deprecation")
+ Set qualifiers = AnnotationUtils.getRepeatableAnnotations(filterBean.getClass(), Qualifier.class);
+ if(!_NullSafe.isEmpty(qualifiers)) {
+ qualifiers.forEach(qualifier->{
+ if(StringUtils.hasText(qualifier.value())) {
+ filtersByQualifier.putElement(qualifier.value(), filterBean);
+ } else {
+ unqualifiedFilters.add(filterBean);
+ }
+ });
+ } else {
+ unqualifiedFilters.add(filterBean);
+ }
+ });
+
+ // Sanitize (no duplicates, when already in unqualified Can) and make immutable
+ var unqualifiedFiltersCanned = Can.ofCollection(unqualifiedFilters).distinct();
+ var filtersByQualifierCanned = new HashMap>();
+ filtersByQualifier.forEach((k, v)->filtersByQualifierCanned.put(k, Can.ofCollection(v).distinct().filter(it->!unqualifiedFiltersCanned.contains(it))));
+ return new ApplicationFeatureFilters(
+ unqualifiedFiltersCanned,
+ Collections.unmodifiableMap(filtersByQualifierCanned));
+ }
+
+}
diff --git a/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/InteractionConstraint.java b/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/InteractionConstraint.java
new file mode 100644
index 00000000000..6d7fc44a0d7
--- /dev/null
+++ b/core/interaction/src/main/java/org/apache/causeway/core/interaction/core/InteractionConstraint.java
@@ -0,0 +1,44 @@
+/*
+ * 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.core.interaction.core;
+
+import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
+
+public record InteractionConstraint(
+ WhatViewer whatViewer,
+ InteractionInitiatedBy initiatedBy,
+ Where where
+ ) {
+
+ public InteractionConstraint withWhere(final Where where) {
+ return new InteractionConstraint(whatViewer, initiatedBy, where);
+ }
+
+ public InteractionConstraint withInitiatedBy(final InteractionInitiatedBy initiatedBy) {
+ return new InteractionConstraint(whatViewer, initiatedBy, where);
+ }
+
+ public VisibilityConstraint asVisibilityConstraint() {
+ return new VisibilityConstraint(whatViewer, where);
+ }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/Consent.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/Consent.java
index fbb95181e90..7eee4f7c807 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/Consent.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/Consent.java
@@ -114,15 +114,15 @@ public Optional toOptional() {
/**
* {@code Pi}: origin=PROGRAMMING_MODEL, nature=implicit (NO_ICON_UNLESS_PROTOTYPING)
* {@code Pe}: origin=PROGRAMMING_MODEL, nature=explicit (SHOW_BAN_ICON)
- * {@code S(e)}: origin=SECURITY, nature=explicit (SHOW_BAN_ICON)
+ * {@code Se}: origin=SECURITY, nature=explicit (SHOW_BAN_ICON)
*
* {@code Pi ৹ Pi := pick any or concat}
* {@code Pe ৹ Pe := pick any or concat}
- * {@code S(e) ৹ S(e) := pick any or concat}
+ * {@code Se ৹ Se := pick any or concat}
*
* {@code Pi ৹ Pe := Pe}
- * {@code Pi ৹ S(e) := Pi}
- * {@code Pe ৹ S(e) := Pe}
+ * {@code Pi ৹ Se := Pi}
+ * {@code Pe ৹ Se := Pe}
* In other words: winner picking is driven by origin first and nature second.
*/
public VetoReason reduce(final VetoReason other) {
@@ -187,8 +187,8 @@ public static VetoReason delegatedTo(final @NonNull Class extends ImmutableFac
/**
* Optionally the {@link VetoReason}, why consent is being vetoed, based on whether not allowed.
- *
- * Will correspond to the {@link InteractionResult#getReason() reason} in
+ *
+ *
Will correspond to the {@link InteractionResult#getReason() reason} in
* the contained {@link #getInteractionResult() InteractionResult} (if one
* was specified).
*/
@@ -204,8 +204,7 @@ default Optional getReasonAsString() {
/**
* Description of the interaction that this consent represents.
*
- *
- * May be null.
+ *
May be null.
*/
String getDescription();
@@ -222,7 +221,6 @@ default Optional getReasonAsString() {
* The {@link InteractionResult} that created this {@link Consent}.
*
* @return - may be null if created as a legacy {@link Consent}.
- *
*/
public InteractionResult getInteractionResult();
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/InteractionAdvisor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/InteractionAdvisor.java
index 875c2634771..f5ddfdf5826 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/InteractionAdvisor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/consent/InteractionAdvisor.java
@@ -18,13 +18,7 @@
*/
package org.apache.causeway.core.metamodel.consent;
-import java.util.function.BiConsumer;
-
import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.interactions.InteractionAdvisorFacet;
-
-import org.jspecify.annotations.NonNull;
/**
* Marker interface for implementations (specifically, {@link Facet}s) that can
@@ -34,37 +28,4 @@
*/
public interface InteractionAdvisor {
- /**
- * For testing purposes only.
- */
- public static InteractionAdvisor forTesting() {
- return new InteractionAdvisorFacet() {
-
- @Override
- public boolean semanticEquals(final @NonNull Facet other) {
- return this == other;
- }
-
- @Override
- public void visitAttributes(final BiConsumer visitor) {
- }
-
- @Override
- public Class extends Facet> facetType() {
- return null;
- }
-
- @Override
- public FacetHolder facetHolder() {
- return null;
- }
-
- @Override
- public Precedence precedence() {
- return Facet.Precedence.FALLBACK;
- }
-
- };
- }
-
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java
index 6c21e2243af..2aba4eea9d8 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java
@@ -23,6 +23,8 @@
import java.util.Objects;
import java.util.Optional;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.events.domain.AbstractDomainEvent;
import org.apache.causeway.applib.events.domain.ActionDomainEvent;
import org.apache.causeway.applib.services.bookmark.Bookmark;
@@ -42,6 +44,7 @@
import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetAbstract;
import org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.ManagedObjects;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
@@ -52,9 +55,9 @@
import static org.apache.causeway.commons.internal.base._Casts.uncheckedCast;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
+import lombok.experimental.Accessors;
@RequiredArgsConstructor
//@Slf4j
@@ -68,6 +71,7 @@ public final class ActionExecutor
public static ActionExecutor forAction(
final @NonNull FacetHolder facetHolder,
final @NonNull InteractionInitiatedBy interactionInitiatedBy,
+ final @NonNull WhatViewer whatViewer,
final @NonNull InteractionHead head,
final @NonNull Can argumentAdapters,
final @NonNull ObjectAction owningAction,
@@ -77,15 +81,14 @@ public static ActionExecutor forAction(
"action's parameter count and provided argument count must match");
// guard against malformed argumentAdapters
- argumentAdapters.forEach(arg->{if(!ManagedObjects.isSpecified(arg)) {
- throw _Exceptions.illegalArgument("arguments must be specified for action %s", owningAction);
- }});
+ argumentAdapters.forEach(arg->{if(!ManagedObjects.isSpecified(arg))
+ throw _Exceptions.illegalArgument("arguments must be specified for action %s", owningAction);});
- var method = actionInvocationFacetAbstract.getMethods().getFirstElseFail();
+ var method = actionInvocationFacetAbstract.methods().getFirstElseFail();
return new ActionExecutor(
owningAction.getMetaModelContext(), facetHolder,
- interactionInitiatedBy, owningAction, method, head, argumentAdapters, actionInvocationFacetAbstract);
+ interactionInitiatedBy, whatViewer, owningAction, method, head, argumentAdapters, actionInvocationFacetAbstract);
}
// -- CONSTRUCTION
@@ -97,6 +100,9 @@ public static ActionExecutor forAction(
private final @NonNull FacetHolder facetHolder;
@Getter
private final @NonNull InteractionInitiatedBy interactionInitiatedBy;
+ @Getter @Accessors(fluent = true)
+ private final @NonNull WhatViewer whatViewer;
+
@Getter
private final @NonNull ObjectAction owningAction;
@Getter
@@ -225,9 +231,8 @@ private Object invokeMethodElseFromCache(
()->CanonicalInvoker.invoke(method, targetPojo, executionParameters),
targetPojo.getClass(), method.getName(), targetPojoPlusExecutionParameters);
- } else {
- return CanonicalInvoker.invoke(method, targetPojo, executionParameters);
- }
+ } else
+ return CanonicalInvoker.invoke(method, targetPojo, executionParameters);
}
private static Can updateArguments(
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java
index 03a5534d839..1e98e91ad61 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java
@@ -20,6 +20,8 @@
import java.util.Optional;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.exceptions._Exceptions;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
@@ -30,12 +32,11 @@
import org.apache.causeway.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
import org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import org.jspecify.annotations.NonNull;
-
/**
* Used by ActionInvocationFacets and PropertySetterOrClearFacets to submit their executions.
*
@@ -70,6 +71,7 @@ default InteractionInternal getInteractionElseFail() {
default ManagedObject invokeAction(
final @NonNull FacetHolder facetHolder,
final @NonNull InteractionInitiatedBy interactionInitiatedBy,
+ final @NonNull WhatViewer whatViewer,
final @NonNull InteractionHead head,
// action specifics
final @NonNull Can argumentAdapters,
@@ -78,7 +80,7 @@ default ManagedObject invokeAction(
var actionExecutor = ActionExecutor.forAction(
facetHolder,
interactionInitiatedBy,
- head,
+ whatViewer, head,
argumentAdapters,
owningAction,
actionInvocationFacetAbstract);
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java
index fd6af2ddcef..02823c588e0 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java
@@ -34,9 +34,9 @@
import org.apache.causeway.commons.internal.base._Strings;
import org.apache.causeway.commons.internal.collections._Lists;
import org.apache.causeway.core.metamodel.facetapi.Facet.Precedence;
-import org.apache.causeway.core.metamodel.facetapi.FacetWithAttributes.DisablingOrEnabling;
-import org.apache.causeway.core.metamodel.facetapi.FacetWithAttributes.HidingOrShowing;
-import org.apache.causeway.core.metamodel.facetapi.FacetWithAttributes.Validating;
+import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor;
+import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
+import org.apache.causeway.core.metamodel.interactions.ValidatingInteractionAdvisor;
import org.apache.causeway.core.metamodel.util.snapshot.XmlSchema;
import lombok.experimental.UtilityClass;
@@ -245,9 +245,17 @@ public static void visitAttributes(Facet facet, BiConsumer visit
}
private String interactionAdvisors(Facet facet, final String delimiter) {
- return Stream.of(Validating.class, HidingOrShowing.class, DisablingOrEnabling.class)
+ return Stream.of(
+ ValidatingInteractionAdvisor.class,
+ HidingInteractionAdvisor.class,
+ DisablingInteractionAdvisor.class)
.filter(marker->marker.isAssignableFrom(facet.getClass()))
- .map(Class::getSimpleName)
+ .map(cls->switch(cls.getSimpleName().substring(0, 1)) {
+ case "V" -> "Validating";
+ case "H" -> "HidingOrShowing";
+ case "D" -> "DisablingOrEnabling";
+ default -> "?";
+ })
.collect(Collectors.joining(delimiter));
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetWithAttributes.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetWithAttributes.java
index 8b407ca2349..de713a767f6 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetWithAttributes.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetWithAttributes.java
@@ -31,22 +31,5 @@ public interface FacetWithAttributes {
default void visitAttributes(final BiConsumer visitor) {
FacetUtil.visitAttributes((Facet)this, visitor);
}
-
- /**
- * Marker interface used within {@link FacetUtil#visitAttributes()}.
- */
- public static interface HidingOrShowing {
- }
-
- /**
- * Marker interface used within {@link FacetUtil#visitAttributes()}.
- */
- public static interface DisablingOrEnabling {
- }
- /**
- * Marker interface used within {@link FacetUtil#visitAttributes()}.
- */
- public static interface Validating {
- }
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/HasImperativeAspect.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/HasImperativeAspect.java
index e7c034df9a6..0862b038959 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/HasImperativeAspect.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/HasImperativeAspect.java
@@ -24,16 +24,16 @@
public interface HasImperativeAspect
extends ImperativeFacet {
- ImperativeAspect getImperativeAspect();
+ ImperativeAspect imperativeAspect();
@Override
- default Can getMethods() {
- return getImperativeAspect().methods();
+ default Can methods() {
+ return imperativeAspect().methods();
}
@Override
- default Intent getIntent() {
- return getImperativeAspect().intent();
+ default Intent intent() {
+ return imperativeAspect().intent();
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/ImperativeFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/ImperativeFacet.java
index fbcbfaef4a1..3ee47dafb4d 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/ImperativeFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/ImperativeFacet.java
@@ -56,7 +56,7 @@ public interface ImperativeFacet extends Facet {
/**
* The {@link Method}s invoked by this {@link Facet}.
*/
- public Can getMethods();
+ Can methods();
public static enum Intent {
CHECK_IF_HIDDEN,
@@ -79,17 +79,17 @@ public static enum Intent {
/**
* The intent of this method, so that the {@link WrapperFactory} knows whether to delegate on or to reject.
*/
- public Intent getIntent();
+ Intent intent();
public static void visitAttributes(final ImperativeFacet imperativeFacet, final BiConsumer visitor) {
- var methods = imperativeFacet.getMethods();
+ var methods = imperativeFacet.methods();
visitor.accept("methods",
methods.stream()
.map(MethodFacade::toString)
.collect(Collectors.joining(", ")));
methods.forEach(method->
visitor.accept(
- "intent." + method.getName(), imperativeFacet.getIntent()));
+ "intent." + method.getName(), imperativeFacet.intent()));
}
// -- UTILITIES
@@ -103,11 +103,11 @@ public static Intent getIntent(final ObjectMember member, final ResolvedMethod m
case 0:
break;
case 1:
- return imperativeFacets.get(0).getIntent();
+ return imperativeFacets.get(0).intent();
default:
Intent intentToReturn = null;
for (ImperativeFacet imperativeFacet : imperativeFacets) {
- Intent intent = imperativeFacet.getIntent();
+ Intent intent = imperativeFacet.intent();
if(intentToReturn == null) {
intentToReturn = intent;
} else if(intentToReturn != intent) {
@@ -143,7 +143,7 @@ public static Can singleRegularMethod(final @NonNull ResolvedMetho
// -- HELPER
private boolean containsMethod(final ResolvedMethod method) {
- return getMethods().stream()
+ return methods().stream()
.map(MethodFacade::asMethodForIntrospection)
.anyMatch(method::equals);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 14d86e5e7d9..2b43c9ae2f4 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -35,7 +35,7 @@
import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForAction;
import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForMixedInPropertyOrCollection;
-import org.apache.causeway.core.metamodel.facets.actions.action.prototype.PrototypeFacetForActionAnnotation;
+import org.apache.causeway.core.metamodel.facets.actions.action.prototype.HiddenFacetForDeploymentTypeViaActionAnnotation;
import org.apache.causeway.core.metamodel.facets.actions.action.typeof.TypeOfFacetForActionAnnotation;
import org.apache.causeway.core.metamodel.facets.actions.fileaccept.FileAcceptFacetForActionAnnotation;
import org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
@@ -145,10 +145,10 @@ void processRestrictTo(final ProcessMethodContext processMethodContext, final Op
// search for @Action(restrictTo=...)
addFacetIfPresent(
- PrototypeFacetForActionAnnotation
+ HiddenFacetForDeploymentTypeViaActionAnnotation
.create(
actionIfAny, facetedMethod,
- ()->super.getSystemEnvironment().deploymentType()));
+ super.getSystemEnvironment().deploymentType()));
}
void processSemantics(final ProcessMethodContext processMethodContext, final Optional actionIfAny) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
index 9b058f37926..c56ff501108 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
@@ -22,6 +22,7 @@
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -39,7 +40,8 @@ ManagedObject invoke(
ObjectAction owningAction,
InteractionHead head,
Can argumentAdapters,
- InteractionInitiatedBy interactionInitiatedBy);
+ InteractionInitiatedBy interactionInitiatedBy,
+ WhatViewer whatViewer);
ObjectSpecification getReturnType();
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java
index ebe4a5d6930..00a5f69b9d3 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.events.domain.ActionDomainEvent;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -32,7 +34,7 @@
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public abstract class ActionInvocationFacetAbstract
extends DomainEventFacetAbstract>
@@ -46,7 +48,8 @@ private static final Class extends Facet> type() {
// -- CONSTRUCTION
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
@Getter(onMethod_ = {@Override}) private final ObjectSpecification declaringType;
@Getter(onMethod_ = {@Override}) private final ObjectSpecification returnType;
@@ -67,7 +70,7 @@ protected ActionInvocationFacetAbstract(
}
@Override
- public final Intent getIntent() {
+ public final Intent intent() {
return Intent.EXECUTE;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java
index 91abed72ce2..1b07c32348d 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java
@@ -25,6 +25,7 @@
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.DomainEventHolder;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -51,10 +52,11 @@ public ManagedObject invoke(
final ObjectAction owningAction,
final InteractionHead head,
final Can argumentAdapters,
- final InteractionInitiatedBy interactionInitiatedBy) {
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final WhatViewer whatViewer) {
return memberExecutorService.invokeAction(facetHolder(), interactionInitiatedBy,
- head, argumentAdapters, owningAction, this);
+ whatViewer, head, argumentAdapters, owningAction, this);
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java
index 95cdea4e04b..7799d89bfdb 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java
@@ -28,6 +28,7 @@
import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacet;
import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacet;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -61,9 +62,10 @@ public ManagedObject invoke(
final ObjectAction owningAction,
final InteractionHead head,
final Can argumentAdapters,
- final InteractionInitiatedBy interactionInitiatedBy) {
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final WhatViewer whatViewer) {
return memberExecutorService.invokeAction(facetHolder(), interactionInitiatedBy,
- head, argumentAdapters, owningAction, this);
+ whatViewer, head, argumentAdapters, owningAction, this);
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/prototype/HiddenFacetForDeploymentTypeViaActionAnnotation.java
similarity index 51%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/prototype/HiddenFacetForDeploymentTypeViaActionAnnotation.java
index ff3f1ef9dd6..45a3edca345 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/prototype/HiddenFacetForDeploymentTypeViaActionAnnotation.java
@@ -19,31 +19,46 @@
package org.apache.causeway.core.metamodel.facets.actions.action.prototype;
import java.util.Optional;
-import java.util.function.Supplier;
+import java.util.function.BiConsumer;
import org.apache.causeway.applib.annotation.Action;
import org.apache.causeway.applib.annotation.RestrictTo;
import org.apache.causeway.core.config.environment.DeploymentType;
+import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.actions.prototype.PrototypeFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.actions.prototype.HiddenFacetForDeploymentType;
+import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
-public class PrototypeFacetForActionAnnotation
-extends PrototypeFacetAbstract {
+public record HiddenFacetForDeploymentTypeViaActionAnnotation(
+ DeploymentType deploymentType,
+ FacetHolder facetHolder
+ ) implements HiddenFacetForDeploymentType {
- public static Optional create(
+ public static Optional create(
final Optional actionsIfAny,
final FacetHolder holder,
- final Supplier lazyDeploymentType) {
+ final DeploymentType deploymentType) {
return actionsIfAny
- .map(Action::restrictTo)
- .filter(restrictTo -> restrictTo == RestrictTo.PROTOTYPING)
- .map(restrictTo -> new PrototypeFacetForActionAnnotation(holder, lazyDeploymentType.get()));
-
+ .map(Action::restrictTo)
+ .filter(restrictTo -> restrictTo == RestrictTo.PROTOTYPING)
+ .map(restrictTo -> new HiddenFacetForDeploymentTypeViaActionAnnotation(deploymentType, holder));
}
- private PrototypeFacetForActionAnnotation(final FacetHolder holder, final DeploymentType deploymentType) {
- super(holder, deploymentType);
- }
+ @Override public Class extends Facet> facetType() { return HiddenFacetForDeploymentType.class; }
+ @Override public Precedence precedence() { return Precedence.DEFAULT; }
+ @Override
+ public String hides(VisibilityContext ic) {
+ return deploymentType.isProduction()
+ ? "Prototyping action not visible in production mode"
+ : null;
+ }
+
+ @Override
+ public void visitAttributes(final BiConsumer visitor) {
+ HiddenFacetForDeploymentType.super.visitAttributes(visitor);
+ visitor.accept("deploymentType", deploymentType.name());
+ }
+
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java
index 4d1a7ccd099..51b78fde56e 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java
@@ -23,10 +23,10 @@
import org.apache.causeway.applib.annotation.ActionLayout;
import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetForLayoutAbstract;
import org.apache.causeway.core.metamodel.object.ManagedObject;
-public class HiddenFacetForActionLayoutAnnotation extends HiddenFacetAbstract {
+public class HiddenFacetForActionLayoutAnnotation extends HiddenFacetForLayoutAbstract {
public static Optional create(
final Optional actionLayoutIfAny,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java
index 39ab3bf49e5..69746f843d6 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java
@@ -23,14 +23,14 @@
import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.layout.component.ActionLayoutData;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
+import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetForLayoutAbstract;
import org.apache.causeway.core.metamodel.object.ManagedObject;
public class HiddenFacetForActionLayoutXml
-extends HiddenFacetAbstract {
+extends HiddenFacetForLayoutAbstract {
- public static Optional create(
+ public static Optional create(
final ActionLayoutData actionLayout,
final FacetHolder holder,
final Precedence precedence) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/PrototypeFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/HiddenFacetForDeploymentType.java
similarity index 89%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/PrototypeFacet.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/HiddenFacetForDeploymentType.java
index cab8fd3ba3a..27c0b77a281 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/PrototypeFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/HiddenFacetForDeploymentType.java
@@ -18,12 +18,11 @@
*/
package org.apache.causeway.core.metamodel.facets.actions.prototype;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
/**
* Indicates that the action should only be available in prototype mode.
*/
-public interface PrototypeFacet extends Facet, HidingInteractionAdvisor {
+public interface HiddenFacetForDeploymentType extends HidingInteractionAdvisor {
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
deleted file mode 100644
index 102fd5c4b03..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
+++ /dev/null
@@ -1,57 +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.core.metamodel.facets.actions.prototype;
-
-import java.util.function.BiConsumer;
-
-import org.apache.causeway.core.config.environment.DeploymentType;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
-
-public abstract class PrototypeFacetAbstract
-extends FacetAbstract
-implements PrototypeFacet {
-
- private final DeploymentType deploymentType;
-
- private static final Class extends Facet> type() {
- return PrototypeFacet.class;
- }
-
- public PrototypeFacetAbstract(final FacetHolder holder, final DeploymentType deploymentType) {
- super(type(), holder);
- this.deploymentType = deploymentType;
- }
-
- @Override
- public String hides(
- final VisibilityContext ic) {
- return deploymentType.isProduction()
- ? "Prototyping action not visible in production mode"
- : null;
- }
-
- @Override
- public void visitAttributes(final BiConsumer visitor) {
- super.visitAttributes(visitor);
- visitor.accept("deploymentType", deploymentType.name());
- }
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
index d19a8e813e7..9f6fdc96fcd 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.services.i18n.TranslatableString;
import org.apache.causeway.applib.services.i18n.TranslationContext;
import org.apache.causeway.applib.services.i18n.TranslationService;
@@ -33,13 +35,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class ActionParameterValidationFacetViaMethod
extends ActionParameterValidationFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final TranslationService translationService;
private final TranslationContext translationContext;
@@ -55,7 +58,7 @@ public ActionParameterValidationFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHECK_IF_VALID;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
index d9a669f40ca..b5cf3c70b41 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.services.i18n.TranslatableString;
import org.apache.causeway.applib.services.i18n.TranslationContext;
import org.apache.causeway.commons.collections.Can;
@@ -34,13 +36,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class ActionValidationFacetViaMethod
extends ActionValidationFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final TranslationContext translationContext;
private final Optional patConstructor;
@@ -56,7 +59,7 @@ public ActionValidationFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHECK_IF_VALID;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/hide/HiddenFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/hide/HiddenFacetForLayout.java
similarity index 73%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/hide/HiddenFacet.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/hide/HiddenFacetForLayout.java
index ce145305973..e6afa5f0713 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/hide/HiddenFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/hide/HiddenFacetForLayout.java
@@ -25,37 +25,15 @@
import org.jspecify.annotations.NonNull;
/**
- * Hide a property, collection or action.
+ * Optionally hides a property, collection or action via layout.
*/
-public interface HiddenFacet
+public interface HiddenFacetForLayout
extends WhereValueFacet, HidingInteractionAdvisor {
- public enum Semantics {
-
- /** regular semantics */
- HIDDEN,
-
- /** inverted semantics */
- SHOWN;
-
- public boolean isHidden() {
- return this == HIDDEN;
- }
-
- public boolean isShown() {
- return this == SHOWN;
- }
- }
-
- // default semantics unless inverted
- default Semantics getSemantics() {
- return Semantics.HIDDEN;
- }
-
// -- PREDICATES
static boolean isAlwaysHidden(final @NonNull FacetHolder facetHolder) {
- return WhereValueFacet.isAlways(facetHolder, HiddenFacet.class);
+ return WhereValueFacet.isAlways(facetHolder, HiddenFacetForLayout.class);
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/imperative/HasImperativeTextFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/imperative/HasImperativeTextFacetAbstract.java
index 37c14e97f8e..d21e35d9258 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/imperative/HasImperativeTextFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/imperative/HasImperativeTextFacetAbstract.java
@@ -21,6 +21,8 @@
import java.util.Objects;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.services.i18n.TranslationContext;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.functional.Try;
@@ -34,7 +36,7 @@
import org.apache.causeway.core.metamodel.object.ManagedObjects;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class HasImperativeTextFacetAbstract
extends FacetAbstract
@@ -44,7 +46,8 @@ public class HasImperativeTextFacetAbstract
protected final TranslationContext translationContext;
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
protected HasImperativeTextFacetAbstract(
final Class extends Facet> facetType,
@@ -64,7 +67,7 @@ public final Try text(final ManagedObject object) {
}
@Override
- public final Intent getIntent() {
+ public final Intent intent() {
return Intent.UI_HINT;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
index d636ae92fed..4a5abe7520f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -34,13 +36,14 @@
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class CollectionAccessorFacetViaAccessor
extends PropertyOrCollectionAccessorFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
public CollectionAccessorFacetViaAccessor(
final ObjectSpecification declaringType,
@@ -51,7 +54,7 @@ public CollectionAccessorFacetViaAccessor(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.ACCESSOR;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java
index 1a42c66f40e..16bb823aa6b 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java
@@ -24,11 +24,11 @@
import org.apache.causeway.applib.annotation.CollectionLayout;
import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetForLayoutAbstract;
import org.apache.causeway.core.metamodel.object.ManagedObject;
public class HiddenFacetForCollectionLayoutAnnotation
-extends HiddenFacetAbstract {
+extends HiddenFacetForLayoutAbstract {
public static Optional create(
final Optional collectionLayoutIfAny,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutXml.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutXml.java
index c7262bbbcd3..eec0cf04234 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutXml.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutXml.java
@@ -23,14 +23,14 @@
import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.layout.component.CollectionLayoutData;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
+import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetForLayoutAbstract;
import org.apache.causeway.core.metamodel.object.ManagedObject;
public class HiddenFacetForCollectionLayoutXml
-extends HiddenFacetAbstract {
+extends HiddenFacetForLayoutAbstract {
- public static Optional create(
+ public static Optional create(
final CollectionLayoutData collectionLayout,
final FacetHolder holder,
final Precedence precedence) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacet.java
index b05a26680f2..f7b56322e12 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacet.java
@@ -18,7 +18,6 @@
*/
package org.apache.causeway.core.metamodel.facets.members.disabled.method;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor;
import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -30,6 +29,6 @@
* In the standard Apache Causeway Programming Model, corresponds to invoking the
* disableXxx support method for the member.
*/
-public interface DisableForContextFacet extends Facet, DisablingInteractionAdvisor {
+public interface DisableForContextFacet extends DisablingInteractionAdvisor {
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
index 60ad25c09fc..dfb3ffba37f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.services.i18n.TranslatableString;
import org.apache.causeway.applib.services.i18n.TranslationContext;
import org.apache.causeway.commons.collections.Can;
@@ -34,13 +36,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class DisableForContextFacetViaMethod
extends DisableForContextFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final TranslationContext translationContext;
public DisableForContextFacetViaMethod(
@@ -52,7 +55,7 @@ public DisableForContextFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHECK_IF_DISABLED;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetForLayoutAbstract.java
similarity index 83%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetAbstract.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetForLayoutAbstract.java
index c3a0fc53ece..1cd770ba76f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetForLayoutAbstract.java
@@ -24,25 +24,25 @@
import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.WhereValueFacetAbstract;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
import org.apache.causeway.core.metamodel.object.ManagedObject;
-public abstract class HiddenFacetAbstract
+public abstract class HiddenFacetForLayoutAbstract
extends WhereValueFacetAbstract
-implements HiddenFacet {
+implements HiddenFacetForLayout {
- public static final Class type() {
- return HiddenFacet.class;
+ public static final Class type() {
+ return HiddenFacetForLayout.class;
}
- public HiddenFacetAbstract(
+ public HiddenFacetForLayoutAbstract(
final Where where,
final FacetHolder holder) {
super(type(), holder, where);
}
- public HiddenFacetAbstract(
+ public HiddenFacetForLayoutAbstract(
final Where where,
final FacetHolder holder,
final Facet.Precedence precedence) {
@@ -50,12 +50,12 @@ public HiddenFacetAbstract(
}
// to instantiate contributed facets
- private HiddenFacetAbstract(final HiddenFacetAbstract toplevelFacet) {
+ private HiddenFacetForLayoutAbstract(final HiddenFacetForLayoutAbstract toplevelFacet) {
super(type(), toplevelFacet.facetHolder(), toplevelFacet.where());
}
@Override
- public String hides(final VisibilityContext ic) {
+ public final String hides(final VisibilityContext ic) {
return hiddenReason(ic.target(), ic.where());
}
@@ -68,7 +68,6 @@ public String hides(final VisibilityContext ic) {
@Override
public final void visitAttributes(final BiConsumer visitor) {
super.visitAttributes(visitor);
- visitor.accept("semantics", getSemantics());
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetFromLayoutPropertiesAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetFromLayoutPropertiesAbstract.java
deleted file mode 100644
index 96a622b0b76..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/HiddenFacetFromLayoutPropertiesAbstract.java
+++ /dev/null
@@ -1,52 +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.core.metamodel.facets.members.hidden;
-
-import java.util.Properties;
-
-import org.apache.causeway.applib.annotation.Where;
-import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-
-public abstract class HiddenFacetFromLayoutPropertiesAbstract extends HiddenFacetAbstract {
-
- protected static Where hidden(final Properties properties) {
- if(properties == null) {
- return null;
- }
- final String hidden = _Strings.emptyToNull(properties.getProperty("hidden"));
- if(hidden == null) {
- return null;
- }
- return Where.valueOf(hidden);
- }
-
- protected HiddenFacetFromLayoutPropertiesAbstract(final Where where, final FacetHolder holder) {
- super(where, holder);
- }
-
- @Override
- public String hiddenReason(final ManagedObject targetAdapter, final Where whereContext) {
- if(!where().includes(whereContext)) {
- return null;
- }
- return "Hidden on " + where().getFriendlyName();
- }
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMember.java
similarity index 79%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacet.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMember.java
index 84b495b703e..b147146ac52 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMember.java
@@ -18,18 +18,16 @@
*/
package org.apache.causeway.core.metamodel.facets.members.hidden.method;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
import org.apache.causeway.core.metamodel.object.ManagedObject;
/**
- * Hide a property, collection or action based on the state of the target
+ * Optionally hides a property, collection or action based on the state of the target
* {@link ManagedObject object}.
*
- *
- * In the standard Apache Causeway Programming Model, corresponds to invoking the
+ *
In the standard Apache Causeway Programming Model, corresponds to invoking the
* hideXxx support method for the member.
*/
-public interface HideForContextFacet extends Facet, HidingInteractionAdvisor {
+public interface HiddenFacetForMember extends HidingInteractionAdvisor {
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMemberViaMethod.java
similarity index 70%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethod.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMemberViaMethod.java
index 89b26eae214..957c85ce6c0 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMemberViaMethod.java
@@ -23,29 +23,27 @@
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
+import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
+import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
import org.apache.causeway.core.metamodel.facets.ImperativeFacet;
import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+public record HiddenFacetForMemberViaMethod(
+ Can methods,
+ FacetHolder facetHolder
+ ) implements HiddenFacetForMember, ImperativeFacet {
+
+ @Override public Class extends Facet> facetType() { return HiddenFacetForMember.class; }
+ @Override public Precedence precedence() { return Precedence.DEFAULT; }
+ @Override public Intent intent() { return Intent.CHECK_IF_HIDDEN;}
-public class HideForContextFacetViaMethod
-extends HideForContextFacetAbstract
-implements ImperativeFacet {
+ public Can getMethods() { return methods(); }
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
-
- public HideForContextFacetViaMethod(final ResolvedMethod method, final FacetHolder holder) {
- super(holder);
- this.methods = ImperativeFacet.singleRegularMethod(method);
- }
-
- @Override
- public Intent getIntent() {
- return Intent.CHECK_IF_HIDDEN;
+ public HiddenFacetForMemberViaMethod(final ResolvedMethod method, final FacetHolder holder) {
+ this(ImperativeFacet.singleRegularMethod(method), holder);
}
@Override
@@ -60,8 +58,13 @@ public String hides(final VisibilityContext ic) {
@Override
public void visitAttributes(final BiConsumer visitor) {
- super.visitAttributes(visitor);
+ HiddenFacetForMember.super.visitAttributes(visitor);
ImperativeFacet.visitAttributes(this, visitor);
}
+
+ @Override
+ public String toString() {
+ return FacetUtil.toString(this);
+ }
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMemberViaMethodFactory.java
similarity index 91%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMemberViaMethodFactory.java
index d857fb2f997..dbd5e4fd0e3 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HiddenFacetForMemberViaMethodFactory.java
@@ -26,11 +26,11 @@
import org.apache.causeway.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
import org.apache.causeway.core.metamodel.methods.MethodFinder;
-public class HideForContextFacetViaMethodFactory
+public class HiddenFacetForMemberViaMethodFactory
extends MemberSupportFacetFactoryAbstract {
@Inject
- public HideForContextFacetViaMethodFactory(final MetaModelContext mmc) {
+ public HiddenFacetForMemberViaMethodFactory(final MetaModelContext mmc) {
super(mmc, FeatureType.MEMBERS, MemberSupportPrefix.HIDE);
}
@@ -44,7 +44,7 @@ protected void search(
.peek(processMethodContext::removeMethod)
.forEach(hideMethod->{
addFacet(
- new HideForContextFacetViaMethod(
+ new HiddenFacetForMemberViaMethod(
hideMethod, processMethodContext.getFacetHolder()));
});
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetAbstract.java
deleted file mode 100644
index 29d25e5a352..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetAbstract.java
+++ /dev/null
@@ -1,39 +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.core.metamodel.facets.members.hidden.method;
-
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-
-public abstract class HideForContextFacetAbstract extends FacetAbstract implements HideForContextFacet {
-
- private static final Class extends Facet> type() {
- return HideForContextFacet.class;
- }
-
- public HideForContextFacetAbstract(final FacetHolder holder) {
- super(type(), holder);
- }
-
- public HideForContextFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
- super(type(), holder, precedence);
- }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/navigation/NavigationFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/navigation/HiddenFacetForNavigation.java
similarity index 83%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/navigation/NavigationFacet.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/navigation/HiddenFacetForNavigation.java
index 10fc0cc1643..9c8c6349c10 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/navigation/NavigationFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/navigation/HiddenFacetForNavigation.java
@@ -18,13 +18,12 @@
*/
package org.apache.causeway.core.metamodel.facets.members.navigation;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenTypeFacet;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForNoMembersAuthorized;
import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
/**
* Hides object members that would allow navigation to a domain type that is
- * {@link HiddenTypeFacet hidden} (typically due to security permissions).
+ * {@link HiddenFacetForNoMembersAuthorized hidden} (typically due to security permissions).
*/
-public interface NavigationFacet extends Facet, HidingInteractionAdvisor {
+public interface HiddenFacetForNavigation extends HidingInteractionAdvisor {
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
index 762cf7ebcc6..4dcb5f79dd4 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
@@ -28,6 +28,7 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
+import lombok.experimental.Accessors;
/**
* Adapter superclass for {@link Facet}s for {@link CallbackFacet}.
@@ -36,7 +37,7 @@ public abstract class CallbackFacetAbstract
extends FacetAbstract
implements CallbackFacet {
- @Getter(onMethod_ = {@Override})
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
private final Can methods;
private final Can asRegularMethods;
@@ -50,7 +51,7 @@ protected CallbackFacetAbstract(
}
@Override
- public final Intent getIntent() {
+ public final Intent intent() {
return Intent.LIFECYCLE;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/cssclass/method/CssClassFacetViaCssClassMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/cssclass/method/CssClassFacetViaCssClassMethod.java
index f3ecec740a0..5648f5f4986 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/cssclass/method/CssClassFacetViaCssClassMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/cssclass/method/CssClassFacetViaCssClassMethod.java
@@ -21,6 +21,7 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
@@ -32,13 +33,14 @@
import org.apache.causeway.core.metamodel.object.ManagedObject;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class CssClassFacetViaCssClassMethod
extends CssClassFacetAbstract
implements HasImperativeAspect {
- @Getter(onMethod_ = {@Override}) private final @NonNull ImperativeAspect imperativeAspect;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull ImperativeAspect imperativeAspect;
public static Optional create(
final @Nullable ResolvedMethod methodIfAny,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/DisabledObjectFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/DisabledObjectFacet.java
index 395670db73e..370001f3058 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/DisabledObjectFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/DisabledObjectFacet.java
@@ -18,7 +18,6 @@
*/
package org.apache.causeway.core.metamodel.facets.object.disabled;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.object.immutable.ImmutableFacet;
import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor;
@@ -39,7 +38,7 @@
* @see ImmutableFacet
*/
public interface DisabledObjectFacet
-extends Facet, DisablingInteractionAdvisor {
+extends DisablingInteractionAdvisor {
/**
* Clone this facet onto another {@link FacetHolder}.
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
index 41af51e99c6..b21da7680e8 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
@@ -35,13 +35,16 @@
import org.apache.causeway.core.metamodel.object.ManagedObject;
import lombok.Getter;
+import lombok.experimental.Accessors;
+
import org.jspecify.annotations.NonNull;
public class DisabledObjectFacetViaMethod
extends DisabledObjectFacetAbstract
implements HasImperativeAspect {
- @Getter(onMethod_ = {@Override}) private final @NonNull ImperativeAspect imperativeAspect;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull ImperativeAspect imperativeAspect;
private final TranslationContext translationContext;
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorized.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorized.java
new file mode 100644
index 00000000000..961ff1781d2
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorized.java
@@ -0,0 +1,28 @@
+/*
+ * 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.core.metamodel.facets.object.hidden;
+
+import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
+
+/**
+ * Optionally hides an object, based on whether non of its properties, collections and actions is visible.
+ */
+public interface HiddenFacetForNoMembersAuthorized extends HidingInteractionAdvisor {
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacetFromAuthorizationFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorizedFactory.java
similarity index 84%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacetFromAuthorizationFactory.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorizedFactory.java
index e501f314430..d46d90caeba 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacetFromAuthorizationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorizedFactory.java
@@ -28,21 +28,21 @@
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
/**
- * Installs the {@link HiddenTypeFacetFromAuthorization} on the
+ * Installs the {@link HiddenFacetForNoMembersAuthorizedImpl} on the
* {@link ObjectSpecification}.
*/
-public class HiddenTypeFacetFromAuthorizationFactory
+public class HiddenFacetForNoMembersAuthorizedFactory
extends FacetFactoryAbstract {
@Inject
- public HiddenTypeFacetFromAuthorizationFactory(final MetaModelContext mmc) {
+ public HiddenFacetForNoMembersAuthorizedFactory(final MetaModelContext mmc) {
super(mmc, FeatureType.OBJECTS_ONLY);
}
@Override
public void process(final ProcessClassContext processClassContext) {
final FacetHolder facetHolder = processClassContext.getFacetHolder();
- FacetUtil.addFacet(new HiddenTypeFacetFromAuthorization(facetHolder));
+ FacetUtil.addFacet(new HiddenFacetForNoMembersAuthorizedImpl(facetHolder));
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacetFromAuthorization.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorizedImpl.java
similarity index 91%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacetFromAuthorization.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorizedImpl.java
index 3245f2a36f5..85dfea926de 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenTypeFacetFromAuthorization.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForNoMembersAuthorizedImpl.java
@@ -25,19 +25,12 @@
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
-public record HiddenTypeFacetFromAuthorization(
+public record HiddenFacetForNoMembersAuthorizedImpl(
FacetHolder facetHolder
- ) implements HiddenTypeFacet {
+ ) implements HiddenFacetForNoMembersAuthorized {
- @Override
- public Class extends Facet> facetType() {
- return HiddenTypeFacet.class;
- }
-
- @Override
- public Precedence precedence() {
- return Precedence.HIGH; // facet has final say, don't override;
- }
+ @Override public Class extends Facet> facetType() { return HiddenFacetForNoMembersAuthorized.class; }
+ @Override public Precedence precedence() { return Precedence.HIGH; }
@Override
public String hides(final VisibilityContext vc) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenObjectFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForObject.java
similarity index 86%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenObjectFacet.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForObject.java
index 217a021e1b7..e55b14915ee 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenObjectFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenFacetForObject.java
@@ -19,10 +19,11 @@
package org.apache.causeway.core.metamodel.facets.object.hidden;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
+import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
-public interface HiddenObjectFacet extends HiddenInstanceFacet {
+public interface HiddenFacetForObject extends HidingInteractionAdvisor {
/**
* Copy this facet to another {@link FacetHolder}.
@@ -31,6 +32,6 @@ public interface HiddenObjectFacet extends HiddenInstanceFacet {
* {@link ObjectSpecification}, and then copied down onto each of the spec's
* {@link ObjectMember}s.
*/
- public HiddenObjectFacet copyTo(FacetHolder holder);
+ public HiddenFacetForObject copyTo(FacetHolder holder);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenInstanceFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenInstanceFacet.java
deleted file mode 100644
index 2243cb6948c..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenInstanceFacet.java
+++ /dev/null
@@ -1,43 +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.core.metamodel.facets.object.hidden;
-
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
-
-/**
- * Mechanism for determining whether an object should be hidden.
- *
- * Even though all the properties of an object may themselves be visible, there
- * could be reasons to hide the object.
- *
- *
In the standard Apache Causeway Programming Model, typically corresponds to the
- * hidden method.
- *
- * @see HiddenFacet
- * @see HiddenObjectFacet
- * @see HiddenTypeFacet
- *
- * @apiNote An unification attempt on HiddenTypeFacet and HiddenObjectFacet into a single,
- * failed, because both facets must co-exist, where each has veto power (not one overruling the other).
- */
-public interface HiddenInstanceFacet extends Facet, HidingInteractionAdvisor {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenObjectFacetAbstract.java
deleted file mode 100644
index cd83642e1a2..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/HiddenObjectFacetAbstract.java
+++ /dev/null
@@ -1,47 +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.core.metamodel.facets.object.hidden;
-
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-
-public abstract class HiddenObjectFacetAbstract
-extends FacetAbstract
-implements HiddenObjectFacet {
-
- private static final Class extends Facet> type() {
- return HiddenObjectFacet.class;
- }
-
- public HiddenObjectFacetAbstract(final FacetHolder holder) {
- super(type(), holder);
- }
-
- @Override
- public String hides(final VisibilityContext ic) {
- final ManagedObject toValidate = ic.target();
- return toValidate != null ? hiddenReason(toValidate) : null;
- }
-
- protected abstract String hiddenReason(ManagedObject toHide);
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/method/HiddenObjectFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/method/HiddenFacetForObjectViaMethod.java
similarity index 58%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/method/HiddenObjectFacetViaMethod.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/method/HiddenFacetForObjectViaMethod.java
index 0b3b36ebb7e..a75a2dbd070 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/method/HiddenObjectFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/hidden/method/HiddenFacetForObjectViaMethod.java
@@ -24,36 +24,30 @@
import org.jspecify.annotations.Nullable;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
+import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.HasImperativeAspect;
import org.apache.causeway.core.metamodel.facets.ImperativeAspect;
-import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenObjectFacet;
-import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenObjectFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForObject;
import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
import org.apache.causeway.core.metamodel.object.ManagedObject;
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+public record HiddenFacetForObjectViaMethod(
+ ImperativeAspect imperativeAspect,
+ FacetHolder facetHolder
+ ) implements HiddenFacetForObject, HasImperativeAspect {
-public class HiddenObjectFacetViaMethod
-extends HiddenObjectFacetAbstract
-implements HasImperativeAspect {
-
- @Getter(onMethod_ = {@Override}) private final @NonNull ImperativeAspect imperativeAspect;
-
- public static Optional create(
- final @Nullable ResolvedMethod methodIfAny,
- final FacetHolder holder) {
-
- return Optional.ofNullable(methodIfAny)
- .map(method->ImperativeAspect.singleRegularMethod(method, Intent.CHECK_IF_HIDDEN))
- .map(imperativeAspect->new HiddenObjectFacetViaMethod(imperativeAspect, holder));
- }
-
- private HiddenObjectFacetViaMethod(final ImperativeAspect imperativeAspect, final FacetHolder holder) {
- super(holder);
- this.imperativeAspect = imperativeAspect;
- }
+ public static Optional create(
+ final @Nullable ResolvedMethod methodIfAny,
+ final FacetHolder holder) {
+
+ return Optional.ofNullable(methodIfAny)
+ .map(method->ImperativeAspect.singleRegularMethod(method, Intent.CHECK_IF_HIDDEN))
+ .map(imperativeAspect->new HiddenFacetForObjectViaMethod(imperativeAspect, holder));
+ }
+
+ @Override public Class extends Facet> facetType() { return HiddenFacetForObject.class; }
+ @Override public Precedence precedence() { return Precedence.DEFAULT;}
@Override
public String hides(final VisibilityContext ic) {
@@ -62,19 +56,21 @@ public String hides(final VisibilityContext ic) {
}
@Override
- public String hiddenReason(final ManagedObject target) {
- final boolean isHidden = imperativeAspect.eval(target, false);
- return isHidden ? "Hidden" : null;
- }
-
- @Override
- public HiddenObjectFacetViaMethod copyTo(final FacetHolder holder) {
- return new HiddenObjectFacetViaMethod(imperativeAspect, holder);
+ public HiddenFacetForObjectViaMethod copyTo(final FacetHolder holder) {
+ return new HiddenFacetForObjectViaMethod(imperativeAspect, holder);
}
@Override
public void visitAttributes(final BiConsumer visitor) {
- super.visitAttributes(visitor);
+ HiddenFacetForObject.super.visitAttributes(visitor);
imperativeAspect.visitAttributes(visitor);
}
+
+ // -- HELPER
+
+ private String hiddenReason(final ManagedObject target) {
+ final boolean isHidden = imperativeAspect.eval(target, false);
+ return isHidden ? "Hidden" : null;
+ }
+
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconMethod.java
index 3cb2fde883c..d1abdbfc5b2 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconMethod.java
@@ -50,7 +50,6 @@ public static Optional create(
@Override public Class extends Facet> facetType() { return IconFacet.class; }
@Override public Precedence precedence() { return Precedence.DEFAULT; }
- @Override public ImperativeAspect getImperativeAspect() { return imperativeAspect; }
@Override
public Optional icon(ManagedObject domainObject, IconSize iconSize) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java
index 68bd46e1eba..0b00b1f5afb 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java
@@ -51,7 +51,6 @@ public static Optional create(
@Override public Class extends Facet> facetType() { return IconFacet.class; }
@Override public Precedence precedence() { return Precedence.LOW; }
- @Override public ImperativeAspect getImperativeAspect() { return imperativeAspect; }
@Override
public Optional icon(ManagedObject domainObject, IconSize iconSize) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/layout/LayoutPrefixFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/layout/LayoutPrefixFacetViaMethod.java
index b218b0fe685..6fcb0f11eb6 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/layout/LayoutPrefixFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/layout/LayoutPrefixFacetViaMethod.java
@@ -68,11 +68,6 @@ public String layoutPrefix(final ManagedObject managedObject) {
}
}
- @Override
- public ImperativeAspect getImperativeAspect() {
- return imperativeAspect();
- }
-
@Override
public void visitAttributes(final BiConsumer visitor) {
LayoutPrefixFacet.super.visitAttributes(visitor);
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacet.java
index 92ce07058d6..04d8543e743 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacet.java
@@ -33,9 +33,8 @@ public interface ObjectValidPropertiesFacet extends Facet, ValidatingInteraction
/**
* The reason the object is invalid.
*
- *
- * . If the object is actually valid, should return null.
+ *
If the object is actually valid, should return null.
*/
- public String invalidReason(ObjectValidityContext context);
+ String invalidReason(ObjectValidityContext context);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacetAbstract.java
deleted file mode 100644
index e586b25d253..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacetAbstract.java
+++ /dev/null
@@ -1,46 +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.core.metamodel.facets.object.objectvalidprops;
-
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.interactions.val.ObjectValidityContext;
-import org.apache.causeway.core.metamodel.interactions.val.ValidityContext;
-
-public abstract class ObjectValidPropertiesFacetAbstract extends FacetAbstract implements ObjectValidPropertiesFacet {
-
- private static final Class extends Facet> type() {
- return ObjectValidPropertiesFacet.class;
- }
-
- public ObjectValidPropertiesFacetAbstract(final FacetHolder holder) {
- super(type(), holder);
- }
-
- @Override
- public String invalidates(final ValidityContext ic) {
- if (!(ic instanceof ObjectValidityContext)) {
- return null;
- }
- final ObjectValidityContext validityContext = (ObjectValidityContext) ic;
- return invalidReason(validityContext);
- }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java
index 086d41fd642..06a82a704f4 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java
@@ -19,48 +19,64 @@
package org.apache.causeway.core.metamodel.facets.object.objectvalidprops.impl;
import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.object.objectvalidprops.ObjectValidPropertiesFacetAbstract;
+import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
+import org.apache.causeway.core.metamodel.facets.object.objectvalidprops.ObjectValidPropertiesFacet;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.interactions.val.ObjectValidityContext;
+import org.apache.causeway.core.metamodel.interactions.val.ValidityContext;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
-public class ObjectValidPropertiesFacetImpl
-extends ObjectValidPropertiesFacetAbstract {
+public record ObjectValidPropertiesFacetImpl(
+ FacetHolder facetHolder)
+implements ObjectValidPropertiesFacet {
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
+ @Override public Class extends Facet> facetType() { return ObjectValidPropertiesFacet.class; }
+ @Override public Precedence precedence() { return Precedence.DEFAULT; }
- public ObjectValidPropertiesFacetImpl(final FacetHolder holder) {
- super(holder);
+ @Override
+ public String toString() {
+ return FacetUtil.toString(this);
}
@Override
- public String invalidReason(
- final ObjectValidityContext context) {
- final StringBuilder buf = new StringBuilder();
- final ManagedObject adapter = context.target();
+ public String invalidates(final ValidityContext ic) {
+ return (ic instanceof final ObjectValidityContext validityContext)
+ ? invalidReason(validityContext)
+ : null;
+ }
- adapter.objSpec().streamProperties(MixedIn.EXCLUDED)
- .filter(property->property.isVisible(adapter, context.initiatedBy(), where).isVetoed()) // ignore hidden properties
- .filter(property->property.isUsable(adapter, context.initiatedBy(), where).isVetoed()) // ignore disabled properties
- .forEach(property->{
- final ManagedObject value = property.get(adapter, context.initiatedBy());
- if (property.isAssociationValid(adapter, value, context.initiatedBy()).isVetoed()) {
- if (buf.length() > 0) {
- buf.append(", ");
- }
- buf.append(property.getFriendlyName(context::target));
- }
- });
- if (buf.length() > 0) {
- return "Invalid properties: " + buf.toString();
- }
- return null;
+ @Override
+ public String invalidReason(final ObjectValidityContext context) {
+ final ManagedObject mo = context.target();
+ var sb = new StringBuilder();
+
+ mo.objSpec().streamProperties(MixedIn.EXCLUDED)
+ .filter(property->property.isVisible(mo, context.initiatedBy(), VISIBILITY_CONSTRAINT).isVetoed()) // ignore hidden properties
+ .filter(property->property.isUsable(mo, context.initiatedBy(), VISIBILITY_CONSTRAINT).isVetoed()) // ignore disabled properties
+ .forEach(property->{
+ final ManagedObject value = property.get(mo, context.initiatedBy());
+ if (property.isAssociationValid(mo, value, context.initiatedBy()).isVetoed()) {
+ if (sb.length() > 0) {
+ sb.append(", ");
+ }
+ sb.append(property.getFriendlyName(context::target));
+ }
+ });
+ return (sb.length() > 0)
+ ? "Invalid properties: " + sb.toString()
+ : null;
}
+ // REVIEW: should provide the rendering context, rather than hardcoding.
+ // The net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where.
+ // However, ultimately we do check, whether the object is valid prior to persisting,
+ // I think, this should not be constraint by WhatViewer or Where.
+ private final static VisibilityConstraint VISIBILITY_CONSTRAINT = VisibilityConstraint.noViewer(Where.ANYWHERE);
+
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
index 30485697243..a19a1bf1adb 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
@@ -37,8 +37,8 @@
import org.apache.causeway.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod;
import org.apache.causeway.core.metamodel.facets.object.disabled.DisabledObjectFacet;
import org.apache.causeway.core.metamodel.facets.object.disabled.method.DisabledObjectFacetViaMethod;
-import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenObjectFacet;
-import org.apache.causeway.core.metamodel.facets.object.hidden.method.HiddenObjectFacetViaMethod;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForObject;
+import org.apache.causeway.core.metamodel.facets.object.hidden.method.HiddenFacetForObjectViaMethod;
import org.apache.causeway.core.metamodel.facets.object.icon.method.IconFacetViaIconMethod;
import org.apache.causeway.core.metamodel.facets.object.icon.method.IconFacetViaIconNameMethod;
import org.apache.causeway.core.metamodel.facets.object.layout.LayoutPrefixFacetViaMethod;
@@ -51,7 +51,7 @@
/**
* Installs {@link DisabledObjectFacetViaMethod}
- * and {@link HiddenObjectFacetViaMethod} on the
+ * and {@link HiddenFacetForObjectViaMethod} on the
* {@link ObjectSpecification}, and copies this facet onto each
* {@link ObjectMember}.
*
@@ -81,7 +81,7 @@ public final void process(final ProcessClassContext processClassContext) {
// priming 'toString()' into Precedence.INFERRED rank
inferTitleFromToString(processClassContext);
- processObjectSupport(processClassContext, ObjectSupportMethod.HIDDEN, NO_ARG, HiddenObjectFacetViaMethod::create);
+ processObjectSupport(processClassContext, ObjectSupportMethod.HIDDEN, NO_ARG, HiddenFacetForObjectViaMethod::create);
processObjectSupport(processClassContext, ObjectSupportMethod.DISABLED, NO_ARG, DisabledObjectFacetViaMethod::create);
processObjectSupport(processClassContext, ObjectSupportMethod.TITLE, NO_ARG, TitleFacetViaTitleMethod::create);
processObjectSupport(processClassContext, ObjectSupportMethod.LAYOUT, NO_ARG, LayoutPrefixFacetViaMethod::create);
@@ -101,7 +101,7 @@ public void process(final ProcessMethodContext processMethodContext) {
.map(disabledObjectFacet->disabledObjectFacet.clone(member))
.ifPresent(FacetUtil::addFacet);
- owningSpec.lookupFacet(HiddenObjectFacet.class)
+ owningSpec.lookupFacet(HiddenFacetForObject.class)
.map(hiddenObjectFacet->hiddenObjectFacet.copyTo(member))
.ifPresent(FacetUtil::addFacet);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/TitleFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/TitleFacetAbstract.java
index 9a410be7f9b..db3689f0f2f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/TitleFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/TitleFacetAbstract.java
@@ -62,8 +62,8 @@ public boolean semanticEquals(final @NonNull Facet other) {
&& otherFacet instanceof ImperativeFacet) {
return ((ImperativeFacet)this)
- .getMethods()
- .equals(((ImperativeFacet)otherFacet).getMethods());
+ .methods()
+ .equals(((ImperativeFacet)otherFacet).methods());
}
return false;
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
index 39e9a0041d0..f3eb799aaba 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
@@ -25,6 +25,8 @@
import java.util.function.BiConsumer;
import java.util.function.Consumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.annotation.Title;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.base._Strings;
@@ -35,8 +37,8 @@
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
import org.apache.causeway.commons.internal.reflection._Reflect.InterfacePolicy;
import org.apache.causeway.commons.internal.reflection._Reflect.TypeHierarchyPolicy;
-import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod;
import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.MessageTemplate;
+import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.Evaluators;
import org.apache.causeway.core.metamodel.facets.Evaluators.MethodEvaluator;
@@ -49,8 +51,8 @@
import lombok.AccessLevel;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
import lombok.RequiredArgsConstructor;
+import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -85,7 +87,8 @@ public static Optional create(
}
@Getter private final Can components;
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
protected TitleFacetViaTitleAnnotation(final Can components, final FacetHolder holder) {
super(holder);
@@ -109,7 +112,7 @@ protected TitleFacetViaTitleAnnotation(final Can components, fin
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.UI_HINT;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetFromToStringMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetFromToStringMethod.java
index 14a08e92da2..347a7256716 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetFromToStringMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetFromToStringMethod.java
@@ -21,6 +21,7 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
@@ -33,13 +34,14 @@
import org.apache.causeway.core.metamodel.facets.object.title.TitleRenderRequest;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class TitleFacetFromToStringMethod
extends TitleFacetAbstract
implements HasImperativeAspect {
- @Getter(onMethod_ = {@Override}) private final @NonNull ImperativeAspect imperativeAspect;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull ImperativeAspect imperativeAspect;
public static Optional create(
final @Nullable ResolvedMethod methodIfAny,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
index 68e8a809598..706ea5731bf 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
@@ -36,6 +36,8 @@
import org.apache.causeway.core.metamodel.object.ManagedObjects;
import lombok.Getter;
+import lombok.experimental.Accessors;
+
import org.jspecify.annotations.NonNull;
import lombok.extern.slf4j.Slf4j;
@@ -44,7 +46,8 @@ public class TitleFacetViaTitleMethod
extends TitleFacetAbstract
implements HasImperativeAspect {
- @Getter(onMethod_ = {@Override}) private final @NonNull ImperativeAspect imperativeAspect;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull ImperativeAspect imperativeAspect;
private final TranslationContext translationContext;
public static Optional create(
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
index f9d30c19c3a..3a3c69c1bb4 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
@@ -20,7 +20,6 @@
import org.apache.causeway.applib.annotation.PromptStyle;
import org.apache.causeway.applib.annotation.SemanticsOf;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.core.metamodel.commons.CanonicalInvoker;
import org.apache.causeway.core.metamodel.commons.ParameterConverters;
@@ -34,6 +33,8 @@
import org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater.CompositeValueUpdaterForParameter;
import org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater.CompositeValueUpdaterForProperty;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.interactions.managed.ManagedProperty;
import org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -68,20 +69,22 @@ default CompositeValueUpdater overrideFacets() {
// -- OBJECT ACTION MOCKUP
- @Override default Consent isVisible(final ManagedObject a, final InteractionInitiatedBy b, final Where c) { return Allow.DEFAULT; }
- @Override default Consent isUsable(final ManagedObject a, final InteractionInitiatedBy b, final Where c) { return Allow.DEFAULT; }
+ @Override default Consent isVisible(final ManagedObject a, final InteractionInitiatedBy b, final VisibilityConstraint c) { return Allow.DEFAULT; }
+ @Override default Consent isUsable(final ManagedObject a, final InteractionInitiatedBy b, final VisibilityConstraint c) { return Allow.DEFAULT; }
@Override default PromptStyle getPromptStyle() { return PromptStyle.INLINE_AS_IF_EDIT; }
@Override default SemanticsOf getSemantics() { return SemanticsOf.SAFE; }
@Override default ManagedObject execute(
final InteractionHead head, final Can parameters,
- final InteractionInitiatedBy interactionInitiatedBy) {
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final WhatViewer whatViewer) {
return map(simpleExecute(head, parameters));
}
@Override default ManagedObject executeWithRuleChecking(
final InteractionHead head, final Can parameters,
- final InteractionInitiatedBy interactionInitiatedBy, final Where where) throws AuthorizationException {
- return execute(head, parameters, interactionInitiatedBy);
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final VisibilityConstraint visibilityConstraint) throws AuthorizationException {
+ return execute(head, parameters, interactionInitiatedBy, visibilityConstraint.whatViewer());
}
// -- IMPLEMENTATIONS
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
index c322b857d3e..45e154fac3e 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedConstructor;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
@@ -38,13 +40,14 @@
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class ActionParameterAutoCompleteFacetViaMethod
extends ActionParameterAutoCompleteFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final ResolvedType paramSupportReturnType;
private final int minLength;
private final Optional patConstructor;
@@ -63,7 +66,7 @@ public ActionParameterAutoCompleteFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHOICES_OR_AUTOCOMPLETE;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
index b66cf424592..4dcdcd7715a 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedConstructor;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
@@ -38,13 +40,14 @@
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class ActionParameterChoicesFacetViaMethod
extends ActionParameterChoicesFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final ResolvedType paramSupportReturnType;
private final Optional patConstructor;
@@ -61,7 +64,7 @@ public ActionParameterChoicesFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHOICES_OR_AUTOCOMPLETE;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
index 349f16a3c1e..6ff0c4f338c 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.base._NullSafe;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedConstructor;
@@ -34,13 +36,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class ActionParameterDefaultsFacetViaMethod
extends ActionParameterDefaultsFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final int paramNum;
private final Optional patConstructor;
@@ -63,7 +66,7 @@ public ActionParameterDefaultsFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.DEFAULTS;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/ActionParameterDisabledFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/ActionParameterDisabledFacet.java
index 9e17a7b44ee..84d71e16308 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/ActionParameterDisabledFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/ActionParameterDisabledFacet.java
@@ -22,7 +22,6 @@
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.core.metamodel.consent.Consent.VetoReason;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor;
import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -33,7 +32,7 @@
* In the standard Apache Causeway Programming Model, corresponds to invoking the
* disableNXxx support method for an action.
*/
-public interface ActionParameterDisabledFacet extends Facet, DisablingInteractionAdvisor {
+public interface ActionParameterDisabledFacet extends DisablingInteractionAdvisor {
/**
* Reason why the parameter is disabled, or Optional.empts() if okay.
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
index 1557b86eeed..c2cb958daf1 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.services.i18n.TranslatableString;
import org.apache.causeway.applib.services.i18n.TranslationContext;
import org.apache.causeway.commons.collections.Can;
@@ -35,13 +37,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class ActionParameterDisabledFacetViaMethod
extends ActionParameterDisabledFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final TranslationContext translationContext;
private final Optional patConstructor;
@@ -57,7 +60,7 @@ public ActionParameterDisabledFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHECK_IF_VALID;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
deleted file mode 100644
index 3f4c1677373..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
+++ /dev/null
@@ -1,51 +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.core.metamodel.facets.param.hide;
-
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.interactions.vis.ParamVisibilityContext;
-import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
-
-public abstract class ActionParameterHiddenFacetAbstract
-extends FacetAbstract
-implements ActionParameterHiddenFacet {
-
- private static final Class extends Facet> type() {
- return ActionParameterHiddenFacet.class;
- }
-
- public ActionParameterHiddenFacetAbstract(final FacetHolder holder) {
- super(type(), holder);
- }
-
- @Override
- public String hides(final VisibilityContext context) {
- if (!(context instanceof ParamVisibilityContext)) {
- return null;
- }
- var actionArgVisibilityContext = (ParamVisibilityContext) context;
- return isHidden(
- actionArgVisibilityContext.target(),
- actionArgVisibilityContext.args())
- ? "Hidden"
- : null;
- }
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/ActionParameterHiddenFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/HiddenFacetForActionParameter.java
similarity index 91%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/ActionParameterHiddenFacet.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/HiddenFacetForActionParameter.java
index 9def2099734..2481d0cf4e9 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/ActionParameterHiddenFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/HiddenFacetForActionParameter.java
@@ -19,7 +19,6 @@
package org.apache.causeway.core.metamodel.facets.param.hide;
import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -31,8 +30,8 @@
* In the standard Apache Causeway Programming Model, corresponds to invoking the
* hideNXxx support method for an action.
*/
-public interface ActionParameterHiddenFacet
-extends Facet, HidingInteractionAdvisor {
+public interface HiddenFacetForActionParameter
+extends HidingInteractionAdvisor {
/**
* Whether the parameter is hidden.
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
index 2ea4457fba4..3dd97ac4ea7 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
@@ -24,11 +24,11 @@
import org.apache.causeway.core.metamodel.context.MetaModelContext;
import org.apache.causeway.core.metamodel.facets.FacetedMethodParameter;
import org.apache.causeway.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchResult;
-import org.apache.causeway.core.metamodel.facets.param.hide.ActionParameterHiddenFacet;
+import org.apache.causeway.core.metamodel.facets.param.hide.HiddenFacetForActionParameter;
import org.apache.causeway.core.metamodel.facets.param.support.ActionParameterSupportFacetFactoryAbstract;
/**
- * Sets up {@link ActionParameterHiddenFacet}.
+ * Sets up {@link HiddenFacetForActionParameter}.
*/
public class ActionParameterHiddenFacetViaMethodFactory
extends ActionParameterSupportFacetFactoryAbstract {
@@ -45,7 +45,7 @@ protected void onSearchResult(
var hideMethod = searchResult.supportingMethod();
var patConstructor = searchResult.patConstructor();
addFacet(
- new ActionParameterHiddenFacetViaMethod(
+ new HiddenFacetForActionParameterViaMethod(
hideMethod, patConstructor, paramAsHolder));
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/HiddenFacetForActionParameterViaMethod.java
similarity index 63%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/HiddenFacetForActionParameterViaMethod.java
index 1b042af9ba6..5a0413760d7 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/hide/method/HiddenFacetForActionParameterViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedConstructor;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
@@ -28,33 +30,40 @@
import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.ImperativeFacet;
-import org.apache.causeway.core.metamodel.facets.param.hide.ActionParameterHiddenFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.param.hide.HiddenFacetForActionParameter;
+import org.apache.causeway.core.metamodel.interactions.vis.ParamVisibilityContext;
+import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
-
-public class ActionParameterHiddenFacetViaMethod
-extends ActionParameterHiddenFacetAbstract
-implements ImperativeFacet {
+public record HiddenFacetForActionParameterViaMethod(
+ Can methods,
+ Optional patConstructor,
+ FacetHolder facetHolder
+ ) implements HiddenFacetForActionParameter, ImperativeFacet {
+
+ @Override public Class extends Facet> facetType() { return HiddenFacetForActionParameter.class; }
+ @Override public Precedence precedence() { return Precedence.DEFAULT; }
+ @Override public Intent intent() { return Intent.CHECK_IF_VALID;}
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
- private final @NonNull Optional patConstructor;
-
- public ActionParameterHiddenFacetViaMethod(
+ public HiddenFacetForActionParameterViaMethod(
final ResolvedMethod method,
final Optional patConstructor,
final FacetHolder holder) {
-
- super(holder);
- this.methods = ImperativeFacet.singleMethod(method, patConstructor);
- this.patConstructor = patConstructor;
+ this(ImperativeFacet.singleMethod(method, patConstructor), patConstructor, holder);
}
@Override
- public Intent getIntent() {
- return Intent.CHECK_IF_VALID;
+ public String hides(final VisibilityContext context) {
+ if (!(context instanceof ParamVisibilityContext)) {
+ return null;
+ }
+ var actionArgVisibilityContext = (ParamVisibilityContext) context;
+ return isHidden(
+ actionArgVisibilityContext.target(),
+ actionArgVisibilityContext.args())
+ ? "Hidden"
+ : null;
}
@Override
@@ -74,18 +83,18 @@ public boolean isHidden(
@Override
public boolean semanticEquals(final @NonNull Facet otherFacet) {
- if(! (otherFacet instanceof ActionParameterHiddenFacetViaMethod)) {
+ if(! (otherFacet instanceof HiddenFacetForActionParameterViaMethod)) {
return false;
}
- var other = (ActionParameterHiddenFacetViaMethod)otherFacet;
+ var other = (HiddenFacetForActionParameterViaMethod)otherFacet;
return this.patConstructor.equals(other.patConstructor)
- && this.getMethods().equals(other.getMethods());
+ && this.methods().equals(other.methods());
}
@Override
public void visitAttributes(final BiConsumer visitor) {
- super.visitAttributes(visitor);
+ HiddenFacetForActionParameter.super.visitAttributes(visitor);
ImperativeFacet.visitAttributes(this, visitor);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
index 40c70a6787a..1db3be69c8c 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.services.i18n.TranslatableString;
import org.apache.causeway.applib.services.i18n.TranslationContext;
import org.apache.causeway.commons.collections.Can;
@@ -34,13 +36,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class ActionParameterValidationFacetViaMethod
extends ActionParameterValidationFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final TranslationContext translationContext;
private final Optional patConstructor;
@@ -56,7 +59,7 @@ public ActionParameterValidationFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHECK_IF_VALID;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
index 10913b41585..54a3469e800 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -27,19 +29,21 @@
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.ImperativeFacet;
import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacetAbstract;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import org.apache.causeway.core.metamodel.object.MmVisibilityUtils;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyAccessorFacetViaAccessor
extends PropertyOrCollectionAccessorFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
public PropertyAccessorFacetViaAccessor(
final ObjectSpecification declaringType,
@@ -51,7 +55,7 @@ public PropertyAccessorFacetViaAccessor(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.ACCESSOR;
}
@@ -66,7 +70,7 @@ public Object getAssociationValueAsPojo(
if(isConfiguredToFilterForVisibility()) {
final ManagedObject referencedAdapter = getObjectManager().adapt(referencedObject);
final boolean visible = MmVisibilityUtils
- .isVisible(referencedAdapter, interactionInitiatedBy);
+ .isVisible(referencedAdapter, interactionInitiatedBy, WhatViewer.invalid());
if (!visible) return null;
}
return referencedObject;
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
index b5f98633ffe..52b0392efe0 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -33,13 +35,14 @@
import org.apache.causeway.core.metamodel.object.MmVisibilityUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyAutoCompleteFacetMethod
extends PropertyAutoCompleteFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final Class> choicesClass;
private final int minLength;
@@ -54,7 +57,7 @@ public PropertyAutoCompleteFacetMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHOICES_OR_AUTOCOMPLETE;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
index 830d1d907f2..e5855bef4b2 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -33,13 +35,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyChoicesFacetViaMethod
extends PropertyChoicesFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final Class> choicesClass;
public PropertyChoicesFacetViaMethod(
@@ -52,7 +55,7 @@ public PropertyChoicesFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHOICES_OR_AUTOCOMPLETE;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
index f1eb5b3c6aa..3e6a21e2664 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.exceptions.unrecoverable.UnknownTypeException;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
@@ -31,13 +33,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyDefaultFacetViaMethod
extends PropertyDefaultFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
public PropertyDefaultFacetViaMethod(
final ResolvedMethod method,
@@ -47,7 +50,7 @@ public PropertyDefaultFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.DEFAULTS;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java
index fa313b9c518..8e40de8f247 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java
@@ -23,11 +23,11 @@
import org.apache.causeway.applib.annotation.PropertyLayout;
import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetForLayoutAbstract;
import org.apache.causeway.core.metamodel.object.ManagedObject;
public class HiddenFacetForPropertyLayoutAnnotation
-extends HiddenFacetAbstract {
+extends HiddenFacetForLayoutAbstract {
public static Optional create(
final Optional propertyLayoutIfAny,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutXml.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutXml.java
index 2e3ded06dd0..d2fba54f62b 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutXml.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutXml.java
@@ -23,14 +23,14 @@
import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.layout.component.PropertyLayoutData;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
+import org.apache.causeway.core.metamodel.facets.members.hidden.HiddenFacetForLayoutAbstract;
import org.apache.causeway.core.metamodel.object.ManagedObject;
public class HiddenFacetForPropertyLayoutXml
-extends HiddenFacetAbstract {
+extends HiddenFacetForLayoutAbstract {
- public static Optional create(
+ public static Optional create(
final PropertyLayoutData propertyLayout,
final FacetHolder holder,
final Precedence precedence) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
index e8395fe1f2a..bb2b49ff5c4 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -31,13 +33,14 @@
import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyClearFacetViaClearMethod
extends PropertyClearFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
public PropertyClearFacetViaClearMethod(final ResolvedMethod method, final FacetHolder holder) {
super(holder);
@@ -45,7 +48,7 @@ public PropertyClearFacetViaClearMethod(final ResolvedMethod method, final Facet
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.MODIFY_PROPERTY_SUPPORTING;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
index 68897a2e357..d4ed62aa867 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -31,13 +33,14 @@
import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyClearFacetViaSetterMethod
extends PropertyClearFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
public PropertyClearFacetViaSetterMethod(final ResolvedMethod method, final FacetHolder holder) {
super(holder);
@@ -45,7 +48,7 @@ public PropertyClearFacetViaSetterMethod(final ResolvedMethod method, final Face
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.MODIFY_PROPERTY;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
index 42a06b25c9a..67d5bf40663 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -29,13 +31,14 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyInitializationFacetViaSetterMethod
extends PropertyInitializationFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
public PropertyInitializationFacetViaSetterMethod(final ResolvedMethod method, final FacetHolder holder) {
super(holder);
@@ -43,7 +46,7 @@ public PropertyInitializationFacetViaSetterMethod(final ResolvedMethod method, f
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
// LIMITATION: we cannot distinguish between setXxx being called for a modify or for an initialization
// so we just assume its a setter.
return Intent.MODIFY_PROPERTY;
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
index 73642bdd23b..d718108cdd5 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
@@ -31,13 +33,14 @@
import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertySetterFacetViaSetterMethod
extends PropertySetterFacetAbstract
implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
public PropertySetterFacetViaSetterMethod(final ResolvedMethod method, final FacetHolder holder) {
super(holder);
@@ -45,7 +48,7 @@ public PropertySetterFacetViaSetterMethod(final ResolvedMethod method, final Fac
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.MODIFY_PROPERTY;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
index 6d45cd1d404..e0f7c6d55fa 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
@@ -20,6 +20,8 @@
import java.util.function.BiConsumer;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.services.i18n.TranslatableString;
import org.apache.causeway.applib.services.i18n.TranslationContext;
import org.apache.causeway.commons.collections.Can;
@@ -32,11 +34,12 @@
import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import lombok.experimental.Accessors;
public class PropertyValidateFacetViaMethod extends PropertyValidateFacetAbstract implements ImperativeFacet {
- @Getter(onMethod_ = {@Override}) private final @NonNull Can methods;
+ @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+ private final @NonNull Can methods;
private final TranslationContext translationContext;
public PropertyValidateFacetViaMethod(
@@ -48,7 +51,7 @@ public PropertyValidateFacetViaMethod(
}
@Override
- public Intent getIntent() {
+ public Intent intent() {
return Intent.CHECK_IF_VALID;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/DisablingInteractionAdvisor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/DisablingInteractionAdvisor.java
index c7f2440c20c..2620328e176 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/DisablingInteractionAdvisor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/DisablingInteractionAdvisor.java
@@ -21,7 +21,8 @@
import java.util.Optional;
import org.apache.causeway.core.metamodel.consent.Consent.VetoReason;
-import org.apache.causeway.core.metamodel.facetapi.FacetWithAttributes.DisablingOrEnabling;
+import org.apache.causeway.core.metamodel.consent.InteractionAdvisor;
+import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
/**
@@ -32,7 +33,7 @@
* @see HidingInteractionAdvisor
*/
public interface DisablingInteractionAdvisor
-extends InteractionAdvisorFacet, DisablingOrEnabling {
+extends InteractionAdvisor, Facet {
/**
* Whether the rule represented by this facet disables the member to which
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/HidingInteractionAdvisor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/HidingInteractionAdvisor.java
index 37ec3e6e4ed..1d676d2b80d 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/HidingInteractionAdvisor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/HidingInteractionAdvisor.java
@@ -18,18 +18,33 @@
*/
package org.apache.causeway.core.metamodel.interactions;
-import org.apache.causeway.core.metamodel.facetapi.FacetWithAttributes.HidingOrShowing;
+import org.apache.causeway.core.metamodel.consent.InteractionAdvisor;
+import org.apache.causeway.core.metamodel.facetapi.Facet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForObject;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForNoMembersAuthorized;
import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
/**
- * Mix-in interface for facets that can advise as to whether a member should be
- * hidden.
+ * Mechanism for determining whether an object or member should be hidden.
*
+ * Even though all the properties of an object may themselves be visible, there
+ * could be reasons to hide the object.
+ *
+ *
In the standard Apache Causeway Programming Model, typically corresponds to the
+ * hidden method.
+ *
+ * @see HiddenFacetForLayout
+ * @see HiddenFacetForObject
+ * @see HiddenFacetForNoMembersAuthorized
* @see DisablingInteractionAdvisor
* @see ValidatingInteractionAdvisor
+ *
+ * @apiNote An unification attempt on HiddenTypeFacet and HiddenObjectFacet into a single,
+ * failed, because both facets must co-exist, where each has veto power (not one overruling the other).
*/
public interface HidingInteractionAdvisor
-extends InteractionAdvisorFacet, HidingOrShowing {
+extends InteractionAdvisor, Facet {
/**
* Whether the rule represented by this facet hides the member to which it
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionAdvisorFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionAdvisorFacet.java
deleted file mode 100644
index 8d51bc3d318..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionAdvisorFacet.java
+++ /dev/null
@@ -1,43 +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.core.metamodel.interactions;
-
-import org.apache.causeway.core.metamodel.consent.Allow;
-import org.apache.causeway.core.metamodel.consent.Consent;
-import org.apache.causeway.core.metamodel.consent.InteractionAdvisor;
-import org.apache.causeway.core.metamodel.consent.Veto;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-
-/**
- * Used by {@link Consent} (specifically the main implementations {@link Allow}
- * and {@link Veto}), with the idea being that the only things that can create
- * {@link Consent} objects are {@link Facet}s.
- *
- *
- * TODO: note, this is a work-in-progress, because the DnD viewer in particular
- * creates its own {@link Allow}s and {@link Veto}s. The constructors that it
- * uses have been deprecated to flag that the DnD logic should move into
- * {@link Facet}s that implement this interface.
- *
- * @author Dan Haywood
- *
- */
-public interface InteractionAdvisorFacet extends InteractionAdvisor, Facet {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionContext.java
index c7c15861a05..1570aaa4a11 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionContext.java
@@ -19,7 +19,6 @@
package org.apache.causeway.core.metamodel.interactions;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.InteractionEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
@@ -93,11 +92,6 @@ public interface InteractionContext {
*/
InteractionHead head();
- /**
- * Where the element is to be rendered.
- */
- Where where();
-
/**
* The target object that this interaction is associated with.
*/
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
index d88b2f462a9..960fc6bbc0d 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
@@ -19,14 +19,13 @@
package org.apache.causeway.core.metamodel.interactions;
import java.util.Optional;
+import java.util.function.Supplier;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.Identifier;
import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.core.config.CausewayConfiguration;
-import org.apache.causeway.core.config.environment.DeploymentType;
import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants;
import org.apache.causeway.core.metamodel.consent.Consent;
import org.apache.causeway.core.metamodel.consent.InteractionAdvisor;
@@ -39,7 +38,6 @@
import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
import org.apache.causeway.core.metamodel.interactions.val.ValidityContext;
import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
@@ -73,7 +71,8 @@ public InteractionResult isVisibleResult(final FacetHolder facetHolder, final Vi
return builder.build();
}
- public InteractionResult isUsableResult(final FacetHolder facetHolder, final UsabilityContext context) {
+ public InteractionResult isUsableResult(final FacetHolder facetHolder, final UsabilityContext context,
+ final Supplier visibilityContextSupplierForDebugging) {
var builder = InteractionResult.builder(context.createInteractionEvent());
@@ -84,11 +83,10 @@ public InteractionResult isUsableResult(final FacetHolder facetHolder, final Usa
break;
case SHOW_AS_DISABLED:
case SHOW_AS_DISABLED_WITH_DIAGNOSTICS:
- var visibilityContext = context.asVisibilityContext();
- facetHolder.streamFacets(HidingInteractionAdvisor.class)
+ facetHolder.streamFacets(HidingInteractionAdvisor.class)
.filter(advisor->compatible(advisor, context))
.forEach(advisor->{
- _Strings.nonEmpty(advisor.hides(visibilityContext))
+ _Strings.nonEmpty(advisor.hides(visibilityContextSupplierForDebugging.get()))
.map(Consent.VetoReason::explicit)
.ifPresent(hidingReason->{
if(ifHiddenPolicy.isShowAsDisabledWithDiagnostics()) {
@@ -139,12 +137,6 @@ public InteractionResultSet isValidResultSet(
return resultSet.add(isValidResult(facetHolder, context));
}
- public RenderPolicy renderPolicy(final ManagedObject ownerAdapter) {
- return new RenderPolicy(
- determineIfHiddenPolicyFrom(ownerAdapter),
- determineIfDisabledPolicyFrom(ownerAdapter));
- }
-
// -- HELPER
/**
@@ -167,13 +159,11 @@ private Optional guardAgainstEmptyReasonString(
private static boolean compatible(final InteractionAdvisor advisor, final InteractionContext ic) {
if(ic.initiatedBy().isPassThrough()
- && isDomainEventAdvisor(advisor)) {
- //[CAUSEWAY-3810] when pass-through, then don't trigger any domain events
+ && isDomainEventAdvisor(advisor))
+ //[CAUSEWAY-3810] when pass-through, then don't trigger any domain events
return false;
- }
- if(advisor instanceof ActionDomainEventFacet) {
- return ic instanceof ActionInteractionContext;
- }
+ if(advisor instanceof ActionDomainEventFacet)
+ return ic instanceof ActionInteractionContext;
return true;
}
@@ -181,25 +171,4 @@ private static boolean isDomainEventAdvisor(final InteractionAdvisor advisor) {
return advisor instanceof DomainEventFacetAbstract;
}
- private CausewayConfiguration.Prototyping.IfHiddenPolicy determineIfHiddenPolicyFrom(final ManagedObject ownerAdapter) {
- DeploymentType deploymentType = ownerAdapter.getSystemEnvironment().deploymentType();
- switch (deploymentType) {
- case PROTOTYPING:
- return ownerAdapter.getConfiguration().prototyping().ifHiddenPolicy();
- case PRODUCTION:
- default:
- return CausewayConfiguration.Prototyping.IfHiddenPolicy.HIDE;
- }
- }
-
- private CausewayConfiguration.Prototyping.IfDisabledPolicy determineIfDisabledPolicyFrom(final ManagedObject ownerAdapter) {
- DeploymentType deploymentType = ownerAdapter.getSystemEnvironment().deploymentType();
- switch (deploymentType) {
- case PROTOTYPING:
- return ownerAdapter.getConfiguration().prototyping().ifDisabledPolicy();
- case PRODUCTION:
- default:
- return CausewayConfiguration.Prototyping.IfDisabledPolicy.DISABLE;
- }
- }
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/RenderPolicy.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/RenderPolicy.java
index ad171b9d1a2..f86ead9c360 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/RenderPolicy.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/RenderPolicy.java
@@ -23,6 +23,7 @@
import org.jspecify.annotations.NonNull;
import org.apache.causeway.core.config.CausewayConfiguration;
+import org.apache.causeway.core.metamodel.context.MetaModelContext;
/**
* Troubleshooting Visibility and Usability
@@ -66,7 +67,22 @@ public record RenderPolicy(
*/
CausewayConfiguration.Prototyping.@NonNull IfDisabledPolicy ifDisabledPolicy
) implements Serializable {
-
+
+ /**
+ * Counterpart to {@link #forActionParameters()}, that is objects and members, but not parameters.
+ */
+ public static RenderPolicy forNonActionParam(MetaModelContext mmc) {
+ return new RenderPolicy(
+ switch (mmc.getSystemEnvironment().deploymentType()) {
+ case PROTOTYPING->mmc.getConfiguration().prototyping().ifHiddenPolicy();
+ case PRODUCTION->CausewayConfiguration.Prototyping.IfHiddenPolicy.HIDE;
+ },
+ switch (mmc.getSystemEnvironment().deploymentType()) {
+ case PROTOTYPING -> mmc.getConfiguration().prototyping().ifDisabledPolicy();
+ case PRODUCTION -> CausewayConfiguration.Prototyping.IfDisabledPolicy.DISABLE;
+ });
+ }
+
/**
* Always HIDE and DISABLE.
*/
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/ValidatingInteractionAdvisor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/ValidatingInteractionAdvisor.java
index 469505eeab3..33c569418c3 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/ValidatingInteractionAdvisor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/ValidatingInteractionAdvisor.java
@@ -18,8 +18,8 @@
*/
package org.apache.causeway.core.metamodel.interactions;
+import org.apache.causeway.core.metamodel.consent.InteractionAdvisor;
import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetWithAttributes.Validating;
import org.apache.causeway.core.metamodel.interactions.val.ValidityContext;
/**
@@ -33,7 +33,8 @@
* @see DisablingInteractionAdvisor
* @see HidingInteractionAdvisor
*/
-public interface ValidatingInteractionAdvisor extends InteractionAdvisorFacet, Validating {
+public interface ValidatingInteractionAdvisor
+extends InteractionAdvisor, Facet {
/**
* Whether the validation represented by this facet passes or fails.
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetNone.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/VisibilityConstraint.java
similarity index 60%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetNone.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/VisibilityConstraint.java
index b151fe944c6..ebda1a73edc 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/hidden/method/HideForContextFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/VisibilityConstraint.java
@@ -16,24 +16,20 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.causeway.core.metamodel.facets.members.hidden.method;
+package org.apache.causeway.core.metamodel.interactions;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
+import org.apache.causeway.applib.annotation.Where;
-public class HideForContextFacetNone
-extends HideForContextFacetAbstract {
+public record VisibilityConstraint(
+ WhatViewer whatViewer,
+ Where where) {
- public HideForContextFacetNone(final FacetHolder holder) {
- super(holder, Precedence.FALLBACK);
- }
+ public static VisibilityConstraint noViewer(final Where where) {
+ return new VisibilityConstraint(WhatViewer.noViewer(), where);
+ }
- /**
- * Always returns null.
- */
- @Override
- public String hides(final VisibilityContext ic) {
- return null;
- }
+ public VisibilityConstraint withWhere(final Where where) {
+ return new VisibilityConstraint(whatViewer, where);
+ }
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/WhatViewer.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/WhatViewer.java
new file mode 100644
index 00000000000..73e8c94dcca
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/WhatViewer.java
@@ -0,0 +1,44 @@
+/*
+ * 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.core.metamodel.interactions;
+
+import org.apache.causeway.applib.services.command.CommandExecutorService;
+import org.apache.causeway.applib.services.wrapper.WrapperFactory;
+
+/**
+ * Viewer identifier, used for viewer specific feature filtering.
+ */
+public record WhatViewer(
+ String viewerId) {
+
+ /**
+ * Used by {@link WrapperFactory}, {@link CommandExecutorService} and Object title interaction.
+ */
+ public static WhatViewer noViewer() {
+ return new WhatViewer("NoViewer");
+ }
+
+ /**
+ * @deprecated for refactoring only
+ */
+ @Deprecated
+ public static WhatViewer invalid() {
+ return new WhatViewer("invalid");
+ }
+}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java
index 86e3fb2962e..d1ff4704ee7 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java
@@ -24,11 +24,11 @@
import org.jspecify.annotations.NonNull;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.functional.Railway;
import org.apache.causeway.commons.internal.exceptions._Exceptions;
import org.apache.causeway.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.ManagedObjects;
import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
@@ -66,17 +66,17 @@ public static interface ParameterInvalidCallback {
public static ActionInteraction start(
final @NonNull ManagedObject owner,
final @NonNull String memberId,
- final @NonNull Where where) {
- return startWithMultiselect(owner, memberId, where, Can::empty);
+ final @NonNull VisibilityConstraint visibilityConstraint) {
+ return startWithMultiselect(owner, memberId, visibilityConstraint, Can::empty);
}
public static ActionInteraction startWithMultiselect(
final @NonNull ManagedObject owner,
final @NonNull String actionId,
- final @NonNull Where where,
+ final @NonNull VisibilityConstraint visibilityConstraint,
final @NonNull MultiselectChoices multiselectChoices) {
- var managedAction = ManagedAction.lookupActionWithMultiselect(owner, actionId, where, multiselectChoices);
+ var managedAction = ManagedAction.lookupActionWithMultiselect(owner, actionId, visibilityConstraint, multiselectChoices);
final InteractionRailway railway = managedAction.isPresent()
? InteractionRailway.success(managedAction.get())
@@ -84,7 +84,7 @@ public static ActionInteraction startWithMultiselect(
return new ActionInteraction(
actionId,
- managedAction.map(x->x.getAction()),
+ managedAction.map(ManagedAction::getAction),
railway);
}
@@ -92,7 +92,7 @@ public static ActionInteraction startWithMultiselect(
public static ActionInteraction startAsBoundToProperty(
final ManagedProperty associatedWithProperty,
final String memberId,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
var propertyOwner = associatedWithProperty.getOwner();
var prop = associatedWithProperty.getMetaModel();
var elementType = prop.getElementType();
@@ -117,12 +117,12 @@ public static ActionInteraction startAsBoundToProperty(
var mixinAction = valueFacet.selectCompositeValueMixinForProperty(associatedWithProperty);
if(mixinAction.isPresent()) {
- var managedAction = ManagedAction.of(compositeValue, mixinAction.get(), where);
+ var managedAction = ManagedAction.of(compositeValue, mixinAction.get(), visibilityConstraint);
return ActionInteraction.wrap(managedAction);
}
}
// fallback if not a composite value
- return ActionInteraction.start(propertyOwner, memberId, where);
+ return ActionInteraction.start(propertyOwner, memberId, visibilityConstraint);
}
/** Supports composite-value-types via mixin (in case detected). */
@@ -130,7 +130,7 @@ public static ActionInteraction startAsBoundToParameter(
final ParameterNegotiationModel parameterNegotiationModel,
final int paramIndex,
final String memberId,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
var actionOwner = parameterNegotiationModel.getActionTarget();
var param = parameterNegotiationModel.getParamModels().getElseFail(paramIndex);
@@ -155,13 +155,13 @@ public static ActionInteraction startAsBoundToParameter(
var mixinAction = valueFacet.selectCompositeValueMixinForParameter(parameterNegotiationModel, paramIndex);
if(mixinAction.isPresent()) {
- var managedAction = ManagedAction.of(compositeValue, mixinAction.get(), where);
+ var managedAction = ManagedAction.of(compositeValue, mixinAction.get(), visibilityConstraint);
return ActionInteraction.wrap(managedAction);
}
}
// else if not a composite value
- return ActionInteraction.start(actionOwner, memberId, where);
+ return ActionInteraction.start(actionOwner, memberId, visibilityConstraint);
}
public static ActionInteraction wrap(final @NonNull ManagedAction managedAction) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java
index d8879f43140..fc733248605 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java
@@ -24,7 +24,7 @@
import org.jspecify.annotations.NonNull;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
public record CollectionInteraction(
@@ -34,9 +34,9 @@ public record CollectionInteraction(
public static final CollectionInteraction start(
final @NonNull ManagedObject owner,
final @NonNull String memberId,
- final @NonNull Where where) {
+ final @NonNull VisibilityConstraint visibilityConstraint) {
- var managedCollection = ManagedCollection.lookupCollection(owner, memberId, where);
+ var managedCollection = ManagedCollection.lookupCollection(owner, memberId, visibilityConstraint);
final InteractionRailway railway = managedCollection.isPresent()
? InteractionRailway.success(managedCollection.get())
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java
index 5b21c9409c2..1931fb43080 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java
@@ -25,7 +25,6 @@
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.registry.ServiceRegistry;
import org.apache.causeway.applib.services.routing.RoutingService;
import org.apache.causeway.commons.collections.Can;
@@ -36,6 +35,7 @@
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.context.MetaModelContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.ManagedObjects;
import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
@@ -55,27 +55,27 @@ public final class ManagedAction extends ManagedMember {
public static final ManagedAction of(
final @NonNull ManagedObject owner,
final @NonNull ObjectAction action,
- final @NonNull Where where) {
- return new ManagedAction(owner, action, where, Can::empty);
+ final @NonNull VisibilityConstraint visibilityConstraint) {
+ return new ManagedAction(owner, action, visibilityConstraint, Can::empty);
}
public static final Optional lookupAction(
final @NonNull ManagedObject owner,
final @NonNull String memberId,
- final @NonNull Where where) {
+ final @NonNull VisibilityConstraint visibilityConstraint) {
return ManagedMember.lookup(owner.objSpec(), Identifier.Type.ACTION, memberId)
- .map(objectAction -> of(owner, objectAction, where));
+ .map(objectAction -> of(owner, objectAction, visibilityConstraint));
}
public static final Optional lookupActionWithMultiselect(
final @NonNull ManagedObject owner,
final @NonNull String memberId,
- final @NonNull Where where,
+ final @NonNull VisibilityConstraint visibilityConstraint,
final @NonNull MultiselectChoices multiselectChoices) {
return ManagedMember.lookup(owner.objSpec(), Identifier.Type.ACTION, memberId)
- .map(objectAction -> new ManagedAction(owner, objectAction, where, multiselectChoices));
+ .map(objectAction -> new ManagedAction(owner, objectAction, visibilityConstraint, multiselectChoices));
}
// -- IMPLEMENTATION
@@ -86,10 +86,10 @@ public static final Optional lookupActionWithMultiselect(
private ManagedAction(
final @NonNull ManagedObject owner,
final @NonNull ObjectAction action,
- final @NonNull Where where,
+ final @NonNull VisibilityConstraint visibilityConstraint,
final @NonNull MultiselectChoices multiselectChoices) {
- super(owner, where);
+ super(owner, visibilityConstraint);
/* entities might become removed, but even though removed, an entity delete mixin say,
may still want to provide an action result, that does not need the mixee instance to be produced;
eg. delete ApplicationUser mixin that returns a collection of all remaining users
@@ -140,7 +140,7 @@ public Railway invoke(
final ManagedObject actionResult = getAction()
// under the hood intercepts cases, where the owner is a value-type;
// executions on value-types have no rule checking and trigger no domain events
- .execute(interactionHead(), actionParameters, interactionInitiatedBy);
+ .execute(interactionHead(), actionParameters, interactionInitiatedBy, visibilityConstraint().whatViewer());
return Railway.success(route(actionResult));
}
@@ -158,7 +158,7 @@ public final ManagedObject invokeWithRuleChecking(
// under the hood intercepts cases, where the owner is a value-type;
// executions on value-types have no rule checking and trigger no domain events
.executeWithRuleChecking(
- interactionHead(), actionParameters, InteractionInitiatedBy.USER, getWhere());
+ interactionHead(), actionParameters, InteractionInitiatedBy.USER, visibilityConstraint());
return route(actionResult);
}
@@ -167,9 +167,8 @@ public final ManagedObject invokeWithRuleChecking(
private ManagedObject route(final @Nullable ManagedObject actionResult) {
- if(ManagedObjects.isNullOrUnspecifiedOrEmpty(actionResult)) {
- return ManagedObject.empty(action.getReturnType());
- }
+ if(ManagedObjects.isNullOrUnspecifiedOrEmpty(actionResult))
+ return ManagedObject.empty(action.getReturnType());
var resultPojo = actionResult.getPojo();
var objManager = mmc().getObjectManager();
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedCollection.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedCollection.java
index 6cf1b7e8b9e..aefd00b0902 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedCollection.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedCollection.java
@@ -21,18 +21,19 @@
import java.util.Optional;
import java.util.stream.Stream;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.facets.collections.CollectionFacet;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.causeway.core.metamodel.tabular.DataTableInteractive;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
public final class ManagedCollection extends ManagedMember {
@@ -41,17 +42,17 @@ public final class ManagedCollection extends ManagedMember {
public static final ManagedCollection of(
final @NonNull ManagedObject owner,
final @NonNull OneToManyAssociation collection,
- final @NonNull Where where) {
- return new ManagedCollection(owner, collection, where);
+ final @NonNull VisibilityConstraint visibilityConstraint) {
+ return new ManagedCollection(owner, collection, visibilityConstraint);
}
public static final Optional lookupCollection(
final @NonNull ManagedObject owner,
final @NonNull String memberId,
- final @NonNull Where where) {
+ final @NonNull VisibilityConstraint visibilityConstraint) {
return ManagedMember.lookup(owner.objSpec(), Identifier.Type.COLLECTION, memberId)
- .map(objectAction -> of(owner, objectAction, where));
+ .map(objectAction -> of(owner, objectAction, visibilityConstraint));
}
// -- IMPLEMENTATION
@@ -61,9 +62,9 @@ public static final Optional lookupCollection(
private ManagedCollection(
final @NonNull ManagedObject owner,
final @NonNull OneToManyAssociation collection,
- final @NonNull Where where) {
+ final @NonNull VisibilityConstraint visibilityConstraint) {
- super(owner, where);
+ super(owner, visibilityConstraint);
this.collection = collection;
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedMember.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedMember.java
index 036d664117b..65745bf850a 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedMember.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedMember.java
@@ -23,10 +23,10 @@
import org.jspecify.annotations.NonNull;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.internal.base._Casts;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.consent.Veto;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
@@ -34,6 +34,7 @@
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
+import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -59,7 +60,7 @@ public enum RepresentationMode {
@Getter @NonNull private ManagedObject owner;
- @Getter @NonNull private final Where where;
+ @Getter @Accessors(fluent = true) @NonNull private final VisibilityConstraint visibilityConstraint;
/**
* Allows a managed property of a view model to replace its owner with a clone.
@@ -110,11 +111,10 @@ public Optional getDescription() {
* @return non-empty if hidden
*/
public Optional checkVisibility() {
-
try {
var visibilityConsent =
getMetaModel()
- .isVisible(getOwner(), InteractionInitiatedBy.USER, where);
+ .isVisible(getOwner(), InteractionInitiatedBy.USER, visibilityConstraint);
return visibilityConsent.isVetoed()
? Optional.of(InteractionVeto.hidden(visibilityConsent))
@@ -133,12 +133,10 @@ public Optional checkVisibility() {
* @return non-empty if not usable/editable (meaning if read-only)
*/
public Optional checkUsability() {
-
try {
-
var usabilityConsent =
getMetaModel()
- .isUsable(getOwner(), InteractionInitiatedBy.USER, where);
+ .isUsable(getOwner(), InteractionInitiatedBy.USER, visibilityConstraint);
return usabilityConsent.isVetoed()
? Optional.of(InteractionVeto.readonly(usabilityConsent))
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java
index 9dd7f766f72..2f0b96c8062 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java
@@ -20,22 +20,22 @@
import java.util.Optional;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.binding.Observable;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.binding._Observables;
import org.apache.causeway.commons.internal.binding._Observables.LazyObservable;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.consent.Veto;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -47,17 +47,17 @@ public final class ManagedProperty
public static final ManagedProperty of(
final @NonNull ManagedObject owner,
final @NonNull OneToOneAssociation property,
- final @NonNull Where where) {
- return new ManagedProperty(owner, property, where);
+ final @NonNull VisibilityConstraint visibilityConstraint) {
+ return new ManagedProperty(owner, property, visibilityConstraint);
}
public static final Optional lookupProperty(
final @NonNull ManagedObject owner,
final @NonNull String memberId,
- final @NonNull Where where) {
+ final @NonNull VisibilityConstraint visibilityConstraint) {
return ManagedMember.lookup(owner.objSpec(), Identifier.Type.PROPERTY, memberId)
- .map(objectAction -> of(owner, objectAction, where));
+ .map(objectAction -> of(owner, objectAction, visibilityConstraint));
}
// -- IMPLEMENTATION
@@ -72,8 +72,8 @@ public static final Optional lookupProperty(
private ManagedProperty(
final @NonNull ManagedObject owner,
final @NonNull OneToOneAssociation property,
- final @NonNull Where where) {
- super(owner, where);
+ final @NonNull VisibilityConstraint visibilityConstraint) {
+ super(owner, visibilityConstraint);
this.property = property;
observablePropValue = _Observables.lazy(this::reassessPropertyValue);
}
@@ -132,9 +132,8 @@ public Optional modifyProperty(final @Nullable ManagedObject ne
private ManagedObject reassessPropertyValue() {
var property = getProperty();
var owner = getOwner();
-
- return property.isVisible(owner, InteractionInitiatedBy.FRAMEWORK, getWhere()).isAllowed()
- && property.isVisible(owner, InteractionInitiatedBy.USER, getWhere()).isAllowed()
+ return property.isVisible(owner, InteractionInitiatedBy.FRAMEWORK, visibilityConstraint()).isAllowed()
+ && property.isVisible(owner, InteractionInitiatedBy.USER, visibilityConstraint()).isAllowed()
? property.get(owner, InteractionInitiatedBy.USER)
: ManagedObject.empty(property.getElementType());
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java
index 097593bb387..fd7ce7114d8 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java
@@ -24,7 +24,7 @@
import org.jspecify.annotations.NonNull;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
public record PropertyInteraction(
@@ -34,9 +34,9 @@ public record PropertyInteraction(
public static final PropertyInteraction start(
final @NonNull ManagedObject owner,
final @NonNull String memberId,
- final @NonNull Where where) {
+ final @NonNull VisibilityConstraint visibilityConstraint) {
- var managedProperty = ManagedProperty.lookupProperty(owner, memberId, where);
+ var managedProperty = ManagedProperty.lookupProperty(owner, memberId, visibilityConstraint);
final InteractionRailway railway = managedProperty.isPresent()
? InteractionRailway.success(managedProperty.get())
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ActionUsabilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ActionUsabilityContext.java
index 6780cbff485..6b2c4be3e1f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ActionUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ActionUsabilityContext.java
@@ -19,7 +19,6 @@
package org.apache.causeway.core.metamodel.interactions.use;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.ActionUsabilityEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
@@ -27,7 +26,6 @@
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
-import org.apache.causeway.core.metamodel.interactions.vis.ActionVisibilityContext;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -40,7 +38,6 @@ public record ActionUsabilityContext(
InteractionHead head,
Identifier identifier,
InteractionInitiatedBy initiatedBy,
- Where where,
RenderPolicy renderPolicy,
ObjectAction objectAction
)
@@ -51,10 +48,9 @@ public ActionUsabilityContext(
final ObjectAction objectAction,
final Identifier id,
final InteractionInitiatedBy initiatedBy,
- final Where where,
final RenderPolicy renderPolicy) {
this(InteractionContextType.ACTION_USABLE,
- head, id, initiatedBy, where, renderPolicy,
+ head, id, initiatedBy, renderPolicy,
objectAction);
}
@@ -63,9 +59,4 @@ public ActionUsabilityEvent createInteractionEvent() {
return new ActionUsabilityEvent(MmUnwrapUtils.single(target()), identifier());
}
- @Override
- public ActionVisibilityContext asVisibilityContext() {
- return new ActionVisibilityContext(head(), objectAction(), identifier(),
- initiatedBy(), where(), renderPolicy());
- }
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/CollectionUsabilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/CollectionUsabilityContext.java
index d494fefb1de..56c9552a304 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/CollectionUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/CollectionUsabilityContext.java
@@ -19,14 +19,12 @@
package org.apache.causeway.core.metamodel.interactions.use;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.CollectionUsabilityEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
-import org.apache.causeway.core.metamodel.interactions.vis.CollectionVisibilityContext;
/**
* See {@link InteractionContext} for overview; analogous to
@@ -37,7 +35,6 @@ public record CollectionUsabilityContext(
InteractionHead head,
Identifier identifier,
InteractionInitiatedBy initiatedBy,
- Where where,
RenderPolicy renderPolicy)
implements UsabilityContext {
@@ -45,20 +42,13 @@ public CollectionUsabilityContext(
final InteractionHead head,
final Identifier identifier,
final InteractionInitiatedBy initiatedBy,
- final Where where,
final RenderPolicy renderPolicy) {
this(InteractionContextType.COLLECTION_USABLE,
- head, identifier, initiatedBy, where, renderPolicy);
+ head, identifier, initiatedBy, renderPolicy);
}
@Override
public CollectionUsabilityEvent createInteractionEvent() {
return new CollectionUsabilityEvent(target().getPojo(), identifier());
}
-
- @Override
- public CollectionVisibilityContext asVisibilityContext() {
- return new CollectionVisibilityContext(head(), identifier(),
- initiatedBy(), where(), renderPolicy());
- }
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ParamUsabilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ParamUsabilityContext.java
index a28348cbb85..2f141e711a2 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ParamUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/ParamUsabilityContext.java
@@ -19,7 +19,6 @@
package org.apache.causeway.core.metamodel.interactions.use;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.events.ActionArgumentUsabilityEvent;
import org.apache.causeway.applib.services.wrapper.events.ActionArgumentEvent;
import org.apache.causeway.commons.collections.Can;
@@ -29,7 +28,6 @@
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
-import org.apache.causeway.core.metamodel.interactions.vis.ParamVisibilityContext;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -43,7 +41,6 @@ public record ParamUsabilityContext(
InteractionHead head,
Identifier identifier,
InteractionInitiatedBy initiatedBy,
- Where where,
RenderPolicy renderPolicy,
ObjectAction objectAction,
Can args,
@@ -60,7 +57,7 @@ public ParamUsabilityContext(
final RenderPolicy renderPolicy) {
this(InteractionContextType.ACTION_PARAMETER_USABLE,
- head, id, initiatedBy, Where.OBJECT_FORMS, renderPolicy,
+ head, id, initiatedBy, renderPolicy,
objectAction, args, position);
}
@@ -73,10 +70,4 @@ public ActionArgumentUsabilityEvent createInteractionEvent() {
position());
}
- @Override
- public ParamVisibilityContext asVisibilityContext() {
- return new ParamVisibilityContext(head(), objectAction(), identifier(),
- args, position, initiatedBy(), renderPolicy());
- }
-
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/PropertyUsabilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/PropertyUsabilityContext.java
index 8ab024f0e05..71be348a788 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/PropertyUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/PropertyUsabilityContext.java
@@ -19,14 +19,12 @@
package org.apache.causeway.core.metamodel.interactions.use;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.PropertyUsabilityEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
-import org.apache.causeway.core.metamodel.interactions.vis.PropertyVisibilityContext;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
/**
@@ -38,7 +36,6 @@ public record PropertyUsabilityContext(
InteractionHead head,
Identifier identifier,
InteractionInitiatedBy initiatedBy,
- Where where,
RenderPolicy renderPolicy)
implements UsabilityContext {
@@ -46,10 +43,9 @@ public PropertyUsabilityContext(
final InteractionHead head,
final Identifier identifier,
final InteractionInitiatedBy initiatedBy,
- final Where where,
final RenderPolicy renderPolicy) {
this(InteractionContextType.PROPERTY_USABLE,
- head, identifier, initiatedBy, where, renderPolicy);
+ head, identifier, initiatedBy, renderPolicy);
}
@Override
@@ -57,9 +53,4 @@ public PropertyUsabilityEvent createInteractionEvent() {
return new PropertyUsabilityEvent(MmUnwrapUtils.single(target()), identifier());
}
- @Override
- public PropertyVisibilityContext asVisibilityContext() {
- return new PropertyVisibilityContext(head(), identifier(),
- initiatedBy(), where(), renderPolicy());
- }
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/UsabilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/UsabilityContext.java
index 9edbce3254c..3aafe9c9fee 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/UsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/use/UsabilityContext.java
@@ -22,13 +22,14 @@
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionEventSupplier;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
-import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
public sealed interface UsabilityContext
extends InteractionContext, InteractionEventSupplier
permits ActionUsabilityContext, CollectionUsabilityContext, ParamUsabilityContext, PropertyUsabilityContext {
+ /**
+ * for debugging usability when prototyping
+ */
RenderPolicy renderPolicy();
- VisibilityContext asVisibilityContext();
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/val/ValidityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/val/ValidityContext.java
index 04c1610c9df..af8dac64ebf 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/val/ValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/val/ValidityContext.java
@@ -20,7 +20,6 @@
import java.util.function.Supplier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.ValidityEvent;
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionEventSupplier;
@@ -35,9 +34,4 @@ default String friendlyName() {
return friendlyNameProvider().get();
}
- @Override
- default Where where() {
- return Where.NOT_SPECIFIED;
- }
-
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ActionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ActionVisibilityContext.java
index f9415271a89..54489c173ff 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ActionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ActionVisibilityContext.java
@@ -19,7 +19,6 @@
package org.apache.causeway.core.metamodel.interactions.vis;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.ActionVisibilityEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
@@ -27,6 +26,7 @@
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -35,13 +35,13 @@
* {@link ActionVisibilityEvent}.
*/
public record ActionVisibilityContext(
- InteractionContextType interactionType,
- InteractionHead head,
- Identifier identifier,
- InteractionInitiatedBy initiatedBy,
- Where where,
- RenderPolicy renderPolicy,
- ObjectAction objectAction)
+ InteractionContextType interactionType,
+ InteractionHead head,
+ Identifier identifier,
+ InteractionInitiatedBy initiatedBy,
+ VisibilityConstraint visibilityConstraint,
+ RenderPolicy renderPolicy,
+ ObjectAction objectAction)
implements VisibilityContext, ActionInteractionContext {
public ActionVisibilityContext(
@@ -49,10 +49,10 @@ public ActionVisibilityContext(
final ObjectAction objectAction,
final Identifier identifier,
final InteractionInitiatedBy initiatedBy,
- final Where where,
+ final VisibilityConstraint visibilityConstraint,
final RenderPolicy renderPolicy) {
this(InteractionContextType.ACTION_VISIBLE,
- head, identifier, initiatedBy, where, renderPolicy,
+ head, identifier, initiatedBy, visibilityConstraint, renderPolicy,
objectAction);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/CollectionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/CollectionVisibilityContext.java
index 4ee46ff2bec..cfb2c1c1a5c 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/CollectionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/CollectionVisibilityContext.java
@@ -19,13 +19,13 @@
package org.apache.causeway.core.metamodel.interactions.vis;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.CollectionVisibilityEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
/**
@@ -33,22 +33,22 @@
* {@link CollectionVisibilityEvent}.
*/
public record CollectionVisibilityContext(
- InteractionContextType interactionType,
- InteractionHead head,
- Identifier identifier,
- InteractionInitiatedBy initiatedBy,
- Where where,
- RenderPolicy renderPolicy)
+ InteractionContextType interactionType,
+ InteractionHead head,
+ Identifier identifier,
+ InteractionInitiatedBy initiatedBy,
+ VisibilityConstraint visibilityConstraint,
+ RenderPolicy renderPolicy)
implements VisibilityContext {
public CollectionVisibilityContext(
final InteractionHead head,
final Identifier identifierAdapter,
final InteractionInitiatedBy initiatedBy,
- final Where where,
+ final VisibilityConstraint visibilityConstraint,
final RenderPolicy renderPolicy) {
this(InteractionContextType.COLLECTION_VISIBLE,
- head, identifierAdapter, initiatedBy, where, renderPolicy);
+ head, identifierAdapter, initiatedBy, visibilityConstraint, renderPolicy);
}
@Override
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ObjectVisibilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ObjectVisibilityContext.java
index 4f542b7b043..460c2b8df1d 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ObjectVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ObjectVisibilityContext.java
@@ -19,15 +19,14 @@
package org.apache.causeway.core.metamodel.interactions.vis;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.ObjectVisibilityEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
-import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
import org.apache.causeway.core.metamodel.interactions.ProposedHolder;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
@@ -36,12 +35,12 @@
* {@link ObjectVisibilityEvent}.
*/
public record ObjectVisibilityContext(
- InteractionContextType interactionType,
- InteractionHead head,
- Identifier identifier,
- InteractionInitiatedBy initiatedBy,
- Where where,
- RenderPolicy renderPolicy)
+ InteractionContextType interactionType,
+ InteractionHead head,
+ Identifier identifier,
+ InteractionInitiatedBy initiatedBy,
+ VisibilityConstraint visibilityConstraint,
+ RenderPolicy renderPolicy)
implements VisibilityContext, ProposedHolder {
// -- FACTORIES
@@ -52,13 +51,13 @@ public record ObjectVisibilityContext(
public static ObjectVisibilityContext createForRegular(
final ManagedObject domainObject,
final InteractionInitiatedBy initiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
return new ObjectVisibilityContext(
InteractionHead.regular(domainObject),
domainObject.objSpec().getFeatureIdentifier(),
initiatedBy,
- where,
- InteractionUtils.renderPolicy(domainObject));
+ visibilityConstraint,
+ RenderPolicy.forNonActionParam(domainObject));
}
// -- CONSTRUCTION
@@ -67,10 +66,10 @@ public ObjectVisibilityContext(
final InteractionHead head,
final Identifier identifier,
final InteractionInitiatedBy initiatedBy,
- final Where where,
+ final VisibilityConstraint visibilityConstraint,
final RenderPolicy renderPolicy) {
this(InteractionContextType.OBJECT_VISIBILITY,
- head, identifier, initiatedBy, where, renderPolicy);
+ head, identifier, initiatedBy, visibilityConstraint, renderPolicy);
}
@Override
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ParamVisibilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ParamVisibilityContext.java
index b09699b922b..f2da555eea0 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ParamVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/ParamVisibilityContext.java
@@ -29,6 +29,7 @@
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -38,15 +39,15 @@
* {@link ActionArgumentEvent}.
*/
public record ParamVisibilityContext(
- InteractionContextType interactionType,
- InteractionHead head,
- Identifier identifier,
- InteractionInitiatedBy initiatedBy,
- Where where,
- RenderPolicy renderPolicy,
- ObjectAction objectAction,
- Can args,
- int position)
+ InteractionContextType interactionType,
+ InteractionHead head,
+ Identifier identifier,
+ InteractionInitiatedBy initiatedBy,
+ VisibilityConstraint visibilityConstraint,
+ RenderPolicy renderPolicy,
+ ObjectAction objectAction,
+ Can args,
+ int position)
implements VisibilityContext, ActionInteractionContext {
public ParamVisibilityContext(
@@ -58,8 +59,12 @@ public ParamVisibilityContext(
final InteractionInitiatedBy initiatedBy,
final RenderPolicy renderPolicy) {
+ // assumption: param visibility is never directly constraint by WhatViewer or Where;
+ // instead those constraints apply only to their 'owning' action
+ // in other words, if an action is visible honoring WhatViewer or Where, then no further
+ // visibility vetos for params are considered based on WhatViewer or Where.
this(InteractionContextType.ACTION_PARAMETER_VISIBLE,
- head, id, initiatedBy, Where.OBJECT_FORMS, renderPolicy,
+ head, id, initiatedBy, VisibilityConstraint.noViewer(Where.ANYWHERE), renderPolicy,
objectAction, args, position);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/PropertyVisibilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/PropertyVisibilityContext.java
index 0fad557d06e..e1aeb044ddd 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/PropertyVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/PropertyVisibilityContext.java
@@ -19,13 +19,13 @@
package org.apache.causeway.core.metamodel.interactions.vis;
import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.PropertyVisibilityEvent;
import org.apache.causeway.core.metamodel.consent.InteractionContextType;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
/**
@@ -33,23 +33,23 @@
* {@link PropertyVisibilityEvent}.
*/
public record PropertyVisibilityContext(
- InteractionContextType interactionType,
- InteractionHead head,
- Identifier identifier,
- InteractionInitiatedBy initiatedBy,
- Where where,
- RenderPolicy renderPolicy
+ InteractionContextType interactionType,
+ InteractionHead head,
+ Identifier identifier,
+ InteractionInitiatedBy initiatedBy,
+ VisibilityConstraint visibilityConstraint,
+ RenderPolicy renderPolicy
) implements VisibilityContext {
public PropertyVisibilityContext(
final InteractionHead head,
final Identifier identifier,
final InteractionInitiatedBy initiatedBy,
- final Where where,
+ final VisibilityConstraint visibilityConstraint,
final RenderPolicy renderPolicy) {
this(InteractionContextType.PROPERTY_VISIBLE,
- head, identifier, initiatedBy, where, renderPolicy);
+ head, identifier, initiatedBy, visibilityConstraint, renderPolicy);
}
@Override
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/VisibilityContext.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/VisibilityContext.java
index 418df088599..70afbaf8cb9 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/VisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/vis/VisibilityContext.java
@@ -18,10 +18,12 @@
*/
package org.apache.causeway.core.metamodel.interactions.vis;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.wrapper.events.VisibilityEvent;
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionEventSupplier;
import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
/**
* See {@link InteractionContext} for overview; analogous to
@@ -32,6 +34,21 @@ public sealed interface VisibilityContext
permits ParamVisibilityContext, ActionVisibilityContext, CollectionVisibilityContext,
ObjectVisibilityContext, PropertyVisibilityContext {
+ /**
+ * for debugging visibility when prototyping
+ */
RenderPolicy renderPolicy();
+ /**
+ * Where and by what viewer the element is to be rendered.
+ */
+ VisibilityConstraint visibilityConstraint();
+
+ /**
+ * Where the element is to be rendered.
+ */
+ default Where where() {
+ return visibilityConstraint().where();
+ }
+
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java
index 42d581c4f87..41c6cec24a2 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java
@@ -44,7 +44,7 @@
import org.apache.causeway.core.metamodel.facets.actions.position.ActionPositionFacet;
import org.apache.causeway.core.metamodel.facets.all.described.MemberDescribedFacet;
import org.apache.causeway.core.metamodel.facets.all.described.ObjectDescribedFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet;
import org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet;
import org.apache.causeway.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
@@ -299,7 +299,7 @@ private void setHiddenIfAny(
final HasHidden hasHidden,
final FacetHolder facetHolder) {
- var hiddenFacet = facetHolder.getFacet(HiddenFacet.class);
+ var hiddenFacet = facetHolder.getFacet(HiddenFacetForLayout.class);
if (isNonFallback(hiddenFacet)) {
final Where where = hiddenFacet.where();
if(where != null) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java
index 4a27cffc8c7..7d63f1135d8 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java
@@ -26,8 +26,9 @@
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.facets.collections.CollectionFacet;
import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.interactions.vis.ObjectVisibilityContext;
-import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
import lombok.experimental.UtilityClass;
@@ -35,7 +36,7 @@
public final class MmVisibilityUtils {
public static Predicate super ManagedObject> filterOn(final InteractionInitiatedBy interactionInitiatedBy) {
- return $->MmVisibilityUtils.isVisible($, interactionInitiatedBy);
+ return $->MmVisibilityUtils.isVisible($, interactionInitiatedBy, WhatViewer.invalid());
}
/**
@@ -82,43 +83,33 @@ public static Object visiblePojosAutofit(
}
/**
- * @param adapter - wrapper of domain object whose visibility is being checked,
+ * @param mo - wrapper of domain object whose visibility is being checked,
* must not be a mixin
* @param interactionInitiatedBy
*/
public static boolean isVisible(
- final ManagedObject adapter,
- final InteractionInitiatedBy interactionInitiatedBy) {
+ final ManagedObject mo,
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final WhatViewer whatViewer) {
- if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
- // a choices list could include a null (eg example in ToDoItems#choices1Categorized()); want to show as "visible"
- return true;
- }
- var spec = adapter.objSpec();
- if(spec.isEntity()) {
- if(MmEntityUtils.getEntityState(adapter).isTransientOrRemoved()) {
- return false;
- }
- }
- if(!interactionInitiatedBy.isUser()) {
+ if(ManagedObjects.isNullOrUnspecifiedOrEmpty(mo))
+ // a choices list could include a null (eg example in ToDoItems#choices1Categorized()); want to show as "visible"
return true;
- }
- var visibilityContext = createVisibleInteractionContext(
- adapter,
+ var spec = mo.objSpec();
+ if(spec.isEntity()
+ && MmEntityUtils.getEntityState(mo).isTransientOrRemoved())
+ return false;
+
+ if(!interactionInitiatedBy.isUser())
+ return true;
+
+ var visibilityContext = ObjectVisibilityContext.createForRegular(
+ mo,
InteractionInitiatedBy.USER,
- Where.OBJECT_FORMS);
+ new VisibilityConstraint(whatViewer, Where.OBJECT_FORMS));
return InteractionUtils.isVisibleResult(spec, visibilityContext)
.isAllowing();
}
- private static VisibilityContext createVisibleInteractionContext(
- final ManagedObject objectAdapter,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
-
- return ObjectVisibilityContext
- .createForRegular(objectAdapter, interactionInitiatedBy, where);
- }
-
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
index b847f3f8671..05dc74d6a49 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
@@ -18,12 +18,12 @@
*/
package org.apache.causeway.core.metamodel.postprocessors.allbutparam.authorization;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.Identifier;
import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants;
import org.apache.causeway.core.metamodel.context.MetaModelContext;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor;
import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor;
import org.apache.causeway.core.metamodel.interactions.vis.ActionVisibilityContext;
@@ -34,14 +34,12 @@
import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import org.jspecify.annotations.NonNull;
-
/**
- * Optionally hide or disable an object, property, collection or action
+ * Optionally hides or disables an object, property, collection or action
* depending on the authorization.
*/
public interface AuthorizationFacet
-extends Facet, HidingInteractionAdvisor, DisablingInteractionAdvisor {
+extends HidingInteractionAdvisor, DisablingInteractionAdvisor {
public static boolean hidesProperty(
final @NonNull OneToOneAssociation property,
@@ -53,7 +51,7 @@ public static boolean hidesProperty(
vc.head(),
property.getFeatureIdentifier(),
vc.initiatedBy(),
- vc.where(),
+ vc.visibilityConstraint(),
vc.renderPolicy())) != null)
.orElse(false);
}
@@ -68,7 +66,7 @@ public static boolean hidesCollection(
vc.head(),
collection.getFeatureIdentifier(),
vc.initiatedBy(),
- vc.where(),
+ vc.visibilityConstraint(),
vc.renderPolicy())) != null)
.orElse(false);
}
@@ -84,7 +82,7 @@ public static boolean hidesAction(
action,
action.getFeatureIdentifier(),
vc.initiatedBy(),
- vc.where(),
+ vc.visibilityConstraint(),
vc.renderPolicy())) != null)
.orElse(false);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
deleted file mode 100644
index 3754ad7cf3c..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
+++ /dev/null
@@ -1,92 +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.core.metamodel.postprocessors.allbutparam.authorization;
-
-import java.util.Optional;
-
-import org.apache.causeway.core.metamodel.consent.Consent.VetoReason;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
-import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
-import org.apache.causeway.core.security.authorization.manager.AuthorizationManager;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public abstract class AuthorizationFacetAbstract
-extends FacetAbstract
-implements AuthorizationFacet {
-
- private static final Class extends Facet> type() {
- return AuthorizationFacet.class;
- }
-
- private final AuthorizationManager authorizationManager;
-
- public AuthorizationFacetAbstract(
- final FacetHolder holder) {
- super(type(), holder);
- this.authorizationManager = getAuthorizationManager();
- }
-
- @Override
- public String hides(final VisibilityContext ic) {
-
- if(ic.head().owner().objSpec().isValue()) {
- return null; // never hide value-types
- }
-
- var hides = authorizationManager
- .isVisible(
- getInteractionService().currentInteractionContextElseFail(),
- ic.identifier())
- ? null
- : "Not authorized to view";
-
- if(hides!=null && log.isDebugEnabled()) {
- log.debug("hides[{}] -> {}", ic.identifier(), hides);
- }
-
- return hides;
- }
-
- @Override
- public Optional disables(final UsabilityContext ic) {
-
- if(ic.head().owner().objSpec().isValue()) {
- return Optional.empty(); // never disable value-types
- }
-
- var disables = authorizationManager
- .isUsable(
- getInteractionService().currentInteractionContextElseFail(),
- ic.identifier())
- ? null
- : AuthorizationFacet.formatNotAuthorizedToEdit(ic.identifier(), getMetaModelContext());
-
- if(disables!=null && log.isDebugEnabled()) {
- log.debug("disables[{}] -> {}", ic.identifier(), disables);
- }
-
- return Optional.ofNullable(disables).map(VetoReason::unauthorized);
- }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetImpl.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetImpl.java
index fc82c0c9ba6..a79efd196b6 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetImpl.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetImpl.java
@@ -18,12 +18,66 @@
*/
package org.apache.causeway.core.metamodel.postprocessors.allbutparam.authorization;
+import java.util.Optional;
+
+import org.apache.causeway.core.metamodel.consent.Consent.VetoReason;
+import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
+import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
+import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
+import org.apache.causeway.core.security.authorization.manager.AuthorizationManager;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public record AuthorizationFacetImpl(
+ AuthorizationManager authorizationManager,
+ FacetHolder facetHolder
+ ) implements AuthorizationFacet {
+
+ @Override public Class extends Facet> facetType() { return AuthorizationFacet.class; }
+ @Override public Precedence precedence() { return Precedence.DEFAULT; }
+
+ @Override
+ public String hides(final VisibilityContext ic) {
+
+ if(ic.head().owner().objSpec().isValue()) {
+ return null; // never hide value-types
+ }
+
+ var hides = authorizationManager
+ .isVisible(
+ facetHolder.getInteractionService().currentInteractionContextElseFail(),
+ ic.identifier())
+ ? null
+ : "Not authorized to view";
+
+ if(hides!=null && log.isDebugEnabled()) {
+ log.debug("hides[{}] -> {}", ic.identifier(), hides);
+ }
+
+ return hides;
+ }
+
+ @Override
+ public Optional disables(final UsabilityContext ic) {
+
+ if(ic.head().owner().objSpec().isValue()) {
+ return Optional.empty(); // never disable value-types
+ }
+
+ var disables = authorizationManager
+ .isUsable(
+ facetHolder.getInteractionService().currentInteractionContextElseFail(),
+ ic.identifier())
+ ? null
+ : AuthorizationFacet.formatNotAuthorizedToEdit(ic.identifier(), facetHolder.getMetaModelContext());
-public class AuthorizationFacetImpl extends AuthorizationFacetAbstract {
+ if(disables!=null && log.isDebugEnabled()) {
+ log.debug("disables[{}] -> {}", ic.identifier(), disables);
+ }
- public AuthorizationFacetImpl(final FacetHolder holder) {
- super(holder);
+ return Optional.ofNullable(disables).map(VetoReason::unauthorized);
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java
index 389dcb4495b..355b1904c8d 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java
@@ -57,7 +57,7 @@ public void postProcessCollection(final ObjectSpecification objectSpecification,
}
private static void addFacet(final FacetHolder facetHolder) {
- facetHolder.addFacet(new AuthorizationFacetImpl(facetHolder));
+ facetHolder.addFacet(new AuthorizationFacetImpl(facetHolder.getAuthorizationManager(), facetHolder));
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenType.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/HiddenFacetForNavigationFromHiddenType.java
similarity index 64%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenType.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/HiddenFacetForNavigationFromHiddenType.java
index cd6874af027..b93e8b04e5f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenType.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/HiddenFacetForNavigationFromHiddenType.java
@@ -24,60 +24,53 @@
import org.apache.causeway.applib.Identifier;
import org.apache.causeway.commons.internal.assertions._Assert;
import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import org.apache.causeway.core.metamodel.facets.members.navigation.NavigationFacet;
-import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenTypeFacet;
+import org.apache.causeway.core.metamodel.facets.members.navigation.HiddenFacetForNavigation;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForNoMembersAuthorized;
import org.apache.causeway.core.metamodel.interactions.vis.ObjectVisibilityContext;
import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-public class NavigationFacetFromHiddenType
-extends FacetAbstract
-implements
- NavigationFacet {
+public record HiddenFacetForNavigationFromHiddenType(
+ ObjectSpecification navigatedType,
+ FacetHolder facetHolder
+ ) implements HiddenFacetForNavigation {
- private final ObjectSpecification navigatedType;
+ public static Optional create(final ObjectSpecification navigatedType, final FacetHolder holder) {
+ return navigatedType.isValue()
+ ? Optional.empty() // don't create for value types (optimization, not strictly required)
+ : Optional.of(new HiddenFacetForNavigationFromHiddenType(navigatedType, holder));
+ }
- private static final Class extends Facet> type() {
- return NavigationFacet.class;
- }
-
- public static Optional create(final ObjectSpecification navigatedType, final FacetHolder holder) {
- return navigatedType.isValue()
- ? Optional.empty() // don't create for value types (optimization, not strictly required)
- : Optional.of(new NavigationFacetFromHiddenType(navigatedType, holder));
- }
+ @Override public Class extends Facet> facetType() { return HiddenFacetForNavigation.class; }
+ @Override public Precedence precedence() { return Precedence.DEFAULT; }
- private NavigationFacetFromHiddenType(final ObjectSpecification navigatedType, final FacetHolder holder) {
- super(type(), holder);
- this.navigatedType = navigatedType;
+ public HiddenFacetForNavigationFromHiddenType {
_Assert.assertTrue(navigatedType.isSingular(), ()->String.format(
"framework bug: elementType must not match any supported plural (collection) types, "
+ "nevertheless got %s", navigatedType));
}
@Override
- public String hides(final VisibilityContext ic) {
- var facet = navigatedType.getFacet(HiddenTypeFacet.class);
- if(facet == null) {
- // not expected to happen; this facet should only be installed for object members
+ public String hides(final VisibilityContext vc) {
+ var facet = navigatedType.getFacet(HiddenFacetForNoMembersAuthorized.class);
+ if(facet == null)
+ // not expected to happen; this facet should only be installed for object members
// that navigate to a class that has the HiddenTypeFacet
return null;
- }
var objVisibilityContext = new ObjectVisibilityContext(
- ic.head(),
+ vc.head(),
Identifier.classIdentifier(navigatedType.logicalType()),
- ic.initiatedBy(),
- ic.where(),
- ic.renderPolicy());
+ vc.initiatedBy(),
+ vc.visibilityConstraint(),
+ vc.renderPolicy());
final String hides = facet.hides(objVisibilityContext);
return hides;
}
@Override
public void visitAttributes(final BiConsumer visitor) {
- super.visitAttributes(visitor);
+ HiddenFacetForNavigation.super.visitAttributes(visitor);
visitor.accept("navigatedType", navigatedType.logicalTypeName());
visitor.accept("navigatedTypeFqcn", navigatedType.getCorrespondingClass().getName());
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java
index 66bcc7ed094..e961f316e88 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java
@@ -23,7 +23,7 @@
import org.apache.causeway.core.metamodel.context.MetaModelContext;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
-import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenTypeFacet;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForNoMembersAuthorized;
import org.apache.causeway.core.metamodel.postprocessors.MetaModelPostProcessorAbstract;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -32,7 +32,7 @@
import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
/**
- * Installs the {@link NavigationFacetFromHiddenType} on all of the
+ * Installs the {@link HiddenFacetForNavigationFromHiddenType} on all of the
* {@link ObjectMember}s of the {@link ObjectSpecification}.
*/
public class NavigationFacetFromHiddenTypePostProcessor extends MetaModelPostProcessorAbstract {
@@ -60,8 +60,8 @@ public void postProcessCollection(final ObjectSpecification objectSpecification,
// -- HELPER
private static void addFacetIfRequired(final FacetHolder facetHolder, final ObjectSpecification navigatedType) {
- if(navigatedType.containsNonFallbackFacet(HiddenTypeFacet.class)) {
- FacetUtil.addFacetIfPresent(NavigationFacetFromHiddenType.create(navigatedType, facetHolder));
+ if(navigatedType.containsNonFallbackFacet(HiddenFacetForNoMembersAuthorized.class)) {
+ FacetUtil.addFacetIfPresent(HiddenFacetForNavigationFromHiddenType.create(navigatedType, facetHolder));
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index d286c6f943a..06423d74062 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -51,7 +51,7 @@
import org.apache.causeway.core.metamodel.CausewayModuleCoreMetamodel;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.SingleIntValueFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
import org.apache.causeway.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
import org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
@@ -359,7 +359,7 @@ protected boolean exclude(final ObjectSpecification spec) {
}
protected boolean isHidden(final ObjectSpecification spec) {
- return HiddenFacet.isAlwaysHidden(spec);
+ return HiddenFacetForLayout.isAlwaysHidden(spec);
}
protected boolean isBuiltIn(final ObjectSpecification spec) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/DomainMemberDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/DomainMemberDefault.java
index 1042dfc5284..e69ab7abc55 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/DomainMemberDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/DomainMemberDefault.java
@@ -37,7 +37,7 @@
import org.apache.causeway.core.metamodel.facetapi.Facet;
import org.apache.causeway.core.metamodel.facets.ImperativeFacet;
import org.apache.causeway.core.metamodel.facets.actions.validate.ActionValidationFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacet;
import org.apache.causeway.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
import org.apache.causeway.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
@@ -164,7 +164,7 @@ public String getMixin() {
@XmlElement @Override
public String getHidden() {
- return interpret(HiddenFacet.class);
+ return interpret(HiddenFacetForLayout.class);
}
@XmlElement @Override
@@ -271,7 +271,7 @@ private static String interpretFacet(final Facet facet) {
}
if (facet instanceof ImperativeFacet) {
ImperativeFacet imperativeFacet = (ImperativeFacet) facet;
- return imperativeFacet.getMethods().getFirstElseFail().getName();
+ return imperativeFacet.methods().getFirstElseFail().getName();
}
final String name = facet.getClass().getSimpleName();
if (ignore(name)) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
index d2ecdd8ca1a..9eaa0d7df9a 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
@@ -26,6 +26,7 @@
import java.util.Optional;
import java.util.stream.Stream;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.annotation.DomainObject;
@@ -50,7 +51,7 @@
import org.apache.causeway.core.metamodel.facetapi.HasFacetHolder;
import org.apache.causeway.core.metamodel.facets.all.described.ObjectDescribedFacet;
import org.apache.causeway.core.metamodel.facets.all.help.HelpFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.all.i8n.noun.HasNoun;
import org.apache.causeway.core.metamodel.facets.all.i8n.staatic.HasStaticText;
import org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet;
@@ -78,7 +79,6 @@
import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociationContainer;
import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
-import org.jspecify.annotations.NonNull;
import lombok.experimental.UtilityClass;
/**
@@ -301,24 +301,24 @@ ObjectTitleContext createTitleInteractionContext(
// internal API
ObjectValidityContext createValidityInteractionContext(
- final ManagedObject targetAdapter,
- final InteractionInitiatedBy interactionInitiatedBy);
+ ManagedObject targetAdapter,
+ InteractionInitiatedBy interactionInitiatedBy);
/**
* Determines whether the specified object is in a valid state (for example,
* so can be persisted); represented as a {@link Consent}.
*/
Consent isValid(
- final ManagedObject targetAdapter,
- final InteractionInitiatedBy interactionInitiatedBy);
+ ManagedObject targetAdapter,
+ InteractionInitiatedBy interactionInitiatedBy);
/**
* Determines whether the specified object is in a valid state (for example,
* so can be persisted); represented as a {@link InteractionResult}.
*/
InteractionResult isValidResult(
- final ManagedObject targetAdapter,
- final InteractionInitiatedBy interactionInitiatedBy);
+ ManagedObject targetAdapter,
+ InteractionInitiatedBy interactionInitiatedBy);
// -- FACETS
@@ -391,7 +391,7 @@ default boolean isValueOrIsParented() {
boolean isImmutable();
/**
- * Whether has the {@link HiddenFacet}
+ * Whether has the {@link HiddenFacetForLayout}
*/
boolean isHidden();
@@ -515,14 +515,12 @@ default boolean isEntityOrViewModelOrAbstract() {
*/
default Object instantiatePojo() {
final Class> correspondingClass = getCorrespondingClass();
- if (correspondingClass.isArray()) {
- return Array.newInstance(correspondingClass.getComponentType(), 0);
- }
+ if (correspondingClass.isArray())
+ return Array.newInstance(correspondingClass.getComponentType(), 0);
final Class> cls = correspondingClass;
- if (Modifier.isAbstract(cls.getModifiers())) {
- throw new UnrecoverableException("Cannot create an instance of an abstract class: " + cls);
- }
+ if (Modifier.isAbstract(cls.getModifiers()))
+ throw new UnrecoverableException("Cannot create an instance of an abstract class: " + cls);
final Object newInstance;
try {
@@ -590,9 +588,8 @@ default public void assertPojoCompatible(final @Nullable Object pojo) {
default public boolean isAssignableFrom(final Class> actualType) {
var expectedType = getCorrespondingClass();
if(expectedType.isAssignableFrom(actualType)
- || ClassExtensions.equalsWhenBoxing(expectedType, actualType)) {
- return true;
- }
+ || ClassExtensions.equalsWhenBoxing(expectedType, actualType))
+ return true;
return false;
}
@@ -603,9 +600,8 @@ default public boolean isPojoCompatible(final Object pojo) {
var actualType = pojo.getClass();
if(expectedType.isAssignableFrom(actualType)
- || ClassExtensions.equalsWhenBoxing(expectedType, actualType)) {
- return true;
- }
+ || ClassExtensions.equalsWhenBoxing(expectedType, actualType))
+ return true;
var elementSpec = getElementSpecification()
.orElse(this);
@@ -646,12 +642,10 @@ public static ObjectSpecification commonSuperType(
var cls_a = a.getCorrespondingClass();
var cls_b = b.getCorrespondingClass();
- if(cls_a.isAssignableFrom(cls_b)) {
- return a;
- }
- if(cls_b.isAssignableFrom(cls_a)) {
- return b;
- }
+ if(cls_a.isAssignableFrom(cls_b))
+ return a;
+ if(cls_b.isAssignableFrom(cls_a))
+ return b;
// assuming the algorithm is correct: if non of the above is true,
// we must be able to walk up the tree on both branches
_Assert.assertNotNull(a.superclass());
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java
index 2729dd71e34..d301ce18af7 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java
@@ -25,7 +25,6 @@
import org.jspecify.annotations.NonNull;
import org.apache.causeway.applib.annotation.SemanticsOf;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.collections.CanVector;
import org.apache.causeway.core.metamodel.consent.Consent;
@@ -34,6 +33,8 @@
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facetapi.FeatureType;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.ActionScope;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -55,11 +56,11 @@ public interface HasObjectAction extends ObjectAction {
@Override default boolean isAlwaysHidden() {
return getObjectAction().isAlwaysHidden();
}
- @Override default Consent isVisible(final ManagedObject target, final InteractionInitiatedBy interactionInitiatedBy, final Where where) {
- return getObjectAction().isVisible(target, interactionInitiatedBy, where);
+ @Override default Consent isVisible(final ManagedObject target, final InteractionInitiatedBy interactionInitiatedBy, final VisibilityConstraint visConstraint) {
+ return getObjectAction().isVisible(target, interactionInitiatedBy, visConstraint);
}
- @Override default Consent isUsable(final ManagedObject target, final InteractionInitiatedBy interactionInitiatedBy, final Where where) {
- return getObjectAction().isUsable(target, interactionInitiatedBy, where);
+ @Override default Consent isUsable(final ManagedObject target, final InteractionInitiatedBy interactionInitiatedBy, final VisibilityConstraint visConstraint) {
+ return getObjectAction().isUsable(target, interactionInitiatedBy, visConstraint);
}
@Override default boolean isPropertyOrCollection() {
return getObjectAction().isPropertyOrCollection();
@@ -129,12 +130,12 @@ default FacetHolder getFacetHolder() {
return getObjectAction().hasReturn();
}
@Override default ManagedObject executeWithRuleChecking(final InteractionHead head, final Can parameters,
- final InteractionInitiatedBy interactionInitiatedBy, final Where where) throws AuthorizationException {
- return getObjectAction().executeWithRuleChecking(head, parameters, interactionInitiatedBy, where);
+ final InteractionInitiatedBy interactionInitiatedBy, final VisibilityConstraint visibilityConstraint) throws AuthorizationException {
+ return getObjectAction().executeWithRuleChecking(head, parameters, interactionInitiatedBy, visibilityConstraint);
}
@Override default ManagedObject execute(final InteractionHead head, final Can parameters,
- final InteractionInitiatedBy interactionInitiatedBy) {
- return getObjectAction().execute(head, parameters, interactionInitiatedBy);
+ final InteractionInitiatedBy interactionInitiatedBy, final WhatViewer whatViewer) {
+ return getObjectAction().execute(head, parameters, interactionInitiatedBy, whatViewer);
}
@Override default Consent isArgumentSetValid(final InteractionHead head, final Can proposedArguments,
final InteractionInitiatedBy interactionInitiatedBy) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java
index 993c9537233..cb52e9d0b8c 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java
@@ -43,12 +43,14 @@
import org.apache.causeway.core.metamodel.facets.WhereValueFacet;
import org.apache.causeway.core.metamodel.facets.actions.action.choicesfrom.ChoicesFromFacet;
import org.apache.causeway.core.metamodel.facets.actions.position.ActionPositionFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.members.iconfa.FaFacet;
import org.apache.causeway.core.metamodel.facets.members.iconfa.FaLayersProvider;
import org.apache.causeway.core.metamodel.facets.members.layout.group.LayoutGroupFacet;
import org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.ManagedObjects;
@@ -104,7 +106,7 @@ ManagedObject executeWithRuleChecking(
InteractionHead head,
Can parameters,
InteractionInitiatedBy interactionInitiatedBy,
- Where where) throws AuthorizationException;
+ VisibilityConstraint visibilityConstraint) throws AuthorizationException;
/**
* Invokes the action's method on the target object given the specified set
@@ -117,7 +119,8 @@ ManagedObject executeWithRuleChecking(
ManagedObject execute(
InteractionHead head,
Can parameters,
- InteractionInitiatedBy interactionInitiatedBy);
+ InteractionInitiatedBy interactionInitiatedBy,
+ WhatViewer whatViewer);
// -- isArgumentSetValid, isArgumentSetValidForParameters, isArgumentSetValidForAction
@@ -271,10 +274,9 @@ default PromptStyle getPromptStyle() {
// whereas for INLINE it would render a form with no fields
|| getParameterCount() == 0) {
if (promptStyle.isPresent()) {
- if (promptStyle.get().isDialogAny()) {
- // preserve dialog specialization
+ if (promptStyle.get().isDialogAny())
+ // preserve dialog specialization
return promptStyle.get();
- }
}
// fallback to generic dialog
return PromptStyle.DIALOG;
@@ -283,16 +285,13 @@ default PromptStyle getPromptStyle() {
var needsFallback = promptStyle.isEmpty()
|| promptStyle.get() == PromptStyle.AS_CONFIGURED;
- if(needsFallback) {
- // modal vs side-bar
- switch (getWicketViewerSettings().dialogMode()) {
- case SIDEBAR:
- return PromptStyle.DIALOG_SIDEBAR;
- case MODAL:
- default:
- return PromptStyle.DIALOG_MODAL;
- }
- }
+ if(needsFallback)
+ // modal vs side-bar
+ return switch (getWicketViewerSettings().dialogMode()) {
+ case SIDEBAR -> PromptStyle.DIALOG_SIDEBAR;
+ case MODAL -> PromptStyle.DIALOG_MODAL;
+ default -> PromptStyle.DIALOG_MODAL;
+ };
return promptStyle.get();
}
@@ -309,9 +308,8 @@ public static boolean returnsBlobOrClob(final ObjectAction objectAction) {
if (returnType != null) {
Class> cls = returnType.getCorrespondingClass();
if (Blob.class.isAssignableFrom(cls)
- || Clob.class.isAssignableFrom(cls)) {
- return true;
- }
+ || Clob.class.isAssignableFrom(cls))
+ return true;
}
return false;
}
@@ -320,18 +318,15 @@ public static boolean isDirectlyAssociatedWithAnyProperty(
final ObjectAction action) {
var layoutGroupFacet = action.getFacet(LayoutGroupFacet.class);
- if (layoutGroupFacet == null) {
- return false;
- }
+ if (layoutGroupFacet == null)
+ return false;
var layoutGroupId = layoutGroupFacet.getGroupId();
- if (_Strings.isNullOrEmpty(layoutGroupId)) {
- return false;
- }
+ if (_Strings.isNullOrEmpty(layoutGroupId))
+ return false;
var prop = action.getDeclaringType().getProperty(layoutGroupId, MixedIn.INCLUDED)
.orElse(null);
- if (prop == null) {
- return false;
- }
+ if (prop == null)
+ return false;
return true;
}
@@ -363,9 +358,10 @@ public static Optional cssClassFaFactoryFor(
/**
* Returns a Stream of those to be rendered with the entity header panel.
+ * @param whatViewer
*/
public static Stream streamTopBarActions(
- final ManagedObject adapter) {
+ final ManagedObject adapter, final WhatViewer whatViewer) {
var spec = adapter.objSpec();
@@ -374,7 +370,7 @@ public static Stream streamTopBarActions(
.isSharingAnyLayoutGroupOf(spec.streamAssociations(MixedIn.INCLUDED))
.negate())
.filter(Predicates
- .dynamicallyVisible(adapter, InteractionInitiatedBy.USER, Where.ANYWHERE));
+ .dynamicallyVisible(adapter, InteractionInitiatedBy.USER, new VisibilityConstraint(whatViewer, Where.ANYWHERE)));
}
public static Stream findForAssociation(
@@ -388,15 +384,13 @@ public static Stream findForAssociation(
public static PromptStyle promptStyleFor(final ObjectAction objectAction) {
PromptStyleFacet facet = objectAction.getFacet(PromptStyleFacet.class);
- if(facet == null) {
- // don't think this can occur, see PromptStyleFallback
+ if(facet == null)
+ // don't think this can occur, see PromptStyleFallback
return PromptStyle.INLINE;
- }
final PromptStyle promptStyle = facet.value();
- if(promptStyle == PromptStyle.AS_CONFIGURED) {
- // don't think this can occur, see PromptStyleConfiguration
+ if(promptStyle == PromptStyle.AS_CONFIGURED)
+ // don't think this can occur, see PromptStyleConfiguration
return PromptStyle.INLINE;
- }
return promptStyle;
}
@@ -436,13 +430,11 @@ public static Predicate isSameLayoutGroupAs(
return (final ObjectAction objectAction) -> {
var layoutGroupFacet = objectAction.getFacet(LayoutGroupFacet.class);
- if (layoutGroupFacet == null) {
- return false;
- }
+ if (layoutGroupFacet == null)
+ return false;
var layoutGroupId = layoutGroupFacet.getGroupId();
- if (_Strings.isNullOrEmpty(layoutGroupId)) {
- return false;
- }
+ if (_Strings.isNullOrEmpty(layoutGroupId))
+ return false;
return layoutGroupId.equals(memberId);
};
}
@@ -457,13 +449,11 @@ private static Predicate super ObjectAction> isSharingAnyLayoutGroupOf(
return (final ObjectAction objectAction) -> {
var layoutGroupFacet = objectAction.getFacet(LayoutGroupFacet.class);
- if (layoutGroupFacet == null) {
- return false;
- }
+ if (layoutGroupFacet == null)
+ return false;
var layoutGroupId = layoutGroupFacet.getGroupId();
- if (_Strings.isNullOrEmpty(layoutGroupId)) {
- return false;
- }
+ if (_Strings.isNullOrEmpty(layoutGroupId))
+ return false;
return associationIds.contains(layoutGroupId);
};
}
@@ -480,10 +470,10 @@ public static Predicate choicesFromAndHavingCollectionParameterFor
}
/**
- * Returns true if no {@link HiddenFacet} is found that vetoes visibility.
+ * Returns true if no {@link HiddenFacetForLayout} is found that vetoes visibility.
*
* However, whereHidden={@link Where#ALL_TABLES} is used as default
- * when no {@link HiddenFacet} is found.
+ * when no {@link HiddenFacetForLayout} is found.
*
* @see ObjectAssociation.Predicates#visibleAccordingToHiddenFacet(Where)
*
@@ -491,7 +481,7 @@ public static Predicate choicesFromAndHavingCollectionParameterFor
* however the current approach is more heap friendly
*/
public static Predicate visibleAccordingToHiddenFacet(final Where whereContext) {
- return (final ObjectAction act) -> act.lookupFacet(HiddenFacet.class)
+ return (final ObjectAction act) -> act.lookupFacet(HiddenFacetForLayout.class)
.map(WhereValueFacet.class::cast)
.map(WhereValueFacet::where)
// whereHidden=ALL_TABLES is the default when not specified otherwise
@@ -512,13 +502,11 @@ public HasChoicesFrom(final @NonNull ObjectAssociation objectAssociation) {
@Override
public boolean test(final ObjectAction objectAction) {
var choicesFromFacet = objectAction.getFacet(ChoicesFromFacet.class);
- if(choicesFromFacet == null) {
- return false;
- }
+ if(choicesFromFacet == null)
+ return false;
var choicesFromMemberName = choicesFromFacet.value();
- if (choicesFromMemberName == null) {
- return false;
- }
+ if (choicesFromMemberName == null)
+ return false;
var memberNameLowerCase = choicesFromMemberName.toLowerCase();
return Objects.equals(memberId, memberNameLowerCase);
}
@@ -541,12 +529,9 @@ public boolean test(final ObjectAction objectAction) {
private static Predicate dynamicallyVisible(
final ManagedObject target,
final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
- return (final ObjectAction objectAction) -> {
- final Consent visible = objectAction.isVisible(target, interactionInitiatedBy, where);
- return visible.isAllowed();
- };
+ return (final ObjectAction objectAction) -> objectAction.isVisible(target, interactionInitiatedBy, visibilityConstraint).isAllowed();
}
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAssociation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAssociation.java
index 55204ee56d3..e6562079b7c 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAssociation.java
@@ -29,7 +29,7 @@
import org.apache.causeway.commons.internal.functions._Predicates;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.facets.WhereValueFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.util.Facets;
@@ -139,7 +139,7 @@ private Predicates(){}
public static Predicate staticallyVisible(final Where where) {
return assoc -> {
var b = assoc.streamFacets()
- .filter(facet -> facet instanceof HiddenFacet)
+ .filter(facet -> facet instanceof HiddenFacetForLayout)
.map(facet -> (WhereValueFacet) facet)
.anyMatch(wawF -> wawF.where().includes(where));
return !b;
@@ -147,10 +147,10 @@ public static Predicate staticallyVisible(final Where where)
}
/**
- * Returns true if no {@link HiddenFacet} is found that vetoes visibility.
+ * Returns true if no {@link HiddenFacetForLayout} is found that vetoes visibility.
*
* However, if it's a 1-to-Many, whereHidden={@link Where#ALL_TABLES} is used as default
- * when no {@link HiddenFacet} is found.
+ * when no {@link HiddenFacetForLayout} is found.
*
* @see ObjectAction.Predicates#visibleAccordingToHiddenFacet(Where)
*
@@ -158,7 +158,7 @@ public static Predicate staticallyVisible(final Where where)
* however the current approach is more heap friendly
*/
public static Predicate visibleAccordingToHiddenFacet(final Where whereContext) {
- return (final ObjectAssociation assoc) -> assoc.lookupFacet(HiddenFacet.class)
+ return (final ObjectAssociation assoc) -> assoc.lookupFacet(HiddenFacetForLayout.class)
.map(WhereValueFacet.class::cast)
.map(WhereValueFacet::where)
// in case it's a 1-to-Many, whereHidden=ALL_TABLES is the default when not specified otherwise
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 d463c5c656d..2dec105f634 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
@@ -35,10 +35,11 @@
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.collections.sortedby.SortedByFacet;
import org.apache.causeway.core.metamodel.facets.object.paged.PagedFacet;
import org.apache.causeway.core.metamodel.facets.object.tabledec.TableDecoratorFacet;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.MmSortUtils;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -60,10 +61,6 @@ public interface ObjectMember extends ObjectFeature {
*/
ObjectSpecification getDeclaringType();
- // /////////////////////////////////////////////////////////////
- // Name, Description, Help (convenience for facets)
- // /////////////////////////////////////////////////////////////
-
/**
* Return the help text for this member - the field or action - to
* complement the description.
@@ -72,16 +69,12 @@ public interface ObjectMember extends ObjectFeature {
*/
String getHelp();
- // /////////////////////////////////////////////////////////////
- // Hidden (or visible)
- // /////////////////////////////////////////////////////////////
-
/**
* When the member is always hidden.
*
*
- * Determined as per the {@link HiddenFacet} being present and
- * {@link HiddenFacet#where()} returning {@link Where#ANYWHERE}.
+ * Determined as per the {@link HiddenFacetForLayout} being present and
+ * {@link HiddenFacetForLayout#where()} returning {@link Where#ANYWHERE}.
*/
boolean isAlwaysHidden();
@@ -93,13 +86,9 @@ public interface ObjectMember extends ObjectFeature {
* @param where
*/
Consent isVisible(
- final ManagedObject target,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where);
-
- // /////////////////////////////////////////////////////////////
- // Disabled (or enabled)
- // /////////////////////////////////////////////////////////////
+ ManagedObject target,
+ InteractionInitiatedBy interactionInitiatedBy,
+ VisibilityConstraint visibilityConstraint);
/**
* Determines whether this member is usable (not disabled), represented as a
@@ -107,16 +96,12 @@ Consent isVisible(
* @param target
* may be null if just checking for authorization.
* @param interactionInitiatedBy
- * @param where
+ * @param visibilityConstraint only ever used for debugging while prototyping
*/
Consent isUsable(
- final ManagedObject target,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where);
-
- // /////////////////////////////////////////////////////////////
- // isAssociation, isAction
- // /////////////////////////////////////////////////////////////
+ ManagedObject target,
+ InteractionInitiatedBy interactionInitiatedBy,
+ VisibilityConstraint visibilityConstraint);
/**
* Whether this member represents a {@link ObjectAssociation}.
@@ -166,9 +151,7 @@ default boolean isMixedIn() {
*/
boolean isExplicitlyAnnotated();
- // /////////////////////////////////////////////////////////////
- // Debugging
- // /////////////////////////////////////////////////////////////
+ // -- DEBUGGING
/**
* Thrown if the user is not authorized to access an action or any property/collection of an entity.
@@ -276,9 +259,8 @@ default Optional> getElementComparator(){
.map(SortedByFacet::value)
.orElse(null);
- if(sortedBy == null) {
- return Optional.empty();
- }
+ if(sortedBy == null)
+ return Optional.empty();
var pojoComparator = _Casts.>uncheckedCast(
_InstanceUtil.createInstance(sortedBy));
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java
index e8bc2ace6cb..df4278d9a92 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java
@@ -30,7 +30,6 @@
import org.apache.causeway.applib.annotation.Action;
import org.apache.causeway.applib.annotation.ActionLayout;
import org.apache.causeway.applib.annotation.SemanticsOf;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.exceptions.RecoverableException;
import org.apache.causeway.applib.services.bookmark.Bookmark;
import org.apache.causeway.applib.services.command.Command;
@@ -48,11 +47,14 @@
import org.apache.causeway.core.metamodel.facetapi.FeatureType;
import org.apache.causeway.core.metamodel.facets.FacetedMethod;
import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
-import org.apache.causeway.core.metamodel.facets.actions.prototype.PrototypeFacet;
+import org.apache.causeway.core.metamodel.facets.actions.prototype.HiddenFacetForDeploymentType;
import org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
import org.apache.causeway.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
+import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.interactions.use.ActionUsabilityContext;
import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
import org.apache.causeway.core.metamodel.interactions.val.ActionValidityContext;
@@ -77,9 +79,8 @@ class ObjectActionDefault
public static ActionScope getType(final String typeStr) {
final ActionScope type = ActionScope.valueOf(typeStr);
- if (type == null) {
- throw new IllegalArgumentException();
- }
+ if (type == null)
+ throw new IllegalArgumentException();
return type;
}
@@ -134,9 +135,8 @@ private ObjectSpecification loadDeclaringType() {
.map(ActionInvocationFacet::getDeclaringType);
// JUnit support
if(testing
- && declaringType.isEmpty()) {
- return specLoaderInternal().loadSpecification(getFacetedMethod().methodFacade().getDeclaringClass());
- }
+ && declaringType.isEmpty())
+ return specLoaderInternal().loadSpecification(getFacetedMethod().methodFacade().getDeclaringClass());
return declaringType.orElseThrow(()->_Exceptions
.illegalState("missing ActionInvocationFacet on action %s", getFeatureIdentifier()));
}
@@ -174,9 +174,8 @@ private ObjectSpecification loadReturnType() {
.map(ActionInvocationFacet::getReturnType);
// JUnit support
if(testing
- && returType.isEmpty()) {
- return specLoaderInternal().loadSpecification(getFacetedMethod().methodFacade().getReturnType());
- }
+ && returType.isEmpty())
+ return specLoaderInternal().loadSpecification(getFacetedMethod().methodFacade().getReturnType());
return returType.orElseThrow(()->_Exceptions
.illegalState("framework bug: missing ActionInvocationFacet on action %s", getFeatureIdentifier()));
}
@@ -187,10 +186,9 @@ private ObjectSpecification loadReturnType() {
*/
@Override
public boolean hasReturn() {
- if(getReturnType() == null) {
- // this shouldn't happen; return Type always defined, even if represents void.class
+ if(getReturnType() == null)
+ // this shouldn't happen; return Type always defined, even if represents void.class
return false;
- }
return !getReturnType().isVoidPrimitive();
}
@@ -202,7 +200,7 @@ public ActionScope getScope() {
}
private static ActionScope getScope(final FacetHolder facetHolder) {
- return facetHolder.containsFacet(PrototypeFacet.class)
+ return facetHolder.containsFacet(HiddenFacetForDeploymentType.class)
? ActionScope.PROTOTYPE
: ActionScope.PRODUCTION;
}
@@ -268,10 +266,9 @@ public Can getParameters(final Predicate= parameters.size()) {
- throw new IllegalArgumentException(
+ if (position >= parameters.size())
+ throw new IllegalArgumentException(
"getParameter(int): only " + parameters.size() + " parameters, position=" + position);
- }
return parameters.getElseFail(position);
}
@@ -281,14 +278,14 @@ ObjectActionParameter getParameter(final int position) {
public VisibilityContext createVisibleInteractionContext(
final ManagedObject target,
final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
return new ActionVisibilityContext(
headFor(target),
this,
getFeatureIdentifier(),
interactionInitiatedBy,
- where,
- InteractionUtils.renderPolicy(target));
+ visibilityConstraint,
+ RenderPolicy.forNonActionParam(target));
}
// -- USABLE
@@ -296,15 +293,13 @@ public VisibilityContext createVisibleInteractionContext(
@Override
public UsabilityContext createUsableInteractionContext(
final ManagedObject target,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final InteractionInitiatedBy interactionInitiatedBy) {
return new ActionUsabilityContext(
headFor(target),
this,
getFeatureIdentifier(),
interactionInitiatedBy,
- where,
- InteractionUtils.renderPolicy(target));
+ RenderPolicy.forNonActionParam(target));
}
// -- VALIDATE
@@ -396,33 +391,30 @@ ActionValidityContext createActionInvocationInteractionContext(
// -- EXECUTE
@Override
- public ManagedObject executeWithRuleChecking(
+ public final ManagedObject executeWithRuleChecking(
final InteractionHead head,
final Can arguments,
final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
var target = head.owner();
// see it?
- final Consent visibility = isVisible(target, interactionInitiatedBy, where);
- if (visibility.isVetoed()) {
- throw new HiddenException();
- }
+ final Consent visibility = isVisible(target, interactionInitiatedBy, visibilityConstraint);
+ if (visibility.isVetoed())
+ throw new HiddenException();
// use it?
- final Consent usability = isUsable(target, interactionInitiatedBy, where);
- if(usability.isVetoed()) {
- throw new DisabledException(usability.getReasonAsString().orElse("no reason given"));
- }
+ final Consent usability = isUsable(target, interactionInitiatedBy, visibilityConstraint);
+ if(usability.isVetoed())
+ throw new DisabledException(usability.getReasonAsString().orElse("no reason given"));
// do it?
final Consent validity = isArgumentSetValid(head, arguments, interactionInitiatedBy);
- if(validity.isVetoed()) {
- throw new RecoverableException(validity.getReasonAsString().orElse("no reason given"));
- }
+ if(validity.isVetoed())
+ throw new RecoverableException(validity.getReasonAsString().orElse("no reason given"));
- return execute(head, arguments, interactionInitiatedBy);
+ return execute(head, arguments, interactionInitiatedBy, visibilityConstraint.whatViewer());
}
/**
@@ -433,7 +425,8 @@ public ManagedObject executeWithRuleChecking(
public ManagedObject execute(
final InteractionHead head,
final Can argumentAdapters,
- final InteractionInitiatedBy interactionInitiatedBy) {
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final WhatViewer whatViewer) {
_Assert.assertEquals(this.getParameterCount(), argumentAdapters.size(),
"action's parameter count and provided argument count must match");
@@ -455,7 +448,7 @@ public ManagedObject execute(
}
}
- return this.executeInternal(head, argumentAdapters, interactionInitiatedBy);
+ return this.executeInternal(head, argumentAdapters, interactionInitiatedBy, whatViewer);
}
/**
@@ -464,10 +457,11 @@ public ManagedObject execute(
protected ManagedObject executeInternal(
final InteractionHead head,
final Can argumentAdapters,
- final InteractionInitiatedBy interactionInitiatedBy) {
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final WhatViewer whatViewer) {
var actionInvocationFacet = getFacet(ActionInvocationFacet.class);
return actionInvocationFacet
- .invoke(this, head, argumentAdapters, interactionInitiatedBy);
+ .invoke(this, head, argumentAdapters, interactionInitiatedBy, whatViewer);
}
protected Optional getActionInvocationFacet() {
@@ -530,9 +524,8 @@ public void setupCommand(
final InteractionHead head,
final Can argumentAdapters) {
- if(head.owner().objSpec().isValue()) {
- return; // do not record value type mixin actions
- }
+ if(head.owner().objSpec().isValue())
+ return; // do not record value type mixin actions
setupCommand(head,
interactionId->commandDtoFor(interactionId, head, argumentAdapters));
@@ -571,9 +564,8 @@ public FacetHolder getFacetHolder() {
// -- HELPER
protected String argsFor(final Can parameters, final Can arguments) {
- if(parameters.size() != arguments.size()) {
- return "???"; // shouldn't happen
- }
+ if(parameters.size() != arguments.size())
+ return "???"; // shouldn't happen
return parameters.stream().map(IndexedFunction.zeroBased((i, param) -> {
var id = param.getId();
var argStr = argStr(id, arguments, i);
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java
index d878bd98e1c..ad20a0a7d4b 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java
@@ -36,6 +36,7 @@
import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet;
import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.MixedInAction;
@@ -154,7 +155,8 @@ protected ManagedObject mixinAdapterFor(final ManagedObject mixeeAdapter) {
public ManagedObject execute(
final InteractionHead head,
final Can argumentAdapters,
- final InteractionInitiatedBy interactionInitiatedBy) {
+ final InteractionInitiatedBy interactionInitiatedBy,
+ final WhatViewer whatViewer) {
final ManagedObject owner = head.owner();
final ManagedObject target = mixinAdapterFor(mixinSpec, owner);
@@ -178,7 +180,8 @@ public ManagedObject execute(
return mixinAction.executeInternal(
head, argumentAdapters,
- interactionInitiatedBy);
+ interactionInitiatedBy,
+ whatViewer);
}
@Override
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionParameterAbstract.java
index 744b4aad4e3..b78e797df44 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionParameterAbstract.java
@@ -21,6 +21,8 @@
import java.util.Optional;
import java.util.function.Supplier;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.Identifier;
import org.apache.causeway.applib.exceptions.unrecoverable.DomainModelException;
import org.apache.causeway.commons.collections.Can;
@@ -51,7 +53,6 @@
import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
abstract class ObjectActionParameterAbstract
implements
@@ -188,9 +189,8 @@ public Can getAutoComplete(
final InteractionInitiatedBy interactionInitiatedBy) {
var autoCompleteFacet = getFacet(ActionParameterAutoCompleteFacet.class);
- if (autoCompleteFacet == null) {
- return Can.empty();
- }
+ if (autoCompleteFacet == null)
+ return Can.empty();
var paramSpec = getElementType();
@@ -226,9 +226,8 @@ public Can getChoices(
var paramSpec = getElementType();
var choicesFacet = getFacet(ActionParameterChoicesFacet.class);
- if (choicesFacet == null) {
- return Can.empty();
- }
+ if (choicesFacet == null)
+ return Can.empty();
var visibleChoices = choicesFacet.getChoices(paramSpec,
pendingArgs.actionInteractionHead(),
@@ -296,11 +295,10 @@ static void checkChoicesOrAutoCompleteType(
// in other words is assignable from
// TODO: should implement this instead as a MetaModelValidator (subject to [CAUSEWAY-3172])
- if (!choiceWrappedSpec.isOfType(paramWrappedSpec)) {
- throw new DomainModelException(String.format(
+ if (!choiceWrappedSpec.isOfType(paramWrappedSpec))
+ throw new DomainModelException(String.format(
"Type incompatible with parameter type; expected %s, but was %s",
paramSpec.getFullIdentifier(), choiceClass.getName()));
- }
}
}
@@ -318,7 +316,7 @@ head, parentAction, getFeatureIdentifier(), pendingArgs, position, interactionIn
}
@Override
- public Consent isVisible(
+ public final Consent isVisible(
final InteractionHead head,
final Can pendingArgs,
final InteractionInitiatedBy interactionInitiatedBy) {
@@ -348,7 +346,7 @@ private ParamUsabilityContext createArgumentUsabilityContext(
}
@Override
- public Consent isUsable(
+ public final Consent isUsable(
final InteractionHead head,
final Can pendingArgs,
final InteractionInitiatedBy interactionInitiatedBy) {
@@ -356,8 +354,9 @@ public Consent isUsable(
var usabilityContext = createArgumentUsabilityContext(
head, pendingArgs, getParameterIndex(), interactionInitiatedBy);
- var usableResult = InteractionUtils.isUsableResult(this, usabilityContext);
- return usableResult.createConsent();
+ return InteractionUtils.isUsableResult(this, usabilityContext, ()->createArgumentVisibilityContext(
+ head, pendingArgs, getParameterIndex(), interactionInitiatedBy))
+ .createConsent();
}
// -- Validation
@@ -374,7 +373,7 @@ public ParamValidityContext createProposedArgumentInteractionContext(
}
@Override
- public Consent isValid(
+ public final Consent isValid(
final InteractionHead head,
final Can pendingArgs,
final InteractionInitiatedBy interactionInitiatedBy) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectMemberAbstract.java
index cd53c40cb7c..9572d448772 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectMemberAbstract.java
@@ -26,6 +26,8 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.applib.Identifier;
import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.iactn.InteractionProvider;
@@ -42,7 +44,7 @@
import org.apache.causeway.core.metamodel.facets.HasFacetedMethod;
import org.apache.causeway.core.metamodel.facets.all.described.MemberDescribedFacet;
import org.apache.causeway.core.metamodel.facets.all.help.HelpFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.all.i8n.staatic.HasStaticText;
import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet;
import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor;
@@ -50,6 +52,7 @@
import org.apache.causeway.core.metamodel.interactions.InteractionContext;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.interactions.acc.AccessContext;
import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
import org.apache.causeway.core.metamodel.interactions.vis.VisibilityContext;
@@ -61,7 +64,6 @@
import org.apache.causeway.schema.cmd.v2.CommandDto;
import lombok.Getter;
-import org.jspecify.annotations.NonNull;
abstract class ObjectMemberAbstract
implements
@@ -84,9 +86,8 @@ protected ObjectMemberAbstract(
this.featureIdentifier = featureIdentifier;
this.facetedMethod = facetedMethod;
this.featureType = featureType;
- if (getId() == null) {
- throw new IllegalArgumentException("Id must always be set");
- }
+ if (getId() == null)
+ throw new IllegalArgumentException("Id must always be set");
}
// -- IDENTIFIERS
@@ -113,13 +114,12 @@ public final String getFriendlyName(final Supplier domainObjectPr
var namedFacet = getFacet(MemberNamedFacet.class);
- if(namedFacet==null) {
- throw _Exceptions.unrecoverable("no MemberNamedFacet preset on %s", getFeatureIdentifier());
- }
+ if(namedFacet==null)
+ throw _Exceptions.unrecoverable("no MemberNamedFacet preset on %s", getFeatureIdentifier());
return namedFacet
.getSpecialization()
- .fold( textFacet->textFacet.translated(),
+ .fold( HasStaticText::translated,
textFacet->textFacet.textElseNull(headFor(domainObjectProvider.get()).target()));
}
@@ -138,7 +138,7 @@ public final Optional getDescription(final Supplier domai
return lookupFacet(MemberDescribedFacet.class)
.map(MemberDescribedFacet::getSpecialization)
.map(specialization->specialization
- .fold(textFacet->textFacet.translated(),
+ .fold(HasStaticText::translated,
textFacet->textFacet.textElseNull(headFor(domainObjectProvider.get()).target())));
}
@@ -195,13 +195,13 @@ public final Optional getCanonicalDescription() {
* {@link AccessContext} accesses) have no corresponding vetoing methods.
*/
protected abstract VisibilityContext createVisibleInteractionContext(
- final ManagedObject target,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where);
+ ManagedObject target,
+ InteractionInitiatedBy interactionInitiatedBy,
+ VisibilityConstraint visibilityConstraint);
@Override
public boolean isAlwaysHidden() {
- return HiddenFacet.isAlwaysHidden(getFacetHolder());
+ return HiddenFacetForLayout.isAlwaysHidden(getFacetHolder());
}
/**
@@ -209,12 +209,12 @@ public boolean isAlwaysHidden() {
* returns true only if none hide the member.
*/
@Override
- public Consent isVisible(
+ public final Consent isVisible(
final ManagedObject target,
final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
- var visibilityContext = createVisibleInteractionContext(target, interactionInitiatedBy, where);
+ var visibilityContext = createVisibleInteractionContext(target, interactionInitiatedBy, visibilityConstraint);
return InteractionUtils.isVisibleResult(this, visibilityContext).createConsent();
}
@@ -230,22 +230,22 @@ public Consent isVisible(
* {@link AccessContext} accesses) have no corresponding vetoing methods.
*/
protected abstract UsabilityContext createUsableInteractionContext(
- final ManagedObject target,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where);
+ ManagedObject target,
+ InteractionInitiatedBy interactionInitiatedBy);
/**
* Loops over all {@link DisablingInteractionAdvisor} {@link Facet}s and
* returns true only if none disables the member.
*/
@Override
- public Consent isUsable(
+ public final Consent isUsable(
final ManagedObject target,
final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
- var usabilityContext = createUsableInteractionContext(target, interactionInitiatedBy, where);
- return InteractionUtils.isUsableResult(this, usabilityContext).createConsent();
+ var usabilityContext = createUsableInteractionContext(target, interactionInitiatedBy);
+ return InteractionUtils.isUsableResult(this, usabilityContext, ()->createVisibleInteractionContext(target, interactionInitiatedBy, visibilityConstraint))
+ .createConsent();
}
// -- PREDICATES
@@ -277,9 +277,8 @@ protected ManagedObject mixinAdapterFor(
final @NonNull ManagedObject mixee) {
// nullable for action parameter mixins
- if(ManagedObjects.isNullOrUnspecifiedOrEmpty(mixee)) {
- return ManagedObject.empty(mixinSpec);
- }
+ if(ManagedObjects.isNullOrUnspecifiedOrEmpty(mixee))
+ return ManagedObject.empty(mixinSpec);
var mixinPojo = getFactoryService().mixin(mixinSpec.getCorrespondingClass(), mixee.getPojo());
return ManagedObject.mixin(mixinSpec, mixinPojo);
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java
index 381916f1a51..f6ecd455d5e 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java
@@ -75,7 +75,7 @@
import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
import org.apache.causeway.core.metamodel.facets.all.described.ObjectDescribedFacet;
import org.apache.causeway.core.metamodel.facets.all.help.HelpFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet;
import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName;
import org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet;
@@ -165,7 +165,7 @@ public ObjectSpecificationDefault(
// naturally supports attribute inheritance from the type's hierarchy
this.introspectionPolicy = this.lookupFacet(IntrospectionPolicyFacet.class)
- .map(introspectionPolicyFacet->introspectionPolicyFacet.getIntrospectionPolicy())
+ .map(IntrospectionPolicyFacet::getIntrospectionPolicy)
.orElseGet(()->mmc.getConfiguration().core().metaModel().introspector().policy());
this.facetedMethodsBuilder =
@@ -273,13 +273,12 @@ private Stream createAssociations() {
}
private ObjectAssociation createAssociation(final FacetedMethod facetMethod) {
- if (facetMethod.featureType().isCollection()) {
- return OneToManyAssociationDefault.forMethod(facetMethod);
- } else if (facetMethod.featureType().isProperty()) {
- return OneToOneAssociationDefault.forMethod(facetMethod);
- } else {
- return null;
- }
+ if (facetMethod.featureType().isCollection())
+ return OneToManyAssociationDefault.forMethod(facetMethod);
+ else if (facetMethod.featureType().isProperty())
+ return OneToOneAssociationDefault.forMethod(facetMethod);
+ else
+ return null;
}
private Stream createActions() {
@@ -302,9 +301,8 @@ private ObjectAction createAction(final FacetedMethod facetedMethod) {
return this.isMixin()
? ObjectActionDefault.forMixinMain(facetedMethod)
: ObjectActionDefault.forMethod(facetedMethod);
- } else {
- return null;
- }
+ } else
+ return null;
}
// -- getObjectAction
@@ -352,7 +350,7 @@ private void cataloguePropertiesAndCollections(final BiConsumer
field.streamFacets(ImperativeFacet.class)
- .map(ImperativeFacet::getMethods)
+ .map(ImperativeFacet::methods)
.flatMap(Can::stream)
.map(MethodFacade::asMethodElseFail) // expected regular
.peek(method->_Reflect.guardAgainstSynthetic(method.method())) // expected non-synthetic
@@ -363,7 +361,7 @@ private void catalogueActions(final BiConsumer onM
streamDeclaredActions(MixedIn.INCLUDED)
.forEach(userAction->
userAction.streamFacets(ImperativeFacet.class)
- .map(ImperativeFacet::getMethods)
+ .map(ImperativeFacet::methods)
.flatMap(Can::stream)
.map(MethodFacade::asMethodForIntrospection)
.peek(method->_Reflect.guardAgainstSynthetic(method.method())) // expected non-synthetic
@@ -375,7 +373,7 @@ private void catalogueActions(final BiConsumer onM
private final _Lazy> elementSpecification =
_Lazy.threadSafe(()->lookupFacet(TypeOfFacet.class)
- .map(typeOfFacet -> typeOfFacet.elementSpec()));
+ .map(TypeOfFacet::elementSpec));
@Override
public Optional getElementSpecification() {
@@ -555,7 +553,7 @@ public final String getFullIdentifier() {
}
@Override
- public void introspect(IntrospectionRequest request) {
+ public void introspect(final IntrospectionRequest request) {
switch (request) {
case REGISTER -> introspectUpTo(IntrospectionState.NOT_INTROSPECTED,
()->"introspect(%s)".formatted(request));
@@ -592,7 +590,7 @@ enum IntrospectionState {
/**
* @param introspectionContextProvider keeps track of the causal chain of introspection requests
*/
- private void introspectUpTo(final IntrospectionState upTo, Supplier introspectionContextProvider) {
+ private void introspectUpTo(final IntrospectionState upTo, final Supplier introspectionContextProvider) {
if(!isLessThan(upTo)) return; // optimization
if(log.isDebugEnabled()) {
@@ -645,9 +643,8 @@ private boolean isLessThan(final IntrospectionState upTo) {
}
protected void loadSpecOfSuperclass(final Class> superclass) {
- if (superclass == null) {
- return;
- }
+ if (superclass == null)
+ return;
superclassSpec = specLoaderInternal().loadSpecification(superclass);
if (superclassSpec != null) {
if (log.isDebugEnabled()) {
@@ -803,7 +800,7 @@ public Can getAliases() {
// -- ICON
@Override
- public Optional getIcon(final ManagedObject domainObject, ObjectSupport.IconSize iconSize) {
+ public Optional getIcon(final ManagedObject domainObject, final ObjectSupport.IconSize iconSize) {
if(ManagedObjects.isSpecified(domainObject)) {
_Assert.assertEquals(domainObject.objSpec(), this);
}
@@ -849,7 +846,7 @@ public boolean isOfTypeResolvePrimitive(final ObjectSpecification other) {
@Override
public String getSingularName() {
return lookupFacet(ObjectNamedFacet.class)
- .flatMap(textFacet->textFacet.translated())
+ .flatMap(ObjectNamedFacet::translated)
// unexpected code reach, however keep for JUnit testing
.orElseGet(()->String.format(
"(%s has neither title- nor object-named-facet)",
@@ -920,12 +917,10 @@ private static class NotANoopFacetFilter implements Predicate interfaces() {
@Override
public Can subclasses(final Depth depth) {
- if (depth == Depth.DIRECT) {
- return directSubclasses.snapshot();
- }
+ if (depth == Depth.DIRECT)
+ return directSubclasses.snapshot();
// depth == Depth.TRANSITIVE)
if (transitiveSubclasses == null) {
@@ -1061,9 +1055,8 @@ public Stream streamDeclaredActions(
* Creates all mixed in properties and collections for this spec.
*/
private Stream createMixedInAssociations() {
- if (isInjectable() || isValue()) {
- return Stream.empty();
- }
+ if (isInjectable() || isValue())
+ return Stream.empty();
return getCausewayBeanTypeRegistry().streamMixinTypes()
.flatMap(this::createMixedInAssociation);
}
@@ -1072,17 +1065,14 @@ private Stream createMixedInAssociation(final Class> mixinT
var mixinSpec = specLoaderInternal().loadSpecification(mixinType,
IntrospectionRequest.FULL);
if (mixinSpec == null
- || mixinSpec == this) {
- return Stream.empty();
- }
+ || mixinSpec == this)
+ return Stream.empty();
var mixinFacet = mixinSpec.mixinFacet().orElse(null);
- if(mixinFacet == null) {
- // this shouldn't happen; to be covered by meta-model validation later
+ if(mixinFacet == null)
+ // this shouldn't happen; to be covered by meta-model validation later
return Stream.empty();
- }
- if(!mixinFacet.isMixinFor(getCorrespondingClass())) {
- return Stream.empty();
- }
+ if(!mixinFacet.isMixinFor(getCorrespondingClass()))
+ return Stream.empty();
var mixinMethodName = mixinFacet.getMainMethodName();
return mixinSpec.streamActions(ActionScope.ANY, MixedIn.EXCLUDED)
@@ -1106,22 +1096,18 @@ private Stream createMixedInAction(final Class> mixinType
var mixinSpec = specLoaderInternal().loadSpecification(mixinType,
IntrospectionRequest.FULL);
if (mixinSpec == null
- || mixinSpec == this) {
- return Stream.empty();
- }
+ || mixinSpec == this)
+ return Stream.empty();
var mixinFacet = mixinSpec.mixinFacet().orElse(null);
- if(mixinFacet == null) {
- // this shouldn't happen; to be covered by meta-model validation later
- return Stream.empty();
- }
- if(!mixinFacet.isMixinFor(getCorrespondingClass())) {
+ if(mixinFacet == null)
+ // this shouldn't happen; to be covered by meta-model validation later
return Stream.empty();
- }
+ if(!mixinFacet.isMixinFor(getCorrespondingClass()))
+ return Stream.empty();
// don't mixin Object_ mixins to domain services
if(getBeanSort().isManagedBeanContributing()
- && mixinFacet.isMixinFor(java.lang.Object.class)) {
- return Stream.empty();
- }
+ && mixinFacet.isMixinFor(java.lang.Object.class))
+ return Stream.empty();
var mixinMethodName = mixinFacet.getMainMethodName();
@@ -1152,7 +1138,6 @@ private boolean whenIsValueThenIsAlsoConstructorMixin(final ObjectAction act) {
public Consent isValid(
final ManagedObject targetAdapter,
final InteractionInitiatedBy interactionInitiatedBy) {
-
return isValidResult(targetAdapter, interactionInitiatedBy).createConsent();
}
@@ -1160,9 +1145,7 @@ public Consent isValid(
public InteractionResult isValidResult(
final ManagedObject targetAdapter,
final InteractionInitiatedBy interactionInitiatedBy) {
- var validityContext =
- createValidityInteractionContext(
- targetAdapter, interactionInitiatedBy);
+ var validityContext = createValidityInteractionContext(targetAdapter, interactionInitiatedBy);
return InteractionUtils.isValidResult(this, validityContext);
}
@@ -1172,7 +1155,8 @@ public InteractionResult isValidResult(
*/
@Override
public ObjectValidityContext createValidityInteractionContext(
- final ManagedObject targetAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
+ final ManagedObject targetAdapter,
+ final InteractionInitiatedBy interactionInitiatedBy) {
return new ObjectValidityContext(targetAdapter, getFeatureIdentifier(), interactionInitiatedBy);
}
@@ -1184,7 +1168,7 @@ public boolean isImmutable() {
@Override
public boolean isHidden() {
- return containsFacet(HiddenFacet.class);
+ return containsFacet(HiddenFacetForLayout.class);
}
@Override
@@ -1205,14 +1189,12 @@ private void createMixedInActionsAndResort() {
|| getBeanSort().isManagedBeanContributing()
// in support of composite value-type constructor mixins
|| getBeanSort().isValue();
- if(!include) {
- return;
- }
+ if(!include)
+ return;
var mixedInActions = createMixedInActions()
.collect(Collectors.toList());
- if(mixedInActions.isEmpty()) {
- return; // nothing to do (this spec has no mixed-in actions, regular actions have already been added)
- }
+ if(mixedInActions.isEmpty())
+ return; // nothing to do (this spec has no mixed-in actions, regular actions have already been added)
var regularActions = _Lists.newArrayList(objectActions); // defensive copy
@@ -1228,14 +1210,12 @@ private void createMixedInActionsAndResort() {
* one-shot: must be no-op, if already created
*/
private void createMixedInAssociationsAndResort() {
- if(!isEntityOrViewModelOrAbstract()) {
- return;
- }
+ if(!isEntityOrViewModelOrAbstract())
+ return;
var mixedInAssociations = createMixedInAssociations()
.collect(Collectors.toList());
- if(mixedInAssociations.isEmpty()) {
- return; // nothing to do (this spec has no mixed-in associations, regular associations have already been added)
- }
+ if(mixedInAssociations.isEmpty())
+ return; // nothing to do (this spec has no mixed-in associations, regular associations have already been added)
var regularAssociations = _Lists.newArrayList(associations); // defensive copy
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java
index 29f21d07c9f..b75da93e7ce 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java
@@ -21,7 +21,6 @@
import org.apache.causeway.applib.Identifier;
import org.apache.causeway.applib.annotation.Collection;
import org.apache.causeway.applib.annotation.CollectionLayout;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.exceptions._Exceptions;
import org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedType;
@@ -31,7 +30,8 @@
import org.apache.causeway.core.metamodel.facets.FacetedMethod;
import org.apache.causeway.core.metamodel.facets.collections.CollectionFacet;
import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
+import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.interactions.use.CollectionUsabilityContext;
import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
import org.apache.causeway.core.metamodel.interactions.vis.CollectionVisibilityContext;
@@ -79,21 +79,20 @@ private ResolvedType resolveTypeOfAnyCardinality() {
public VisibilityContext createVisibleInteractionContext(
final ManagedObject ownerAdapter,
final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
return new CollectionVisibilityContext(
- headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy, where,
- InteractionUtils.renderPolicy(ownerAdapter));
+ headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy, visibilityConstraint,
+ RenderPolicy.forNonActionParam(ownerAdapter));
}
@Override
public UsabilityContext createUsableInteractionContext(
final ManagedObject ownerAdapter,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final InteractionInitiatedBy interactionInitiatedBy) {
return new CollectionUsabilityContext(
- headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy, where,
- InteractionUtils.renderPolicy(ownerAdapter));
+ headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy,
+ RenderPolicy.forNonActionParam(ownerAdapter));
}
// -- get, isEmpty, add, clear
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java
index 3d1a98f03be..54e0d890f71 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java
@@ -34,6 +34,7 @@
import org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
import org.apache.causeway.core.metamodel.facets.properties.update.SnapshotExcludeFacetFromImmutableMember;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.services.publishing.ExecutionPublisher;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -131,9 +132,8 @@ protected InteractionHead headFor(final ManagedObject mixedInAdapter) {
private DisabledFacet disabledFacet() {
final DisabledFacet originalFacet = facetHolder.getFacet(DisabledFacet.class);
if( originalFacet != null &&
- originalFacet.where().isAlways()) {
- return originalFacet;
- }
+ originalFacet.where().isAlways())
+ return originalFacet;
// ensure that the contributed association is always disabled
return new DisabledFacetForContributee(VetoReason.mixedinCollection(), this);
}
@@ -145,7 +145,7 @@ public ManagedObject get(
return executionPublisher().withPublishingSuppressed(
() -> mixinAction.executeInternal(
- headFor(ownerAdapter), Can.empty(), interactionInitiatedBy));
+ headFor(ownerAdapter), Can.empty(), interactionInitiatedBy, WhatViewer.invalid()));
}
@Override
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java
index ce7d544a473..37835599c72 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java
@@ -23,7 +23,6 @@
import org.apache.causeway.applib.Identifier;
import org.apache.causeway.applib.annotation.Property;
import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.services.command.Command;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.base._NullSafe;
@@ -44,6 +43,8 @@
import org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
+import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.interactions.use.PropertyUsabilityContext;
import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
import org.apache.causeway.core.metamodel.interactions.val.PropertyModifyContext;
@@ -88,20 +89,19 @@ protected OneToOneAssociationDefault(
public VisibilityContext createVisibleInteractionContext(
final ManagedObject ownerAdapter,
final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final VisibilityConstraint visibilityConstraint) {
return new PropertyVisibilityContext(
- headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy, where,
- InteractionUtils.renderPolicy(ownerAdapter));
+ headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy, visibilityConstraint,
+ RenderPolicy.forNonActionParam(ownerAdapter));
}
@Override
public UsabilityContext createUsableInteractionContext(
final ManagedObject ownerAdapter,
- final InteractionInitiatedBy interactionInitiatedBy,
- final Where where) {
+ final InteractionInitiatedBy interactionInitiatedBy) {
return new PropertyUsabilityContext(
- headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy, where,
- InteractionUtils.renderPolicy(ownerAdapter));
+ headFor(ownerAdapter), getFeatureIdentifier(), interactionInitiatedBy,
+ RenderPolicy.forNonActionParam(ownerAdapter));
}
// -- VALIDITY
@@ -157,11 +157,10 @@ public ManagedObject get(
var referencedPojo =
propertyOrCollectionAccessorFacet.getAssociationValueAsPojo(ownerAdapter, interactionInitiatedBy);
- if (referencedPojo == null) {
- // TODO: perhaps this should instead return ManagedObject.empty(getSpecification()) ?
+ if (referencedPojo == null)
+ // TODO: perhaps this should instead return ManagedObject.empty(getSpecification()) ?
// however, that's a far-reaching change to make.
return null;
- }
return getObjectManager().adapt(referencedPojo);
}
@@ -194,11 +193,10 @@ public final ManagedObject set(
setupCommand(InteractionHead.regular(ownerAdapter), newValue);
}
- if (ManagedObjects.isNullOrUnspecifiedOrEmpty(newValue)) {
- return clearValue(ownerAdapter, interactionInitiatedBy);
- } else {
- return setValue(ownerAdapter, newValue, interactionInitiatedBy);
- }
+ if (ManagedObjects.isNullOrUnspecifiedOrEmpty(newValue))
+ return clearValue(ownerAdapter, interactionInitiatedBy);
+ else
+ return setValue(ownerAdapter, newValue, interactionInitiatedBy);
}
private ManagedObject setValue(
@@ -207,9 +205,8 @@ private ManagedObject setValue(
final InteractionInitiatedBy interactionInitiatedBy) {
var propertySetterFacet = getFacet(PropertySetterFacet.class);
- if (propertySetterFacet == null) {
- throw _Exceptions.unexpectedCodeReach();
- }
+ if (propertySetterFacet == null)
+ throw _Exceptions.unexpectedCodeReach();
MmEntityUtils.requiresWhenFirstIsBookmarkableSecondIsAlso(ownerAdapter, newReferencedAdapter);
@@ -222,9 +219,8 @@ private ManagedObject clearValue(
var propertyClearFacet = getFacet(PropertyClearFacet.class);
- if (propertyClearFacet == null) {
- throw _Exceptions.unexpectedCodeReach();
- }
+ if (propertyClearFacet == null)
+ throw _Exceptions.unexpectedCodeReach();
return propertyClearFacet.clearProperty(this, ownerAdapter, interactionInitiatedBy);
}
@@ -241,18 +237,16 @@ public ManagedObject getDefault(final ManagedObject ownerAdapter) {
if (propertyDefaultFacet == null) {
propertyDefaultFacet = this.getElementType().getFacet(PropertyDefaultFacet.class);
}
- if (propertyDefaultFacet == null) {
- return null;
- }
+ if (propertyDefaultFacet == null)
+ return null;
return propertyDefaultFacet.getDefault(ownerAdapter);
}
@Override
public void toDefault(final ManagedObject ownerAdapter) {
// default only mandatory fields
- if (!MandatoryFacet.isMandatory(this)) {
- return;
- }
+ if (!MandatoryFacet.isMandatory(this))
+ return;
final ManagedObject defaultValue = getDefault(ownerAdapter);
if (defaultValue != null) {
@@ -273,9 +267,8 @@ public Can getChoices(
final InteractionInitiatedBy interactionInitiatedBy) {
var propertyChoicesFacet = getFacet(PropertyChoicesFacet.class);
- if (propertyChoicesFacet == null) {
- return Can.empty();
- }
+ if (propertyChoicesFacet == null)
+ return Can.empty();
return propertyChoicesFacet.getChoices(
ownerAdapter,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java
index bd6a030883c..06d7e82527c 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java
@@ -31,6 +31,7 @@
import org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacet;
import org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.services.publishing.ExecutionPublisher;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -112,9 +113,8 @@ protected InteractionHead headFor(final ManagedObject mixeeAdapter) {
private DisabledFacet disabledFacet() {
final DisabledFacet originalFacet = facetHolder.getFacet(DisabledFacet.class);
if( originalFacet != null &&
- originalFacet.where().isAlways()) {
- return originalFacet;
- }
+ originalFacet.where().isAlways())
+ return originalFacet;
// ensure that the contributed association is always disabled
return new DisabledFacetForContributee(VetoReason.mixedinProperty(), this);
}
@@ -127,7 +127,7 @@ public ManagedObject get(
var head = headFor(mixedInAdapter);
return executionPublisher().withPublishingSuppressed(
- () -> mixinAction.executeInternal(head, Can.empty(), interactionInitiatedBy)
+ () -> mixinAction.executeInternal(head, Can.empty(), interactionInitiatedBy, WhatViewer.invalid())
);
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java
index 5ce2f3c7c2f..b5b9b83ad70 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java
@@ -36,7 +36,7 @@
import org.apache.causeway.core.metamodel.facets.members.cssclass.annotprop.CssClassFacetOnActionFromConfiguredRegexFactory;
import org.apache.causeway.core.metamodel.facets.members.described.method.DescribedAsFacetForMemberViaMethodFactory;
import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethodFactory;
-import org.apache.causeway.core.metamodel.facets.members.hidden.method.HideForContextFacetViaMethodFactory;
+import org.apache.causeway.core.metamodel.facets.members.hidden.method.HiddenFacetForMemberViaMethodFactory;
import org.apache.causeway.core.metamodel.facets.members.named.method.NamedFacetForMemberViaMethodFactory;
import org.apache.causeway.core.metamodel.facets.object.ViewModelSemanticCheckingFacetFactory;
import org.apache.causeway.core.metamodel.facets.object.bookmarkpolicy.bookmarkable.BookmarkPolicyFacetFallbackFactory;
@@ -47,7 +47,7 @@
import org.apache.causeway.core.metamodel.facets.object.domainservice.annotation.DomainServiceFacetAnnotationFactory;
import org.apache.causeway.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacetFactory;
import org.apache.causeway.core.metamodel.facets.object.grid.GridFacetFactory;
-import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenTypeFacetFromAuthorizationFactory;
+import org.apache.causeway.core.metamodel.facets.object.hidden.HiddenFacetForNoMembersAuthorizedFactory;
import org.apache.causeway.core.metamodel.facets.object.ignore.annotation.RemoveAnnotatedMethodsFacetFactory;
import org.apache.causeway.core.metamodel.facets.object.ignore.javalang.IteratorFilteringFacetFactory;
import org.apache.causeway.core.metamodel.facets.object.ignore.javalang.RemoveMethodsFacetFactory;
@@ -181,7 +181,7 @@ private void addFacetFactories() {
addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new NamedFacetForMemberViaMethodFactory(mmc));
addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new DescribedAsFacetForMemberViaMethodFactory(mmc));
addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new DisableForContextFacetViaMethodFactory(mmc));
- addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new HideForContextFacetViaMethodFactory(mmc));
+ addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new HiddenFacetForMemberViaMethodFactory(mmc));
addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new CallbackFacetFactory(mmc));
@@ -213,7 +213,7 @@ private void addFacetFactories() {
// must come after DomainObjectAnnotationFacetFactory & MixinFacetFactory
addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ContributingFacetFromMixinFacetFactory(mmc));
- addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new HiddenTypeFacetFromAuthorizationFactory(mmc));
+ addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new HiddenFacetForNoMembersAuthorizedFactory(mmc));
addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ValueSemanticsAnnotationFacetFactory(mmc));
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ValidatorDomainIncludeAnnotationEnforcesMetamodelContribution.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ValidatorDomainIncludeAnnotationEnforcesMetamodelContribution.java
index 555f5a27a92..663322b1120 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ValidatorDomainIncludeAnnotationEnforcesMetamodelContribution.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ValidatorDomainIncludeAnnotationEnforcesMetamodelContribution.java
@@ -105,7 +105,7 @@ public void validateObjectEnter(final ObjectSpecification spec) {
.flatMap(Optional::stream)
.filter(ImperativeFacet.class::isInstance)
.map(ImperativeFacet.class::cast)
- .map(ImperativeFacet::getMethods)
+ .map(ImperativeFacet::methods)
.flatMap(Can::stream)
.map(MethodFacade::asMethodForIntrospection)
.forEach(supportMethods::add);
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_SpecPredicates.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_SpecPredicates.java
index df1d5fea4d9..b6de9c0e158 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_SpecPredicates.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_SpecPredicates.java
@@ -19,7 +19,7 @@
package org.apache.causeway.core.metamodel.spec.impl;
import org.apache.causeway.core.metamodel.facets.actions.contributing.ContributingFacet;
-import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacetForLayout;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
import org.jspecify.annotations.NonNull;
@@ -42,7 +42,7 @@ static boolean isGetterCandidate(final @NonNull ObjectAction action) {
// -- HIGHER LEVEL - MIXINS
static boolean isMixedInAction(final @NonNull ObjectAction mixinAction) {
- if(HiddenFacet.isAlwaysHidden(mixinAction)) {
+ if(HiddenFacetForLayout.isAlwaysHidden(mixinAction)) {
return false;
}
if(ContributingFacet.isActionContributionVetoed(mixinAction)) {
@@ -58,7 +58,7 @@ static boolean isMixedInAssociation(final @NonNull ObjectAction mixinAction) {
if(!mixinAction.getSemantics().isSafeInNature()) {
return false;
}
- if(HiddenFacet.isAlwaysHidden(mixinAction)) {
+ if(HiddenFacetForLayout.isAlwaysHidden(mixinAction)) {
return false;
}
if(ContributingFacet.isAssociationContributionVetoed(mixinAction)) {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataColumn.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataColumn.java
index 609f99b330c..42c9ac07e74 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataColumn.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataColumn.java
@@ -29,8 +29,8 @@ public interface DataColumn {
* Corresponds to the association's id.
*/
String columnId();
+
ObjectAssociation associationMetaModel();
Observable columnFriendlyNameObservable();
Observable> columnDescriptionObservable();
-
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataTableInteractive.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataTableInteractive.java
index 5ae6e23e323..3bde11973d9 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataTableInteractive.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/DataTableInteractive.java
@@ -29,6 +29,7 @@
import org.apache.causeway.commons.binding.Bindable;
import org.apache.causeway.commons.binding.Observable;
import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.interactions.managed.ActionInteraction;
import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
import org.apache.causeway.core.metamodel.interactions.managed.ManagedCollection;
@@ -89,7 +90,7 @@ public Optional> asComparator(final Can extends Data
// -- ASSOCIATED ACTION
- ActionInteraction startAssociatedActionInteraction(final String actionId, final Where where);
+ ActionInteraction startAssociatedActionInteraction(String actionId, VisibilityConstraint visibilityConstraint);
// -- ROW COUNT
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataColumnInternal.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataColumnInternal.java
index 75c0278c1b4..2b9a5b82434 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataColumnInternal.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataColumnInternal.java
@@ -20,13 +20,13 @@
import java.util.Optional;
+import org.jspecify.annotations.NonNull;
+
import org.apache.causeway.commons.internal.binding._Observables;
import org.apache.causeway.commons.internal.binding._Observables.LazyObservable;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
import org.apache.causeway.core.metamodel.tabular.DataColumn;
-import org.jspecify.annotations.NonNull;
-
record DataColumnInternal(
@NonNull String columnId,
@NonNull ObjectAssociation associationMetaModel,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataRowInternal.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataRowInternal.java
index 07aca2b6ab5..747d314cb13 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataRowInternal.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataRowInternal.java
@@ -20,6 +20,7 @@
import java.util.Optional;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.annotation.Where;
@@ -28,14 +29,13 @@
import org.apache.causeway.commons.internal.binding._Bindables;
import org.apache.causeway.commons.internal.binding._Bindables.BooleanBindable;
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.object.ManagedObjects;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
import org.apache.causeway.core.metamodel.tabular.DataColumn;
import org.apache.causeway.core.metamodel.tabular.DataRow;
-import org.jspecify.annotations.NonNull;
-
record DataRowInternal(
int rowIndex,
ManagedObject rowElement,
@@ -60,29 +60,22 @@ public Optional lookupColumnById(final @NonNull String columnId) {
.findFirst();
}
- /**
- * Can be none, one or many per table cell.
- */
@Override
public Can getCellElementsForColumn(final @NonNull DataColumn column) {
final ObjectAssociation assoc = column.associationMetaModel();
- var interactionInitiatedBy = InteractionInitiatedBy.PASS_THROUGH;
return assoc.getSpecialization().fold(
property-> Can.of(
// similar to ManagedProperty#reassessPropertyValue
- property.isVisible(rowElement(), interactionInitiatedBy, Where.ALL_TABLES).isAllowed()
- ? property.get(rowElement(), interactionInitiatedBy)
+ property.isVisible(rowElement(), InteractionInitiatedBy.USER, VISIBILITY_CONSTRAINT).isAllowed()
+ ? property.get(rowElement(), InteractionInitiatedBy.USER)
: ManagedObject.empty(property.getElementType())),
collection-> ManagedObjects.unpack(
- collection.isVisible(rowElement(), interactionInitiatedBy, Where.ALL_TABLES).isAllowed()
- ? collection.get(rowElement(), interactionInitiatedBy)
+ collection.isVisible(rowElement(), InteractionInitiatedBy.USER, VISIBILITY_CONSTRAINT).isAllowed()
+ ? collection.get(rowElement(), InteractionInitiatedBy.USER)
: null
));
}
- /**
- * Can be none, one or many per table cell. (returns empty Can if column not found)
- */
@Override
public Can getCellElementsForColumn(final @NonNull String columnId) {
return lookupColumnById(columnId)
@@ -90,4 +83,7 @@ public Can