You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/03/25 18:01:50 UTC

[4/8] isis git commit: ISIS-1113: allowing vetoing subscribers to provide translatable reasons

ISIS-1113: allowing vetoing subscribers to provide translatable reasons


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/8346a6be
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/8346a6be
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/8346a6be

Branch: refs/heads/master
Commit: 8346a6beb55abfba319935e2eaba662ee5c73f8a
Parents: 89853e2
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Mar 25 07:31:57 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Mar 25 16:52:50 2015 +0000

----------------------------------------------------------------------
 .../services/eventbus/AbstractDomainEvent.java  | 91 ++++++++++++++++++--
 .../ActionDomainEventFacetAbstract.java         | 22 ++++-
 .../CollectionDomainEventFacetAbstract.java     | 18 ++++
 .../PropertyDomainEventFacetAbstract.java       | 18 ++++
 4 files changed, 142 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8346a6be/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java
index 947e84e..8ac07b7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java
@@ -22,6 +22,7 @@ import java.util.Map;
 import com.google.common.collect.Maps;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.util.ObjectContracts;
 
 public abstract class AbstractDomainEvent<S> extends java.util.EventObject {
@@ -108,48 +109,103 @@ public abstract class AbstractDomainEvent<S> extends java.util.EventObject {
         return hidden;
     }
 
+    /**
+     * @see #veto(String, Object...)
+     */
     public void hide() {
         this.hidden = true;
     }
     //endregion
 
-    //region > disable, isDisabled, getDisabledReason
+    //region > disable, isDisabled, getDisabledReason, getDisabledReasonTranslatable
     private String disabledReason;
+
     public boolean isDisabled() {
-        return disabledReason != null;
+        return disabledReason != null || disabledReasonTranslatable != null;
     }
+
+    /**
+     * If {@link #isDisabled() disabled}, then either this method returns non-null or {@link #getDisabledReasonTranslatable()} will.
+     */
     public String getDisabledReason() {
         return disabledReason;
     }
+
+    /**
+     * @see #disable(org.apache.isis.applib.services.i18n.TranslatableString)
+     * @see #veto(String, Object...)
+     */
     public void disable(final String reason) {
         this.disabledReason = reason;
     }
+
+    private TranslatableString disabledReasonTranslatable;
+    /**
+     * If {@link #isDisabled() disabled}, then either this method returns non-null or {@link #getDisabledReason()} will.
+     */
+    public TranslatableString getDisabledReasonTranslatable() {
+        return disabledReasonTranslatable;
+    }
+    /**
+     * @see #disable(java.lang.String)
+     * @see #veto(org.apache.isis.applib.services.i18n.TranslatableString)
+     */
+    public void disable(final TranslatableString reason) {
+        this.disabledReasonTranslatable = reason;
+    }
     //endregion
 
-    //region > invalidate, isInvalid, getInvalidityReason
+    //region > invalidate, isInvalid, getInvalidityReason, getInvalidityReasonTranslatable
     private String invalidatedReason;
     public boolean isInvalid() {
-        return invalidatedReason != null;
+        return invalidatedReason != null || invalidatedReasonTranslatable != null;
     }
+
+    /**
+     * If {@link #isInvalid() invalid}, then either this method returns non-null or {@link #getInvalidityReasonTranslatable()} will.
+     */
     public String getInvalidityReason() {
         return invalidatedReason;
     }
+    /**
+     * @see #invalidate(org.apache.isis.applib.services.i18n.TranslatableString)
+     * @see #veto(String, Object...)
+     */
     public void invalidate(final String reason) {
         this.invalidatedReason = reason;
     }
+
+    private TranslatableString invalidatedReasonTranslatable;
+    /**
+     * If {@link #isInvalid() invalid}, then either this method returns non-null or {@link #getInvalidityReason()} will.
+     */
+    public TranslatableString getInvalidityReasonTranslatable() {
+        return invalidatedReasonTranslatable;
+    }
+
+    /**
+     * @see #invalidate(String)
+     * @see #veto(org.apache.isis.applib.services.i18n.TranslatableString)
+     */
+    public void invalidate(final TranslatableString reason) {
+        this.invalidatedReasonTranslatable = reason;
+    }
+
     //endregion
 
     //region > veto
     /**
      * Use instead of {@link #hide()}, {@link #disable(String)} and {@link #invalidate(String)}; just delegates to
-     * appropriate vetoing method based upon the {@link #getPhase()}.
+     * appropriate vetoing method based upon the {@link #getEventPhase() phase}.
      *
      * <p>
      *     If hiding, just pass <tt>null</tt> for the parameter.
      * </p>
      *
-     * @param reason - reason why the interaction is being invalidated (ignored if in {@link org.apache.isis.applib.services.eventbus.AbstractInteractionEvent.Phase#HIDE hide} phase).
+     * @param reason - reason why the interaction is being invalidated (ignored if in {@link org.apache.isis.applib.services.eventbus.AbstractDomainEvent.Phase#HIDE hide} phase).
      * @param args
+     *
+     * @see #veto(org.apache.isis.applib.services.i18n.TranslatableString)
      */
     @Programmatic
     public void veto(final String reason, final Object... args) {
@@ -162,6 +218,29 @@ public abstract class AbstractDomainEvent<S> extends java.util.EventObject {
                 invalidate(String.format(reason, args));
         }
     }
+    /**
+     * Use instead of {@link #hide()}, {@link #disable(org.apache.isis.applib.services.i18n.TranslatableString)} and {@link #invalidate(org.apache.isis.applib.services.i18n.TranslatableString)}; just delegates to
+     * appropriate vetoing method based upon the {@link #getEventPhase() phase}.
+     *
+     * <p>
+     *     If hiding, just pass <tt>null</tt> for the parameter.
+     * </p>
+     *
+     * @param translatableReason - reason why the interaction is being invalidated (ignored if in {@link org.apache.isis.applib.services.eventbus.AbstractDomainEvent.Phase#HIDE hide} phase).
+     *
+     * @see #veto(String)
+     */
+    @Programmatic
+    public void veto(final TranslatableString translatableReason) {
+        switch (getEventPhase()) {
+            case HIDE:
+                hide();
+            case DISABLE:
+                disable(translatableReason);
+            case VALIDATE:
+                invalidate(translatableReason);
+        }
+    }
     //endregion
 
     //region > userData

http://git-wip-us.apache.org/repos/asf/isis/blob/8346a6be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
index 392c1da..c1f61e3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
@@ -26,9 +26,12 @@ import org.apache.isis.applib.events.ValidityEvent;
 import org.apache.isis.applib.events.VisibilityEvent;
 import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
 import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
+import org.apache.isis.applib.services.i18n.TranslatableString;
+import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
 import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
@@ -42,6 +45,9 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 public abstract class ActionDomainEventFacetAbstract
         extends SingleClassValueFacetAbstract implements ActionDomainEventFacet {
 
+    private final TranslationService translationService;
+    private final String translationContext;
+
     static Class<? extends Facet> type() {
         return ActionDomainEventFacet.class;
     }
@@ -54,6 +60,11 @@ public abstract class ActionDomainEventFacetAbstract
             final ServicesInjector servicesInjector,
             final SpecificationLoader specificationLoader) {
         super(type(), holder, eventType, specificationLoader);
+
+        this.translationService = servicesInjector.lookupService(TranslationService.class);
+        // sadness: same as in TranslationFactory
+        this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
+
         domainEventHelper = new DomainEventHelper(servicesInjector);
     }
 
@@ -93,7 +104,12 @@ public abstract class ActionDomainEventFacetAbstract
                         null,
                         null);
         if (event != null && event.isDisabled()) {
+            final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable();
+            if(reasonTranslatable != null) {
+                return reasonTranslatable.translate(translationService, translationContext);
+            }
             return event.getDisabledReason();
+
         }
         return null;
     }
