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 2019/01/08 07:25:50 UTC

[isis] branch master updated (74f46ee -> ee80c61)

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

danhaywood pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 74f46ee  ISIS-1899: fixes index.html for 1.17.0
     new def829a  ISIS-2072: bumps core's parent to latest ASF version (21)
     new 3c2c5c6  ISIS-2078: extends @ActionLayout to allow modal vs sidebar promptStyle to be selected on an action-by-action basis
     new 7cc51fc  ISIS-2078: tidies up StandaloneCollectionPanel, no longer implements ActionPromptProvider
     new c6f8229  ISIS-2078: tidies up StandaloneCollectionPanel, removes unused div for modal dialog
     new 0d0a4a7  ISIS-2078: handles service actions (ie menu items) gracefully if there promptStyle is set to INLINE or INLINE_AS_IF_EDIT
     new 115c700  ISIS-2080: adds LayoutFacet with Method and Fallback implementations
     new f2841bc  ISIS-2080: adds GridService2 and GridLoaderService2 with support for loading different layouts
     new 3b90371  ISIS-2079: improves rebuildMetaModel mixin to return the object being rebuilt.
     new 37aeeeb  ISIS-2079: fixes rebuildMetaModel to return the mixee rather than itself (a mixin)
     new ee80c61  ISIS-2081: updates @ActionLayout and XML to allow redirect policy to be specified on a case-by-case basis.