@@ -104,7 +120,7 @@ public abstract class ActionDomainEventFacetAbstract
     }
 
     @Override
-    public String invalidates(ValidityContext<? extends ValidityEvent> ic) {
+    public String invalidates(final ValidityContext<? extends ValidityEvent> ic) {
         if(!domainEventHelper.hasEventBusService()) {
             return null;
         }
@@ -118,6 +134,10 @@ public abstract class ActionDomainEventFacetAbstract
                         null,
                         null);
         if (event != null && event.isInvalid()) {
+            final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable();
+            if(reasonTranslatable != null) {
+                return reasonTranslatable.translate(translationService, translationContext);
+            }
             return event.getInvalidityReason();
         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8346a6be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
index 4e221c7..4a433fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
@@ -24,7 +24,10 @@ import org.apache.isis.applib.events.ValidityEvent;
 import org.apache.isis.applib.events.VisibilityEvent;
 import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
 import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
+import org.apache.isis.applib.services.i18n.TranslatableString;
+import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
 import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
@@ -38,6 +41,8 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 public abstract class CollectionDomainEventFacetAbstract extends SingleClassValueFacetAbstract implements CollectionDomainEventFacet {
 
     private final DomainEventHelper domainEventHelper;
+    private final TranslationService translationService;
+    private final String translationContext;
 
     public CollectionDomainEventFacetAbstract(
             final Class<? extends CollectionDomainEvent<?, ?>> eventType,
@@ -45,6 +50,11 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
             final ServicesInjector servicesInjector,
             final SpecificationLoader specificationLoader) {
         super(CollectionDomainEventFacet.class, holder, eventType, specificationLoader);
+
+        this.translationService = servicesInjector.lookupService(TranslationService.class);
+        // sadness: same as in TranslationFactory
+        this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
+
         domainEventHelper = new DomainEventHelper(servicesInjector);
     }
 
@@ -81,6 +91,10 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
                         CollectionDomainEvent.Of.ACCESS,
                         null);
         if (event != null && event.isDisabled()) {
+            final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable();
+            if(reasonTranslatable != null) {
+                return reasonTranslatable.translate(translationService, translationContext);
+            }
             return event.getDisabledReason();
         }
         return null;
@@ -108,6 +122,10 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
                         of,
                         proposed);
         if (event != null && event.isInvalid()) {
+            final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable();
+            if(reasonTranslatable != null) {
+                return reasonTranslatable.translate(translationService, translationContext);
+            }
             return event.getInvalidityReason();
         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8346a6be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
index c4c5d50..77afa56 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
@@ -24,8 +24,11 @@ import org.apache.isis.applib.events.ValidityEvent;
 import org.apache.isis.applib.events.VisibilityEvent;
 import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
 import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
+import org.apache.isis.applib.services.i18n.TranslatableString;
+import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
@@ -42,6 +45,8 @@ public abstract class PropertyDomainEventFacetAbstract
     private final DomainEventHelper domainEventHelper;
 
     private final PropertyOrCollectionAccessorFacet getterFacet;
+    private final TranslationService translationService;
+    private final String translationContext;
 
     public PropertyDomainEventFacetAbstract(
             final Class<? extends PropertyDomainEvent<?, ?>> eventType,
@@ -51,6 +56,11 @@ public abstract class PropertyDomainEventFacetAbstract
             final SpecificationLoader specificationLoader) {
         super(PropertyDomainEventFacet.class, holder, eventType, specificationLoader);
         this.getterFacet = getterFacet;
+
+        this.translationService = servicesInjector.lookupService(TranslationService.class);
+        // sadness: same as in TranslationFactory
+        this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
+
         domainEventHelper = new DomainEventHelper(servicesInjector);
     }
 
@@ -85,6 +95,10 @@ public abstract class PropertyDomainEventFacetAbstract
                         getIdentified(), ic.getTarget(),
                         null, null);
         if (event != null && event.isDisabled()) {
+            final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable();
+            if(reasonTranslatable != null) {
+                return reasonTranslatable.translate(translationService, translationContext);
+            }
             return event.getDisabledReason();
         }
         return null;
@@ -106,6 +120,10 @@ public abstract class PropertyDomainEventFacetAbstract
                         getIdentified(), ic.getTarget(),
                         oldValue, proposedValue);
         if (event != null && event.isInvalid()) {
+            final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable();
+            if(reasonTranslatable != null) {
+                return reasonTranslatable.translate(translationService, translationContext);
+            }
             return event.getInvalidityReason();
         }