The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../asciidoc/applib/layout/component/component.xsd |  12 ++
 .../rgant/_rgant-ActionLayout_promptStyle.adoc     |  16 ++-
 .../isis/applib/annotation/ActionLayout.java       |   8 ++
 .../apache/isis/applib/annotation/PromptStyle.java |  18 ++-
 .../{BookmarkPolicy.java => Redirect.java}         |  27 ++--
 .../applib/layout/component/ActionLayoutData.java  |  14 ++
 .../GridLoaderService2.java}                       |  14 +-
 .../GridService2.java}                             |  15 +-
 .../services/layout/Object_rebuildMetamodel.java   |   3 +-
 .../actions/layout/ActionLayoutFacetFactory.java   |  10 ++
 ...> RedirectFacetFromActionLayoutAnnotation.java} |  20 +--
 ...ionXml.java => RedirectFacetFromActionXml.java} |  20 +--
 .../redirect/RedirectFacet.java}                   |  10 +-
 .../RedirectFacetAbstract.java}                    |  33 +++--
 .../redirect/RedirectFacetFallback.java}           |  11 +-
 .../metamodel/facets/object/grid/GridFacet.java    |   3 +-
 .../facets/object/grid/GridFacetDefault.java       |  20 +--
 .../facets/object/grid/GridFacetFactory.java       |   4 +-
 .../layout/LayoutFacet.java}                       |  20 +--
 .../layout/LayoutFacetAbstract.java}               |  13 +-
 .../LayoutFacetFactory.java}                       |  24 ++--
 .../layout/LayoutFacetFallback.java}               |  17 +--
 .../LayoutFacetMethod.java}                        |  14 +-
 .../services/grid/GridLoaderServiceDefault.java    | 159 +++++++++++++++------
 .../services/grid/GridServiceDefault.java          |  14 +-
 .../services/grid/GridSystemServiceAbstract.java   |   2 +
 .../services/layout/LayoutServiceDefault.java      |   2 +-
 .../dflt/ProgrammingModelFacetsJava5.java          |   2 +
 .../LayoutFacetFactoryTest.java}                   |  28 ++--
 .../LayoutFacetMethodTest.java}                    |  28 ++--
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   8 +-
 core/pom.xml                                       |   2 +-
 .../resources/DomainObjectResourceServerside.java  |   3 +-
 .../resources/DomainTypeResourceServerside.java    |   2 +-
 .../wicket/model/models/ActionPromptProvider.java  |   7 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   5 +-
 .../links/EntityLinksSelectorPanelFactory.java     |   4 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   5 +-
 .../StandaloneCollectionPanel.html                 |   2 -
 .../StandaloneCollectionPanel.java                 |  17 +--
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  13 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  35 +++--
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |  50 +++++--
 .../wicket/ui/panels/PromptFormAbstract.java       |   9 +-
 45 files changed, 487 insertions(+), 258 deletions(-)
 copy core/applib/src/main/java/org/apache/isis/applib/annotation/{BookmarkPolicy.java => Redirect.java} (60%)
 copy core/applib/src/main/java/org/apache/isis/applib/services/{background/BackgroundService2.java => grid/GridLoaderService2.java} (70%)
 copy core/applib/src/main/java/org/apache/isis/applib/services/{background/BackgroundService2.java => grid/GridService2.java} (70%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/{NamedFacetForActionLayoutAnnotation.java => RedirectFacetFromActionLayoutAnnotation.java} (60%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/{DescribedAsFacetForActionXml.java => RedirectFacetFromActionXml.java} (62%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{jaxb/XmlTransientFacet.java => actions/redirect/RedirectFacet.java} (77%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/{position/ActionPositionFacetAbstract.java => redirect/RedirectFacetAbstract.java} (61%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{object/audit/AuditableFacetImpl.java => actions/redirect/RedirectFacetFallback.java} (75%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{value/datetimejoda/JodaDateTimeValueFacet.java => object/layout/LayoutFacet.java} (72%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{actions/notinservicemenu/NotInServiceMenuFacetAbstract.java => object/layout/LayoutFacetAbstract.java} (74%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/{icon/method/IconFacetMethodFactory.java => layout/LayoutFacetFactory.java} (72%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{fallback/TitleFacetNone.java => object/layout/LayoutFacetFallback.java} (69%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/{icon/method/IconFacetMethod.java => layout/LayoutFacetMethod.java} (79%)
 copy core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/{icon/IconFacetMethodFactoryTest.java => layout/LayoutFacetFactoryTest.java} (68%)
 copy core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/{icon/IconFacetMethodTest.java => layout/LayoutFacetMethodTest.java} (71%)


[isis] 02/10: ISIS-2078: extends @ActionLayout to allow modal vs sidebar promptStyle to be selected on an action-by-action basis

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3c2c5c6518dbec41f67c27174fa9d5acb14b57ce
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 7 09:35:35 2019 +0000

    ISIS-2078: extends @ActionLayout to allow modal vs sidebar promptStyle to be selected on an action-by-action basis
    
    (Rather than only globally selected via a configuration property)
---
 .../asciidoc/applib/layout/component/component.xsd |  2 ++
 .../rgant/_rgant-ActionLayout_promptStyle.adoc     | 16 ++++++++--
 .../apache/isis/applib/annotation/PromptStyle.java | 18 +++++++++--
 .../wicket/model/models/ActionPromptProvider.java  |  7 ++++-
 .../components/scalars/ScalarPanelAbstract2.java   |  5 +--
 .../StandaloneCollectionPanel.java                 |  8 ++++-
 .../linkandlabel/ActionLinkFactoryAbstract.java    | 13 +-------
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  | 36 +++++++++++++++++-----
 .../wicket/ui/panels/PromptFormAbstract.java       |  9 +++---
 9 files changed, 80 insertions(+), 34 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
index 7eca3ef..bb76e01 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
@@ -162,6 +162,8 @@
     <xs:restriction base="xs:string">
       <xs:enumeration value="AS_CONFIGURED"/>
       <xs:enumeration value="DIALOG"/>
+      <xs:enumeration value="DIALOG_SIDEBAR"/>
+      <xs:enumeration value="DIALOG_MODAL"/>
       <xs:enumeration value="INLINE"/>
       <xs:enumeration value="INLINE_AS_IF_EDIT"/>
     </xs:restriction>
diff --git a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
index 821558d..1a7c8cf 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
@@ -5,10 +5,20 @@
 :_imagesdir: images/
 
 
-The `promptStyle()` attribute is used to specify whether, when invoking an action associated with a domain object property, the parameters for the action are prompted by way of a dialog box, or is prompted using an inline panel (replacing the property on the page).
+The `promptStyle()` attribute is used to specify whether, when invoking an action associated with a domain object property, the parameters for the action are prompted either in modal dialog box, a (non-modal) sidebar dialog box, or is prompted using an inline panel (replacing the property on the page).
+For more on sidebar vs modal dialogs, see p#_ugvw_features_sidebar-vs-modal-dialogs[Wicket viewer features].
 
-If the attribute is not set, then the value of the xref:../ugvw/ugvw.adoc#_ugvw_configuration-properties[configuration property] `isis.viewer.wicket.promptStyle` is used.
-If this is itself not set, then an inline prompt is used.
+The prompt style is influenced by two xref:../ugvw/ugvw.adoc#_ugvw_configuration-properties[configuration properties]:
+
+* if the `promptStyle()` attribute is set to `DIALOG`, then the `isis.viewer.wicket.dialogMode` configuration is used to determine whether to render using a modal dialog or a sidebar.
++
+If the configuration property is not set, then sidebar is used.
+
+* If the attribute is not set at all, then the `isis.viewer.wicket.promptStyle` configuration property is used to specify the preferred prompt style.
++
+If the configuration property is not set, then an inline prompt is used.
++
+And, if this _is_ set but is set to just `DIALOG`, then the `isis.viewer.wicket.dialogMode` configuration property determines which style.
 
 For example:
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
index 175c763..c60b25b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
@@ -36,10 +36,24 @@ public enum PromptStyle {
      */
     AS_CONFIGURED,
     /**
-     * Use a dialog for the prompt
+     * Use a dialog for the prompt.
+     *
+     * <p>
+     *     This will be either modal dialog (same as if {@link #DIALOG_MODAL} was selected) or sidebar (same as if
+     *     {@link #DIALOG_SIDEBAR} was selected) depending on the value of the
+     *     <code>isis.viweer.wicket.dialogMode</code> configuration property.
+     * </p>
      */
     DIALOG,
     /**
+     * Use a dialog for the prompt, rendered in a sidebar.
+     */
+    DIALOG_SIDEBAR,
+    /**
+     * Use a dialog for the prompt, rendered in a modal dialog.
+     */
+    DIALOG_MODAL,
+    /**
      * Show the form inline, temporarily replacing the rendering of the property.
      */
     INLINE,
@@ -64,7 +78,7 @@ public enum PromptStyle {
      */
     INLINE_AS_IF_EDIT;
 
-    public boolean isDialog() { return this == DIALOG; }
+    public boolean isDialog() { return this == DIALOG || this == DIALOG_MODAL || this == DIALOG_SIDEBAR; }
     public boolean isInline() { return this == INLINE; }
     public boolean isInlineAsIfEdit() { return this == INLINE_AS_IF_EDIT; }
 
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionPromptProvider.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionPromptProvider.java
index 42fbda5..c35c675 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionPromptProvider.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionPromptProvider.java
@@ -18,9 +18,13 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+
+import org.apache.isis.applib.annotation.PromptStyle;
 
 public interface ActionPromptProvider {
 
+
     public static class Util{
 
         public static ActionPromptProvider getFrom(Component component) {
@@ -40,5 +44,6 @@ public interface ActionPromptProvider {
         }
     }
 
-    public ActionPrompt getActionPrompt();
+    public ActionPrompt getActionPrompt(final PromptStyle promptStyle);
+    void closePrompt(final AjaxRequestTarget target);
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index d616874..3bcb55e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -689,8 +689,9 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
     protected void addEditPropertyTo(
             final MarkupContainer scalarIfRegularFormGroup) {
 
+        final PromptStyle promptStyle = scalarModel.getPromptStyle();
         if(  scalarModel.canEnterEditMode() &&
-            (scalarModel.getPromptStyle().isDialog() ||
+            (promptStyle.isDialog() ||
             !getInlinePromptConfig().isSupported())) {
 
             final WebMarkupContainer editProperty = new WebMarkupContainer(ID_EDIT_PROPERTY);
@@ -701,7 +702,7 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
                 protected void onEvent(AjaxRequestTarget target) {
 
                     final ActionPrompt prompt = ActionPromptProvider.Util
-                            .getFrom(ScalarPanelAbstract2.this).getActionPrompt();
+                            .getFrom(ScalarPanelAbstract2.this).getActionPrompt(promptStyle);
 
                     PropertyEditPromptHeaderPanel titlePanel = new PropertyEditPromptHeaderPanel(prompt.getTitleId(),
                             ScalarPanelAbstract2.this.scalarModel);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
index 0258514..f099e70 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
@@ -31,6 +31,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
 
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.common.OnSelectionHandler;
@@ -132,10 +133,15 @@ public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionMod
 
     //region > ActionPromptModalWindowProvider
 
-    public ActionPromptModalWindow getActionPrompt() {
+    public ActionPromptModalWindow getActionPrompt(final PromptStyle promptStyle) {
         return actionPromptModalWindow;
     }
 
+    @Override
+    public void closePrompt(final AjaxRequestTarget target) {
+        actionPromptModalWindow.closePrompt(target);
+    }
+
     //endregion
 
     //region > BulkActionsProvider
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index 1db195c..0650b00 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -168,18 +168,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
 
         if(inlinePromptContext == null || promptStyle.isDialog()) {
             final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(actionLink.getPage());
-            final ActionPrompt prompt = promptProvider.getActionPrompt();
-
-//            // REVIEW: I wonder if this is still needed after the ISIS-1613 rework?
-//            final ActionPromptHeaderPanel titlePanel =
-//                    PersistenceSession.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
-//                            new Callable<ActionPromptHeaderPanel>() {
-//                                @Override
-//                                public ActionPromptHeaderPanel call() throws Exception {
-//                                    final String titleId = prompt.getTitleId();
-//                                    return new ActionPromptHeaderPanel(titleId, actionModel);
-//                                }
-//                            });
+            final ActionPrompt prompt = promptProvider.getActionPrompt(promptStyle);
 
 
             //
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index bd2a3a5..f85f291 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -31,6 +31,7 @@ import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
 import org.apache.wicket.RestartResponseAtInterceptPageException;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.devutils.debugbar.DebugBar;
 import org.apache.wicket.devutils.debugbar.IDebugBarContributor;
@@ -60,6 +61,7 @@ import org.apache.wicket.request.resource.ResourceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -463,17 +465,35 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     private ActionPromptModalWindow actionPromptModalWindow;
     private ActionPromptSidebar actionPromptSidebar;
 
-    public ActionPrompt getActionPrompt() {
-        final DialogMode dialogMode = CONFIG_DIALOG_MODE.from(getConfiguration());
-        switch (dialogMode) {
-            case SIDEBAR:
-                return actionPromptSidebar;
-            case MODAL:
-            default:
-                return actionPromptModalWindow;
+    public ActionPrompt getActionPrompt(final PromptStyle promptStyle) {
+        switch (promptStyle) {
+        case AS_CONFIGURED:
+        case DIALOG:
+            final DialogMode dialogMode = CONFIG_DIALOG_MODE.from(getConfiguration());
+            switch (dialogMode) {
+                case SIDEBAR:
+                    return actionPromptSidebar;
+                case MODAL:
+                default:
+                    return actionPromptModalWindow;
+            }
+        case DIALOG_SIDEBAR:
+            return actionPromptSidebar;
+        case DIALOG_MODAL:
+            return actionPromptModalWindow;
+        case INLINE:
+        case INLINE_AS_IF_EDIT:
+        default:
+            throw new IllegalArgumentException(String.format("PromptStyle '%s' not supported", promptStyle));
         }
     }
 
+    @Override
+    public void closePrompt(final AjaxRequestTarget target) {
+        actionPromptSidebar.closePrompt(target);
+        actionPromptModalWindow.closePrompt(target);
+    }
+
     private void addActionPromptModalWindow(final MarkupContainer parent) {
         actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW); 
         parent.addOrReplace(actionPromptModalWindow);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
index ee31549..fcc531f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -43,7 +43,6 @@ import org.apache.wicket.util.string.AppendingStringBuffer;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
 import org.apache.isis.viewer.wicket.model.models.FormExecutor;
@@ -188,10 +187,10 @@ public abstract class PromptFormAbstract<T extends BookmarkableModel<ObjectAdapt
     }
 
     protected void closePromptIfAny(final AjaxRequestTarget target) {
-        final ActionPrompt actionPromptIfAny =
-                ActionPromptProvider.Util.getFrom(parentPanel).getActionPrompt();
-        if (actionPromptIfAny != null) {
-            actionPromptIfAny.closePrompt(target);
+
+        final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(parentPanel);
+        if(promptProvider != null) {
+            promptProvider.closePrompt(target);
         }
     }
 


[isis] 09/10: ISIS-2079: fixes rebuildMetaModel to return the mixee rather than itself (a mixin)

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 37aeeeb1d7a0e2f2e258869b7de61f8286793edb
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jan 8 06:55:36 2019 +0000

    ISIS-2079: fixes rebuildMetaModel to return the mixee rather than itself (a mixin)
---
 .../org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
index 3d8ff54..f730751 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
@@ -51,7 +51,7 @@ public class Object_rebuildMetamodel {
     @MemberOrder(name = "datanucleusIdLong", sequence = "800.1")
     public Object act() {
         metaModelService.rebuild(object.getClass());
-        return this;
+        return object;
     }
 
     @javax.inject.Inject


[isis] 10/10: ISIS-2081: updates @ActionLayout and XML to allow redirect policy to be specified on a case-by-case basis.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ee80c6154131750dbda2ea90d32ea368eccfe7a0
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jan 8 06:59:10 2019 +0000

    ISIS-2081: updates @ActionLayout and XML to allow redirect policy to be specified on a case-by-case basis.
---
 .../asciidoc/applib/layout/component/component.xsd | 10 ++++
 .../isis/applib/annotation/ActionLayout.java       |  8 +++
 .../apache/isis/applib/annotation/Redirect.java    | 49 ++++++++++++++++
 .../applib/layout/component/ActionLayoutData.java  | 14 +++++
 .../actions/layout/ActionLayoutFacetFactory.java   | 10 ++++
 .../RedirectFacetFromActionLayoutAnnotation.java   | 43 ++++++++++++++
 .../actions/layout/RedirectFacetFromActionXml.java | 43 ++++++++++++++
 .../facets/actions/redirect/RedirectFacet.java     | 33 +++++++++++
 .../actions/redirect/RedirectFacetAbstract.java    | 66 ++++++++++++++++++++++
 .../actions/redirect/RedirectFacetFallback.java    | 31 ++++++++++
 .../services/grid/GridSystemServiceAbstract.java   |  2 +
 .../wicket/ui/panels/FormExecutorDefault.java      | 50 +++++++++++++---
 12 files changed, 350 insertions(+), 9 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
index bb76e01..d4439b0 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
@@ -53,6 +53,7 @@
     <xs:attribute name="namedEscaped" type="xs:boolean"/>
     <xs:attribute name="position" type="tns:position"/>
     <xs:attribute name="promptStyle" type="tns:promptStyle"/>
+    <xs:attribute name="redirect" type="tns:redirect"/>
   </xs:complexType>
 
   <xs:complexType name="serviceAction">
@@ -119,6 +120,7 @@
     <xs:attribute name="paged" type="xs:int"/>
   </xs:complexType>
 
+
   <xs:simpleType name="bookmarkPolicy">
     <xs:restriction base="xs:string">
       <xs:enumeration value="AS_ROOT"/>
@@ -169,6 +171,14 @@
     </xs:restriction>
   </xs:simpleType>
 
+  <xs:simpleType name="redirect">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="AS_CONFIGURED"/>
+      <xs:enumeration value="EVEN_IF_SAME"/>
+      <xs:enumeration value="ONLY_IF_DIFFERS"/>
+    </xs:restriction>
+  </xs:simpleType>
+
   <xs:simpleType name="labelPosition">
     <xs:restriction base="xs:string">
       <xs:enumeration value="DEFAULT"/>
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
index 3c91af5..6e14e62 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
@@ -133,6 +133,14 @@ public @interface ActionLayout {
     // //////////////////////////////////////
 
     /**
+     * If the action returns its target, then determines whether to update the page or
+     * instead to redirect (forcing a re-rendering of a new page).
+     */
+    Redirect redirectPolicy() default Redirect.AS_CONFIGURED;
+
+    // //////////////////////////////////////
+
+    /**
      * For actions of domain services that can be viewed and contributed (that is, whose
      * {@link DomainService#nature() nature} is either {@link org.apache.isis.applib.annotation.NatureOfService#VIEW}
      * or {@link org.apache.isis.applib.annotation.NatureOfService#VIEW_CONTRIBUTIONS_ONLY}), specifies how the
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Redirect.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Redirect.java
new file mode 100644
index 0000000..da75e16
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Redirect.java
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.annotation;
+
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * The available policies for rendering the next page if the result is the same as the target
+ * (in other words, an action that returns "this").
+ */
+@XmlType(
+        namespace = "http://isis.apache.org/applib/layout/component"
+)
+public enum Redirect {
+    /**
+     * As defined by configuration property <code>isis.viewer.wicket.redirectEvenIfSameObject</code>
+     */
+    AS_CONFIGURED,
+
+    /**
+     * Redirect (meaning render a new page) even if the result of the action is the same as the target.
+     */
+    EVEN_IF_SAME,
+
+    /**
+     * Don't redirect if the result is the same as the target, instead just update the existing page.
+     *
+     * <p>
+     *     Of course, a redirect is still performed if the result of the action is different from the target.
+     * </p>
+     */
+    ONLY_IF_DIFFERS,
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
index e7b6e8d..0dd1e68 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
@@ -28,6 +28,7 @@ import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.annotation.Redirect;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.links.Link;
 
@@ -224,6 +225,19 @@ public class ActionLayoutData implements Serializable, Owned<ActionLayoutDataOwn
 
 
 
+    private Redirect redirect;
+
+    @XmlAttribute(required = false)
+    public Redirect getRedirect() {
+        return redirect;
+    }
+
+    public void setRedirect(Redirect redirect) {
+        this.redirect = redirect;
+    }
+
+
+
     private ActionLayoutDataOwner owner;
     /**
      * Owner.
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index b836e74..14d9293 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -31,6 +31,8 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetFallback;
+import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
+import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacetFallback;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
@@ -130,6 +132,14 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         FacetUtil.addFacet(actionPositionFacet);
 
 
+        // redirectPolicy
+        RedirectFacet redirectFacet = RedirectFacetFromActionLayoutAnnotation.create(actionLayout, holder);
+        if(redirectFacet == null) {
+            redirectFacet = new RedirectFacetFallback(holder);
+        }
+        FacetUtil.addFacet(redirectFacet);
+
+
         // contributing
         if (isContributingServiceOrMixinObject(processMethodContext)) {
             NotContributedFacet notContributedFacet = NotContributedFacetForLayoutProperties.create(properties, holder);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionLayoutAnnotation.java
new file mode 100644
index 0000000..65fb7e8
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionLayoutAnnotation.java
@@ -0,0 +1,43 @@
+/*
+ *  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.isis.core.metamodel.facets.actions.layout;
+
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Redirect;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
+import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacetAbstract;
+
+public class RedirectFacetFromActionLayoutAnnotation extends RedirectFacetAbstract {
+
+    public static RedirectFacet create(final ActionLayout actionLayout, final FacetHolder holder) {
+        if(actionLayout == null) {
+            return null;
+        }
+        final Redirect redirect = actionLayout.redirectPolicy();
+        return redirect != null ? new RedirectFacetFromActionLayoutAnnotation(redirect, holder) : null;
+    }
+
+    public RedirectFacetFromActionLayoutAnnotation(
+            final Redirect policy, final FacetHolder holder) {
+        super(policy, holder);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionXml.java
new file mode 100644
index 0000000..6be2bfc
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionXml.java
@@ -0,0 +1,43 @@
+/*
+ *  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.isis.core.metamodel.facets.actions.layout;
+
+import org.apache.isis.applib.annotation.Redirect;
+import org.apache.isis.applib.layout.component.ActionLayoutData;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
+import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacetAbstract;
+
+public class RedirectFacetFromActionXml extends RedirectFacetAbstract {
+
+    public static RedirectFacet create(final ActionLayoutData actionLayout, final FacetHolder holder) {
+        if(actionLayout == null) {
+            return null;
+        }
+        final Redirect redirect = actionLayout.getRedirect();
+        return redirect != null ? new RedirectFacetFromActionXml(redirect, holder) : null;
+    }
+
+    public RedirectFacetFromActionXml(
+            final Redirect policy, final FacetHolder holder) {
+        super(policy, holder);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacet.java
new file mode 100644
index 0000000..4a47165
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacet.java
@@ -0,0 +1,33 @@
+/*
+ *  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.isis.core.metamodel.facets.actions.redirect;
+
+import org.apache.isis.applib.annotation.Redirect;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+
+/**
+ * Whether to force a redirect when an action returns the same object.
+ */
+public interface RedirectFacet extends Facet {
+
+
+    Redirect policy();
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetAbstract.java
new file mode 100644
index 0000000..60805f4
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetAbstract.java
@@ -0,0 +1,66 @@
+/*
+ *  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.isis.core.metamodel.facets.actions.redirect;
+
+import java.util.Map;
+
+import org.apache.isis.applib.annotation.Redirect;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public abstract class RedirectFacetAbstract extends FacetAbstract implements RedirectFacet {
+
+    public static Class<? extends Facet> type() {
+        return RedirectFacet.class;
+    }
+
+    private final Redirect redirect;
+
+    protected RedirectFacetAbstract(
+            final Redirect redirect,
+            final FacetHolder holder) {
+        this(redirect, holder, Derivation.NOT_DERIVED);
+    }
+
+    protected RedirectFacetAbstract(
+            final Redirect redirect,
+            final FacetHolder holder,
+            final Derivation derivation) {
+        super(type(), holder, derivation);
+        this.redirect = redirect;
+    }
+
+    @Override
+    public Redirect policy() {
+        return redirect;
+    }
+
+    @Override
+    protected String toStringValues() {
+        return "redirect=" + redirect;
+    }
+
+    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+        super.appendAttributesTo(attributeMap);
+        attributeMap.put("redirect", redirect);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetFallback.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetFallback.java
new file mode 100644
index 0000000..fbd4e82
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetFallback.java
@@ -0,0 +1,31 @@
+/*
+ *  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.isis.core.metamodel.facets.actions.redirect;
+
+import org.apache.isis.applib.annotation.Redirect;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class RedirectFacetFallback extends RedirectFacetAbstract {
+
+    public RedirectFacetFallback(final FacetHolder holder) {
+        super(Redirect.AS_CONFIGURED, holder);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 59b90f6..dce4e8b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -64,6 +64,7 @@ import org.apache.isis.core.metamodel.facets.actions.layout.DescribedAsFacetForA
 import org.apache.isis.core.metamodel.facets.actions.layout.HiddenFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.NamedFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.PromptStyleFacetForActionXml;
+import org.apache.isis.core.metamodel.facets.actions.layout.RedirectFacetFromActionXml;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
@@ -298,6 +299,7 @@ public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib
                 FacetUtil.addOrReplaceFacet(HiddenFacetForActionXml.create(actionLayoutData, objectAction));
                 FacetUtil.addOrReplaceFacet(NamedFacetForActionXml.create(actionLayoutData, objectAction));
                 FacetUtil.addOrReplaceFacet(PromptStyleFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addOrReplaceFacet(RedirectFacetFromActionXml.create(actionLayoutData, objectAction));
             }
 
             @Override
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index aa1ca99..6ccd458 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -48,6 +48,7 @@ import org.apache.isis.core.commons.authentication.MessageBroker;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
 import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -58,6 +59,7 @@ import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.FormExecutor;
@@ -161,7 +163,14 @@ public final class FormExecutorDefault<M extends BookmarkableModel<ObjectAdapter
             // hook to close prompt etc.
             onExecuteAndProcessResults(targetIfAny);
 
-            if (resultDiffersOrAlwaysRedirect(targetAdapter, resultAdapter) ||
+            final M model = this.model;
+            RedirectFacet redirectFacet = null;
+            if(model instanceof ActionModel) {
+                final ActionModel actionModel = (ActionModel) model;
+                redirectFacet = actionModel.getActionMemento().getAction(getSpecificationLoader()).getFacet(RedirectFacet.class);
+            }
+
+            if (shouldRedirect(targetAdapter, resultAdapter, redirectFacet) ||
                 hasBlobsOrClobs(page)                                       ||
                 targetIfAny == null                                             ) {
 
@@ -239,32 +248,55 @@ public final class FormExecutorDefault<M extends BookmarkableModel<ObjectAdapter
         }
     }
 
-    private boolean resultDiffersOrAlwaysRedirect(
+    private boolean shouldRedirect(
+            final ObjectAdapter targetAdapter,
+            final ObjectAdapter resultAdapter,
+            final RedirectFacet redirectFacet) {
+
+        switch (redirectFacet.policy()) {
+
+        case EVEN_IF_SAME:
+        default:
+            return true;
+
+        case AS_CONFIGURED:
+            final boolean redirectEvenIfSameObject = getSettings().isRedirectEvenIfSameObject();
+            if (redirectEvenIfSameObject) {
+                return true;
+            }
+            // fall through to...
+
+        case ONLY_IF_DIFFERS:
+            return differs(targetAdapter, resultAdapter);
+        }
+    }
+
+    private static boolean differs(
             final ObjectAdapter targetAdapter,
             final ObjectAdapter resultAdapter) {
+
         final ObjectAdapterMemento targetOam = ObjectAdapterMemento.createOrNull(targetAdapter);
         final ObjectAdapterMemento resultOam = ObjectAdapterMemento.createOrNull(resultAdapter);
 
-        return resultDiffersOrAlwaysRedirect(targetOam, resultOam);
+        return differs(targetOam, resultOam);
     }
 
-    private boolean resultDiffersOrAlwaysRedirect(
+    private static boolean differs(
             final ObjectAdapterMemento targetOam,
             final ObjectAdapterMemento resultOam) {
 
         final Bookmark resultBookmark = resultOam != null ? resultOam.asHintingBookmark() : null;
         final Bookmark targetBookmark = targetOam != null ? targetOam.asHintingBookmark() : null;
 
-        return resultDiffersOrAlwaysRedirect(targetBookmark, resultBookmark);
+        return differs(targetBookmark, resultBookmark);
     }
 
-    private boolean resultDiffersOrAlwaysRedirect(
+    private static boolean differs(
             final Bookmark targetBookmark,
             final Bookmark resultBookmark) {
-        final boolean redirectEvenIfSameObject = getSettings().isRedirectEvenIfSameObject();
 
         if(resultBookmark == null && targetBookmark == null) {
-            return redirectEvenIfSameObject;
+            return true;
         }
         if (resultBookmark == null || targetBookmark == null) {
             return true;
@@ -272,7 +304,7 @@ public final class FormExecutorDefault<M extends BookmarkableModel<ObjectAdapter
         final String resultBookmarkStr = asStr(resultBookmark);
         final String targetBookmarkStr = asStr(targetBookmark);
 
-        return !Objects.equals(resultBookmarkStr, targetBookmarkStr)  || redirectEvenIfSameObject;
+        return !Objects.equals(resultBookmarkStr, targetBookmarkStr);
     }
 
     private boolean hasBlobsOrClobs(final Page page) {


[isis] 07/10: ISIS-2080: adds GridService2 and GridLoaderService2 with support for loading different layouts

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f2841bc91a612b1400eb824c943b3d449debd608
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jan 8 06:55:00 2019 +0000

    ISIS-2080: adds GridService2 and GridLoaderService2 with support for loading different layouts
    
    based on the value of LayoutFacet for the target ObjectAdapter
---
 .../applib/services/grid/GridLoaderService2.java   |  31 ++++
 .../isis/applib/services/grid/GridService2.java    |  32 +++++
 .../metamodel/facets/object/grid/GridFacet.java    |   3 +-
 .../facets/object/grid/GridFacetDefault.java       |  20 +--
 .../facets/object/grid/GridFacetFactory.java       |   4 +-
 .../facets/object/layout/LayoutFacet.java          |   2 +-
 .../facets/object/layout/LayoutFacetFactory.java   |   6 +-
 .../facets/object/layout/LayoutFacetFallback.java  |   2 +-
 .../facets/object/layout/LayoutFacetMethod.java    |   8 +-
 .../services/grid/GridLoaderServiceDefault.java    | 159 +++++++++++++++------
 .../services/grid/GridServiceDefault.java          |  14 +-
 .../services/layout/LayoutServiceDefault.java      |   2 +-
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   8 +-
 .../resources/DomainObjectResourceServerside.java  |   3 +-
 .../resources/DomainTypeResourceServerside.java    |   2 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   5 +-
 .../links/EntityLinksSelectorPanelFactory.java     |   4 +-
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   2 +-
 18 files changed, 233 insertions(+), 74 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridLoaderService2.java b/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridLoaderService2.java
new file mode 100644
index 0000000..ed4b3e9
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridLoaderService2.java
@@ -0,0 +1,31 @@
+/**
+ *  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.isis.applib.services.grid;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.grid.Grid;
+
+public interface GridLoaderService2 extends GridLoaderService {
+
+    /**
+     * Returns a new instance of a {@link Grid} for the specified domain class, eg from a
+     * <code>layout.xml</code> file, else <code>null</code>.
+     */
+    @Programmatic
+    Grid load(final Class<?> domainClass, String layout);
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridService2.java b/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridService2.java
new file mode 100644
index 0000000..8d4431c
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridService2.java
@@ -0,0 +1,32 @@
+/**
+ *  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.isis.applib.services.grid;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.grid.Grid;
+
+public interface GridService2 extends GridService {
+
+    /**
+     * Returns a new instance of a {@link Grid} for the specified domain class, eg from a
+     * <code>[domainClass].layout.[layout].xml</code> file, else <code>null</code>.
+     */
+    @Programmatic
+    Grid load(Class<?> domainClass, String layout);
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacet.java
index 11ce9ad..9930ea0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacet.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.grid;
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.services.grid.GridSystemService;
 import org.apache.isis.applib.services.layout.LayoutService;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**
@@ -34,7 +35,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  */
 public interface GridFacet extends Facet {
 
-    Grid getGrid();
+    Grid getGrid(final ObjectAdapter objectAdapter);
 
 
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
index 9ce20af..b36de92 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
@@ -22,10 +22,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.layout.grid.Grid;
-import org.apache.isis.applib.services.grid.GridService;
+import org.apache.isis.applib.services.grid.GridService2;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class GridFacetDefault
@@ -42,33 +44,35 @@ public class GridFacetDefault
 
     public static GridFacet create(
             final FacetHolder facetHolder,
-            final GridService gridService) {
+            final GridService2 gridService) {
         return new GridFacetDefault(facetHolder, gridService);
     }
 
-    private final GridService gridService;
+    private final GridService2 gridService;
 
     private Grid grid;
 
     private GridFacetDefault(
             final FacetHolder facetHolder,
-            final GridService gridService) {
+            final GridService2 gridService) {
         super(GridFacetDefault.type(), facetHolder, Derivation.NOT_DERIVED);
         this.gridService = gridService;
     }
 
-    public Grid getGrid() {
+    public Grid getGrid(final ObjectAdapter objectAdapterIfAny) {
         if (!gridService.supportsReloading() && this.grid != null) {
             return this.grid;
         }
         final Class<?> domainClass = getSpecification().getCorrespondingClass();
-        this.grid = load(domainClass);
+        final LayoutFacet layoutFacet = getFacetHolder().getFacet(LayoutFacet.class);
+        final String layout = layoutFacet != null ? layoutFacet.layout(objectAdapterIfAny) : null;
+        this.grid = load(domainClass, layout);
 
         return this.grid;
     }
 
-    private Grid load(final Class<?> domainClass) {
-        Grid grid = gridService.load(domainClass);
+    private Grid load(final Class<?> domainClass, final String layout) {
+        Grid grid = gridService.load(domainClass, layout);
         if(grid == null) {
             grid = gridService.defaultGridFor(domainClass);
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
index 8c00734..a6d74a3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
@@ -19,7 +19,7 @@ package org.apache.isis.core.metamodel.facets.object.grid;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.applib.services.grid.GridService;
+import org.apache.isis.applib.services.grid.GridService2;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -37,7 +37,7 @@ public class GridFacetFactory extends FacetFactoryAbstract {
     public void process(final ProcessClassContext processClassContext) {
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final GridService gridService = servicesInjector.lookupService(GridService.class);
+        final GridService2 gridService = servicesInjector.lookupService(GridService2.class);
 
         FacetUtil.addFacet(GridFacetDefault.create(facetHolder, gridService));
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
index 8a072de..31d8627 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
@@ -33,5 +33,5 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  */
 public interface LayoutFacet extends Facet {
 
-    public String layout(final ObjectAdapter object);
+    public String layout(final ObjectAdapter objectAdapterIfAny);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
index 61b549b..f4df289 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
@@ -30,9 +30,9 @@ import org.apache.isis.core.metamodel.methodutils.MethodScope;
 
 public class LayoutFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final String ICON_NAME_PREFIX = "iconName";
+    private static final String LAYOUT_METHOD_NAME = "layout";
 
-    private static final String[] PREFIXES = { ICON_NAME_PREFIX, };
+    private static final String[] PREFIXES = { LAYOUT_METHOD_NAME, };
 
     public LayoutFacetFactory() {
         super(FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
@@ -43,7 +43,7 @@ public class LayoutFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
         final Class<?> cls = processClassContext.getCls();
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final Method method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, ICON_NAME_PREFIX, String.class, NO_PARAMETERS_TYPES);
+        final Method method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, LAYOUT_METHOD_NAME, String.class, NO_PARAMETERS_TYPES);
 
         final LayoutFacet facet;
         if (method == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
index 4f47c37..863b1e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
@@ -31,7 +31,7 @@ public class LayoutFacetFallback extends LayoutFacetAbstract {
     }
 
     @Override
-    public String layout(final ObjectAdapter owningAdapter) {
+    public String layout(final ObjectAdapter objectAdapterIfAny) {
         return null;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
index 27f72c3..f4c3d2b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
@@ -24,7 +24,6 @@ import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
 
 public class LayoutFacetMethod extends LayoutFacetAbstract {
 
@@ -36,9 +35,12 @@ public class LayoutFacetMethod extends LayoutFacetAbstract {
     }
 
     @Override
-    public String layout(final ObjectAdapter owningAdapter) {
+    public String layout(final ObjectAdapter objectAdapterIfAny) {
+        if(objectAdapterIfAny == null) {
+            return null;
+        }
         try {
-            return (String) ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
+            return (String) ObjectAdapter.InvokeUtils.invoke(method, objectAdapterIfAny);
         } catch (final RuntimeException ex) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
index cf9d0cf..28bf78a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -23,13 +23,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
-import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 
 import com.google.common.base.Function;
 import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.io.Resources;
 
@@ -41,7 +41,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.layout.grid.Grid;
-import org.apache.isis.applib.services.grid.GridLoaderService;
+import org.apache.isis.applib.services.grid.GridLoaderService2;
 import org.apache.isis.applib.services.grid.GridSystemService;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
@@ -50,16 +50,81 @@ import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
 )
-public class GridLoaderServiceDefault implements GridLoaderService {
+public class GridLoaderServiceDefault implements GridLoaderService2 {
 
     private static final Logger LOG = LoggerFactory.getLogger(GridLoaderServiceDefault.class);
 
 
+    static class DomainClassAndLayout {
+        private final Class<?> domainClass;
+        private final String layoutIfAny;
+
+        DomainClassAndLayout(final Class<?> domainClass, final String layoutIfAny) {
+            this.domainClass = domainClass;
+            this.layoutIfAny = layoutIfAny;
+        }
+
+        @Override public boolean equals(final Object o) {
+            if (this == o)
+                return true;
+            if (o == null || getClass() != o.getClass())
+                return false;
+
+            final DomainClassAndLayout that = (DomainClassAndLayout) o;
+
+            if (domainClass != null ? !domainClass.equals(that.domainClass) : that.domainClass != null)
+                return false;
+            return layoutIfAny != null ? layoutIfAny.equals(that.layoutIfAny) : that.layoutIfAny == null;
+        }
+
+        @Override public int hashCode() {
+            int result = domainClass != null ? domainClass.hashCode() : 0;
+            result = 31 * result + (layoutIfAny != null ? layoutIfAny.hashCode() : 0);
+            return result;
+        }
+
+        @Override public String toString() {
+            return "domainClass=" + domainClass +
+                    ", layout='" + layoutIfAny + '\'';
+        }
+    }
+
     // for better logging messages (used only in prototyping mode)
-    private final Map<Class<?>, String> badXmlByClass = Maps.newHashMap();
+    private final Map<DomainClassAndLayout, String> badXmlByDomainClassAndLayout = Maps.newHashMap();
+
+    static class DomainClassAndLayoutAndXml {
+        private final DomainClassAndLayout domainClassAndLayout;
+        private final String xml;
+
+        @Override public boolean equals(final Object o) {
+            if (this == o)
+                return true;
+            if (o == null || getClass() != o.getClass())
+                return false;
+
+            final DomainClassAndLayoutAndXml that = (DomainClassAndLayoutAndXml) o;
+
+            if (domainClassAndLayout != null ?
+                    !domainClassAndLayout.equals(that.domainClassAndLayout) :
+                    that.domainClassAndLayout != null)
+                return false;
+            return xml != null ? xml.equals(that.xml) : that.xml == null;
+        }
+
+        @Override public int hashCode() {
+            int result = domainClassAndLayout != null ? domainClassAndLayout.hashCode() : 0;
+            result = 31 * result + (xml != null ? xml.hashCode() : 0);
+            return result;
+        }
+
+        DomainClassAndLayoutAndXml(final DomainClassAndLayout domainClassAndLayout, final String xml) {
+            this.domainClassAndLayout = domainClassAndLayout;
+            this.xml = xml;
+        }
+    }
 
     // cache (used only in prototyping mode)
-    private final Map<String, Grid> gridByXml = Maps.newHashMap();
+    private final Map<DomainClassAndLayoutAndXml, Grid> gridByDomainClassAndLayoutAndXml = Maps.newHashMap();
 
     private JAXBContext jaxbContext;
 
@@ -93,45 +158,48 @@ public class GridLoaderServiceDefault implements GridLoaderService {
 
     @Override
     public void remove(final Class<?> domainClass) {
+        final String layoutIfAny = null;
+        final DomainClassAndLayout dcal = new DomainClassAndLayout(domainClass, layoutIfAny);
         if(!supportsReloading()) {
             return;
         }
-        badXmlByClass.remove(domainClass);
-        final String xml = loadXml(domainClass);
+        badXmlByDomainClassAndLayout.remove(dcal);
+        final String xml = loadXml(dcal);
         if(xml == null) {
             return;
         }
-        gridByXml.remove(xml);
+        gridByDomainClassAndLayoutAndXml.remove(new DomainClassAndLayoutAndXml(dcal, xml));
     }
 
     @Override
     @Programmatic
     public boolean existsFor(final Class<?> domainClass) {
-        return resourceNameFor(domainClass) != null;
+        return resourceNameFor(new DomainClassAndLayout(domainClass, null)) != null;
     }
 
     @Override
-    @Programmatic
-    public Grid load(final Class<?> domainClass) {
-        final String xml = loadXml(domainClass);
+    public Grid load(final Class<?> domainClass, final String layoutIfAny) {
+        final DomainClassAndLayout dcal = new DomainClassAndLayout(domainClass, layoutIfAny);
+        final String xml = loadXml(dcal);
         if(xml == null) {
             return null;
         }
 
+        final DomainClassAndLayoutAndXml dcalax = new DomainClassAndLayoutAndXml(dcal, xml);
         if(supportsReloading()) {
-            final Grid grid = gridByXml.get(xml);
+            final Grid grid = gridByDomainClassAndLayoutAndXml.get(dcalax);
             if(grid != null) {
                 return grid;
             }
 
-            final String badXml = badXmlByClass.get(domainClass);
+            final String badXml = badXmlByDomainClassAndLayout.get(dcal);
             if(badXml != null) {
                 if(Objects.equals(xml, badXml)) {
                     // seen this before and already logged; just quit
                     return null;
                 } else {
                     // this different XML might be good
-                    badXmlByClass.remove(domainClass);
+                    badXmlByDomainClassAndLayout.remove(dcal);
                 }
             }
         }
@@ -141,23 +209,23 @@ public class GridLoaderServiceDefault implements GridLoaderService {
                 // shouldn't occur, indicates that initialization failed to locate any GridSystemService implementations.
                 return null;
             }
-            
+
             final Grid grid = (Grid) jaxbService.fromXml(jaxbContext, xml);
             grid.setDomainClass(domainClass);
             if(supportsReloading()) {
-                gridByXml.put(xml, grid);
+                gridByDomainClassAndLayoutAndXml.put(dcalax, grid);
             }
             return grid;
         } catch(Exception ex) {
 
             if(supportsReloading()) {
                 // save fact that this was bad XML, so that we don't log again if called next time
-                badXmlByClass.put(domainClass, xml);
+                badXmlByDomainClassAndLayout.put(dcal, xml);
             }
 
             // note that we don't blacklist if the file exists but couldn't be parsed;
             // the developer might fix so we will want to retry.
-            final String resourceName = resourceNameFor(domainClass);
+            final String resourceName = resourceNameFor(dcal);
             final String message = "Failed to parse " + resourceName + " file (" + ex.getMessage() + ")";
             if(supportsReloading()) {
                 container.warnUser(message);
@@ -168,32 +236,46 @@ public class GridLoaderServiceDefault implements GridLoaderService {
         }
     }
 
-    private String loadXml(final Class<?> domainClass) {
-        final String resourceName = resourceNameFor(domainClass);
+    @Override
+    @Programmatic
+    public Grid load(final Class<?> domainClass) {
+        return load(domainClass, null);
+    }
+
+    private String loadXml(final DomainClassAndLayout dcal) {
+        final String resourceName = resourceNameFor(dcal);
         if(resourceName == null) {
-            LOG.debug("Failed to locate layout file for '{}'", domainClass.getName());
+            LOG.debug("Failed to locate layout file for '{}'", dcal.toString());
             return null;
         }
         try {
-            return resourceContentOf(domainClass, resourceName);
+            return resourceContentOf(dcal, resourceName);
         } catch (IOException ex) {
             LOG.debug(
                     "Failed to locate file {} (relative to {}.class)",
-                    resourceName, domainClass.getName(), ex);
+                    resourceName, dcal.domainClass.getName(), ex);
             return null;
         }
     }
 
-    private static String resourceContentOf(final Class<?> cls, final String resourceName) throws IOException {
-        final URL url = Resources.getResource(cls, resourceName);
+    private static String resourceContentOf(final DomainClassAndLayout dcal, final String resourceName) throws IOException {
+        final URL url = Resources.getResource(dcal.domainClass, resourceName);
         return Resources.toString(url, Charset.defaultCharset());
     }
 
-    String resourceNameFor(final Class<?> domainClass) {
-        for (final Type type : Type.values()) {
-            final String candidateResourceName = resourceNameFor(domainClass, type);
+    String resourceNameFor(final DomainClassAndLayout dcal) {
+        final List<String> candidateResourceNames = Lists.newArrayList();
+        if(dcal.layoutIfAny != null) {
+            candidateResourceNames.add(
+                    String.format("%s.layout.%s.xml", dcal.domainClass.getSimpleName(), dcal.layoutIfAny));
+        }
+        candidateResourceNames.add(
+                String.format("%s.layout.xml", dcal.domainClass.getSimpleName()));
+        candidateResourceNames.add(
+                String.format("%s.layout.fallback.xml", dcal.domainClass.getSimpleName()));
+        for (final String candidateResourceName : candidateResourceNames) {
             try {
-                final URL resource = Resources.getResource(domainClass, candidateResourceName);
+                final URL resource = Resources.getResource(dcal.domainClass, candidateResourceName);
                 if (resource != null) {
                     return candidateResourceName;
                 }
@@ -204,34 +286,29 @@ public class GridLoaderServiceDefault implements GridLoaderService {
         return null;
     }
 
+
     enum Type {
         DEFAULT {
             @Override
             protected String suffix() {
-                return ".layout.xml";
+                return ".xml";
             }
         },
         FALLBACK {
             @Override
             protected String suffix() {
-                return ".layout.fallback.xml";
+                return ".fallback.xml";
             }
         };
 
-        private String resourceNameFor(final Class<?> domainClass) {
-            return domainClass.getSimpleName() + suffix();
+        private String resourceNameFor(final DomainClassAndLayout dcal) {
+            return dcal.domainClass.getSimpleName() + ".layout" + (dcal.layoutIfAny != null ? dcal
+                    .layoutIfAny + "." : "") + suffix();
         }
 
         protected abstract String suffix();
     }
 
-    private String resourceNameFor(
-            final Class<?> domainClass,
-            final Type type) {
-        return type.resourceNameFor(domainClass);
-    }
-
-
     //region > injected dependencies
 
     @javax.inject.Inject
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index 90a984f..323c26b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@ -32,15 +32,15 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.layout.grid.Grid;
-import org.apache.isis.applib.services.grid.GridLoaderService;
-import org.apache.isis.applib.services.grid.GridService;
+import org.apache.isis.applib.services.grid.GridLoaderService2;
+import org.apache.isis.applib.services.grid.GridService2;
 import org.apache.isis.applib.services.grid.GridSystemService;
 
 @DomainService(
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
 )
-public class GridServiceDefault implements GridService {
+public class GridServiceDefault implements GridService2 {
 
     private static final Logger LOG = LoggerFactory.getLogger(GridServiceDefault.class);
 
@@ -74,6 +74,12 @@ public class GridServiceDefault implements GridService {
         return gridLoaderService.load(domainClass);
     }
 
+    @Override
+    @Programmatic
+    public Grid load(final Class<?> domainClass, final String layout) {
+        return gridLoaderService.load(domainClass, layout);
+    }
+
     // //////////////////////////////////////
 
     @Override
@@ -200,7 +206,7 @@ public class GridServiceDefault implements GridService {
 
 
     @javax.inject.Inject
-    GridLoaderService gridLoaderService;
+    GridLoaderService2 gridLoaderService;
 
     @javax.inject.Inject
     List<GridSystemService> gridSystemServices;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
index 0ed1974..24bf62b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
@@ -72,7 +72,7 @@ public class LayoutServiceDefault implements LayoutService2 {
         if (style == Style.CURRENT) {
             final ObjectSpecification objectSpec = specificationLoader.loadSpecification(domainClass);
             final GridFacet facet = objectSpec.getFacet(GridFacet.class);
-            return facet != null? facet.getGrid(): null;
+            return facet != null? facet.getGrid(null): null;
         }
 
         // don't use the grid from the facet, because it will be modified subsequently.
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault_resourceNameFor_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault_resourceNameFor_Test.java
index fca557a..90132bf 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault_resourceNameFor_Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault_resourceNameFor_Test.java
@@ -36,23 +36,23 @@ public class GridLoaderServiceDefault_resourceNameFor_Test {
 
     @Test
     public void when_default_exists() {
-        final String s = gridLoaderServiceDefault.resourceNameFor(Foo.class);
+        final String s = gridLoaderServiceDefault.resourceNameFor(new GridLoaderServiceDefault.DomainClassAndLayout(Foo.class, null));
         Assert.assertThat(s, is(equalTo("Foo.layout.xml")));
     }
 
     @Test
     public void when_fallback_exists() {
-        final String s = gridLoaderServiceDefault.resourceNameFor(Foo2.class);
+        final String s = gridLoaderServiceDefault.resourceNameFor(new GridLoaderServiceDefault.DomainClassAndLayout(Foo2.class, null));
         Assert.assertThat(s, is(equalTo("Foo2.layout.fallback.xml")));
     }
     @Test
     public void when_default_and_fallback_both_exist() {
-        final String s = gridLoaderServiceDefault.resourceNameFor(Foo3.class);
+        final String s = gridLoaderServiceDefault.resourceNameFor(new GridLoaderServiceDefault.DomainClassAndLayout(Foo3.class, null));
         Assert.assertThat(s, is(equalTo("Foo3.layout.xml")));
     }
     @Test
     public void when_neither_exist() {
-        final String s = gridLoaderServiceDefault.resourceNameFor(Foo4.class);
+        final String s = gridLoaderServiceDefault.resourceNameFor(new GridLoaderServiceDefault.DomainClassAndLayout(Foo4.class, null));
         Assert.assertNull(s);
     }
 }
\ No newline at end of file
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
index 5c7ee86..ef50602 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
@@ -309,7 +309,8 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         if(gridFacet == null) {
             builder = Responses.ofNotFound();
         } else {
-            Grid grid = gridFacet.getGrid();
+            final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
+            Grid grid = gridFacet.getGrid(objectAdapter);
             addLinks(domainType, instanceId, grid);
             builder = Response.status(Response.Status.OK)
                     .entity(serializationStrategy.entity(grid))
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
index 39065b9..3d2d458 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
@@ -126,7 +126,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
             builder = Responses.ofNotFound();
             return builder.build();
         } else {
-            Grid grid = gridFacet.getGrid();
+            Grid grid = gridFacet.getGrid(null);
             builder = Response.status(Response.Status.OK)
                     .entity(serializationStrategy.entity(grid))
                     .type(serializationStrategy.type(RepresentationType.LAYOUT));
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 0ca73a4..d796a9e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -48,6 +48,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.viewer.wicket.model.common.OnConcurrencyExceptionHandler;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsProvider;
 import org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ColumnAbstract;
@@ -167,7 +168,9 @@ public class CollectionContentsAsAjaxTablePanel
             // the facet should always exist, in fact
             // just enough to ask for the metadata.
             // This will cause the current ObjectSpec to be updated as a side effect.
-            final Grid unused = gridFacet.getGrid();
+            final EntityModel entityModel = getModel().getEntityModel();
+            final ObjectAdapter objectAdapterIfAny = entityModel != null ? entityModel.getObject() : null;
+            final Grid unused = gridFacet.getGrid(objectAdapterIfAny);
         }
 
         final Where whereContext =
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanelFactory.java
index 7aad81a..935542c 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanelFactory.java
@@ -24,6 +24,7 @@ import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3Grid;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
@@ -47,10 +48,11 @@ public class EntityLinksSelectorPanelFactory extends EntityComponentFactoryAbstr
     public Component createComponent(final String id, final IModel<?> model) {
         final EntityModel entityModel = (EntityModel) model;
 
+        final ObjectAdapter objectAdapter = entityModel.getObject();
         final ObjectSpecification specification = entityModel.getTypeOfSpecification();
         final GridFacet facet = specification.getFacet(GridFacet.class);
 
-        final Grid grid = facet.getGrid();
+        final Grid grid = facet.getGrid(objectAdapter);
         if (grid != null) {
             if(grid instanceof BS3Grid) {
                 final BS3Grid bs3Grid = (BS3Grid) grid;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index d71b76b..6e52696 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -159,7 +159,7 @@ public class EntityPage extends PageAbstract {
             // the facet should always exist, in fact
             // just enough to ask for the metadata.
             // This will cause the current ObjectSpec to be updated as a side effect.
-            final Grid unused = gridFacet.getGrid();
+            final Grid unused = gridFacet.getGrid(objectAdapter);
         }
 
         if(titleString == null) {


[isis] 04/10: ISIS-2078: tidies up StandaloneCollectionPanel, removes unused div for modal dialog

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c6f822919eba51d9fe2152757d63b07132114356
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 7 09:40:41 2019 +0000

    ISIS-2078: tidies up StandaloneCollectionPanel, removes unused div for modal dialog
---
 .../components/standalonecollection/StandaloneCollectionPanel.html | 2 --
 .../components/standalonecollection/StandaloneCollectionPanel.java | 7 -------
 2 files changed, 9 deletions(-)

diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html
index 0f407f5..7a9220e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html
@@ -27,8 +27,6 @@
 
             <div wicket:id="standaloneCollection">
 
-                <div wicket:id="actionPromptModalWindow"/>
-
                 <div class="standaloneCollectionPanel actionComponentType panel panel-default">
                     <div class="iconAndTitle panel-heading actionPanelHeaderNew">
                         <span wicket:id="actionName" class="actionName panel-title">[action name]</span>
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
index 3dff331..fa1b89d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
@@ -41,7 +41,6 @@ import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
-import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow;
 import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsHelper;
 import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsLinkFactory;
 import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsProvider;
@@ -62,13 +61,11 @@ public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionMod
     private static final String ID_STANDALONE_COLLECTION = "standaloneCollection";
     private static final String ID_ACTION_NAME = "actionName";
 
-    private static final String ID_ACTION_PROMPT_MODAL_WINDOW = "actionPromptModalWindow";
     private static final String ID_ADDITIONAL_LINKS = "additionalLinks";
     private static final String ID_ADDITIONAL_LINK = "additionalLink";
 
     private static final String ID_SELECTOR_DROPDOWN = "selectorDropdown";
 
-    private final ActionPromptModalWindow actionPromptModalWindow;
     private final CollectionSelectorPanel selectorDropdownPanel;
     private final BulkActionsHelper bulkActionsHelper;
 
@@ -95,10 +92,6 @@ public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionMod
         CssClassAppender.appendCssClassTo(outerDiv,
                 CssClassAppender.asCssStyle("isis-" + entityCollectionModel.getTypeOfSpecification().getSpecId().asString().replace('.','-')));
 
-        // action prompt
-        this.actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW);
-        outerDiv.addOrReplace(actionPromptModalWindow);
-
         // selector
         final CollectionSelectorHelper selectorHelper = new CollectionSelectorHelper(entityCollectionModel, getComponentFactoryRegistry());
 


[isis] 03/10: ISIS-2078: tidies up StandaloneCollectionPanel, no longer implements ActionPromptProvider

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7cc51fc32bacbf402d952705029e858dfee93119
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 7 09:39:20 2019 +0000

    ISIS-2078: tidies up StandaloneCollectionPanel, no longer implements ActionPromptProvider
    
    ... this functionality was unued.
---
 .../standalonecollection/StandaloneCollectionPanel.java  | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
index f099e70..3dff331 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
@@ -31,13 +31,11 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
 
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.common.OnSelectionHandler;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
@@ -57,7 +55,7 @@ import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionModel>
-        implements CollectionCountProvider, CollectionSelectorProvider, BulkActionsProvider, ActionPromptProvider {
+        implements CollectionCountProvider, CollectionSelectorProvider, BulkActionsProvider {
 
     private static final long serialVersionUID = 1L;
 
@@ -131,18 +129,6 @@ public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionMod
         bulkActionsHelper = new BulkActionsHelper(entityCollectionModel);
     }
 
-    //region > ActionPromptModalWindowProvider
-
-    public ActionPromptModalWindow getActionPrompt(final PromptStyle promptStyle) {
-        return actionPromptModalWindow;
-    }
-
-    @Override
-    public void closePrompt(final AjaxRequestTarget target) {
-        actionPromptModalWindow.closePrompt(target);
-    }
-
-    //endregion
 
     //region > BulkActionsProvider
 


[isis] 05/10: ISIS-2078: handles service actions (ie menu items) gracefully if there promptStyle is set to INLINE or INLINE_AS_IF_EDIT

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 0d0a4a7cc38e9ca95e48667cdb1ae76949b70819
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jan 8 06:57:33 2019 +0000

    ISIS-2078: handles service actions (ie menu items) gracefully if there promptStyle is set to INLINE or INLINE_AS_IF_EDIT
---
 .../java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java  | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index f85f291..ffef9e0 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -469,6 +469,9 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
         switch (promptStyle) {
         case AS_CONFIGURED:
         case DIALOG:
+        case INLINE:
+        case INLINE_AS_IF_EDIT:
+        default:
             final DialogMode dialogMode = CONFIG_DIALOG_MODE.from(getConfiguration());
             switch (dialogMode) {
                 case SIDEBAR:
@@ -481,10 +484,6 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
             return actionPromptSidebar;
         case DIALOG_MODAL:
             return actionPromptModalWindow;
-        case INLINE:
-        case INLINE_AS_IF_EDIT:
-        default:
-            throw new IllegalArgumentException(String.format("PromptStyle '%s' not supported", promptStyle));
         }
     }
 


[isis] 08/10: ISIS-2079: improves rebuildMetaModel mixin to return the object being rebuilt.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3b903714f5eff4ebff7884a1f6e5700f6a37fb8e
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 7 09:35:58 2019 +0000

    ISIS-2079: improves rebuildMetaModel mixin to return the object being rebuilt.
---
 .../apache/isis/applib/services/layout/Object_rebuildMetamodel.java    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
index 405d782..3d8ff54 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
@@ -49,8 +49,9 @@ public class Object_rebuildMetamodel {
             position = ActionLayout.Position.PANEL_DROPDOWN
     )
     @MemberOrder(name = "datanucleusIdLong", sequence = "800.1")
-    public void act() {
+    public Object act() {
         metaModelService.rebuild(object.getClass());
+        return this;
     }
 
     @javax.inject.Inject


[isis] 06/10: ISIS-2080: adds LayoutFacet with Method and Fallback implementations

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 115c700d8a2ef463339233546178f6184e488cfe
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 7 09:56:25 2019 +0000

    ISIS-2080: adds LayoutFacet with Method and Fallback implementations
---
 .../facets/object/layout/LayoutFacet.java          | 37 ++++++++++
 .../facets/object/layout/LayoutFacetAbstract.java  | 41 +++++++++++
 .../facets/object/layout/LayoutFacetFactory.java   | 57 +++++++++++++++
 .../facets/object/layout/LayoutFacetFallback.java  | 43 +++++++++++
 .../facets/object/layout/LayoutFacetMethod.java    | 52 ++++++++++++++
 .../dflt/ProgrammingModelFacetsJava5.java          |  2 +
 .../ident/layout/LayoutFacetFactoryTest.java       | 71 ++++++++++++++++++
 .../object/ident/layout/LayoutFacetMethodTest.java | 84 ++++++++++++++++++++++
 8 files changed, 387 insertions(+)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
new file mode 100644
index 0000000..8a072de
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
@@ -0,0 +1,37 @@
+/*
+ *  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.isis.core.metamodel.facets.object.layout;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+
+/*
+ * Layout for an object.
+ * 
+ * <p>
+ * In the standard Apache Isis Programming Model, typically corresponds to a method named <tt>layout</tt>.
+ * 
+ * @see TitleFacet
+ * @see IconFacet
+ */
+public interface LayoutFacet extends Facet {
+
+    public String layout(final ObjectAdapter object);
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetAbstract.java
new file mode 100644
index 0000000..12e0bee
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetAbstract.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.isis.core.metamodel.facets.object.layout;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public abstract class LayoutFacetAbstract extends FacetAbstract implements LayoutFacet {
+
+    public static Class<? extends Facet> type() {
+        return LayoutFacet.class;
+    }
+
+    protected LayoutFacetAbstract(final FacetHolder holder) {
+        this(holder, Derivation.NOT_DERIVED);
+    }
+    protected LayoutFacetAbstract(
+            final FacetHolder holder,
+            final Derivation derivation) {
+        super(type(), holder, derivation);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
new file mode 100644
index 0000000..61b549b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
@@ -0,0 +1,57 @@
+/*
+ *  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.isis.core.metamodel.facets.object.layout;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+
+public class LayoutFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
+
+    private static final String ICON_NAME_PREFIX = "iconName";
+
+    private static final String[] PREFIXES = { ICON_NAME_PREFIX, };
+
+    public LayoutFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+        final Class<?> cls = processClassContext.getCls();
+        final FacetHolder facetHolder = processClassContext.getFacetHolder();
+
+        final Method method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, ICON_NAME_PREFIX, String.class, NO_PARAMETERS_TYPES);
+
+        final LayoutFacet facet;
+        if (method == null) {
+            facet = new LayoutFacetFallback(facetHolder);
+        } else {
+            processClassContext.removeMethod(method);
+            facet = new LayoutFacetMethod(method, facetHolder);
+        }
+        FacetUtil.addFacet(facet);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
new file mode 100644
index 0000000..4f47c37
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
@@ -0,0 +1,43 @@
+/*
+ *  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.isis.core.metamodel.facets.object.layout;
+
+import java.util.Map;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class LayoutFacetFallback extends LayoutFacetAbstract {
+
+    public LayoutFacetFallback(final FacetHolder holder) {
+        super(holder, Derivation.DERIVED);
+    }
+
+    @Override
+    public String layout(final ObjectAdapter owningAdapter) {
+        return null;
+    }
+
+    @Override
+    public void appendAttributesTo(final Map<String, Object> attributeMap) {
+        super.appendAttributesTo(attributeMap);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
new file mode 100644
index 0000000..27f72c3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
@@ -0,0 +1,52 @@
+/*
+ *  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.isis.core.metamodel.facets.object.layout;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
+
+public class LayoutFacetMethod extends LayoutFacetAbstract {
+
+    private final Method method;
+
+    public LayoutFacetMethod(final Method method, final FacetHolder holder) {
+        super(holder);
+        this.method = method;
+    }
+
+    @Override
+    public String layout(final ObjectAdapter owningAdapter) {
+        try {
+            return (String) ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
+        } catch (final RuntimeException ex) {
+            return null;
+        }
+    }
+
+    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+        super.appendAttributesTo(attributeMap);
+        attributeMap.put("method", method);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index d097e30..8fa2683 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -103,6 +103,7 @@ import org.apache.isis.core.metamodel.facets.object.ignore.javalang.RemoveMethod
 import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoEnhancementTypesFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoPrefixedMethodsFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.immutable.immutablemarkerifc.ImmutableFacetMarkerInterfaceFactory;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.mask.annotation.MaskFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.maxlen.annotation.MaxLengthFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.membergroups.annotprop.MemberGroupLayoutFacetFactory;
@@ -409,6 +410,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(new TitleFacetViaMethodsFactory());
         addFactory(new IconFacetMethodFactory());
         addFactory(new CssClassFacetMethodFactory());
+        addFactory(new LayoutFacetFactory());
 
 
         addFactory(new DomainServiceLayoutFacetFactory());
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java
new file mode 100644
index 0000000..7eea575
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java
@@ -0,0 +1,71 @@
+/*
+ *  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.isis.core.metamodel.facets.object.ident.layout;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetMethod;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetFactory;
+
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+public class LayoutFacetFactoryTest extends AbstractFacetFactoryTest {
+
+    private LayoutFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new LayoutFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testLayoutMethodPickedUpOnClassAndMethodRemoved() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public String layout() {
+                return null;
+            }
+        }
+        final Method method = findMethod(Customer.class, "layout");
+
+        facetFactory.process(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(LayoutFacet.class);
+        assertThat(facet, is(notNullValue()));
+        assertThat(facet, is(instanceOf(LayoutFacetMethod.class)));
+
+        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
+    }
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
new file mode 100644
index 0000000..e54da19
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
@@ -0,0 +1,84 @@
+/*
+ *  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.isis.core.metamodel.facets.object.ident.layout;
+
+import java.lang.reflect.Method;
+
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetMethod;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class LayoutFacetMethodTest {
+
+    private final Mockery mockery = new JUnit4Mockery();
+
+    private LayoutFacetMethod facet;
+    private FacetHolder mockFacetHolder;
+
+    private ObjectAdapter mockOwningAdapter;
+
+    private DomainObjectWithProblemInLayoutMethod pojo;
+
+    public static class DomainObjectWithProblemInLayoutMethod {
+        public String layout() {
+            throw new NullPointerException();
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+
+        pojo = new DomainObjectWithProblemInLayoutMethod();
+        mockFacetHolder = mockery.mock(FacetHolder.class);
+        mockOwningAdapter = mockery.mock(ObjectAdapter.class);
+        final Method iconNameMethod = DomainObjectWithProblemInLayoutMethod.class.getMethod("layout");
+        facet = new LayoutFacetMethod(iconNameMethod, mockFacetHolder);
+
+        mockery.checking(new Expectations() {
+            {
+                allowing(mockOwningAdapter).getObject();
+                will(returnValue(pojo));
+            }
+        });
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        facet = null;
+    }
+
+    @Test
+    public void when_layout_throws_exception() {
+        final String layout = facet.layout(mockOwningAdapter);
+        assertThat(layout, is(nullValue()));
+    }
+
+}


[isis] 01/10: ISIS-2072: bumps core's parent to latest ASF version (21)

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit def829ae439469146d567abe56174727c8783ba7
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Jan 6 18:05:24 2019 +0000

    ISIS-2072: bumps core's parent to latest ASF version (21)
---
 core/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/pom.xml b/core/pom.xml
index 4039257..9b2f5f4 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
-        <version>18</version>
+        <version>21</version>
         <relativePath />
     </parent>