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 2013/06/27 11:22:09 UTC

[1/2] git commit: ISIS-446: further minor improvements to DeveloperUtilitiesService.

Updated Branches:
  refs/heads/master 410100776 -> 56b558c54


ISIS-446: further minor improvements to DeveloperUtilitiesService.

- split class name into package name and simple class name
- show abbreviated class names for declarative facets
- ignore no-op facets
- refactored to simplify somewhat.


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

Branch: refs/heads/master
Commit: bfa434b6d254733abce4096a894ec759a77af062
Parents: 4101007
Author: Dan Haywood <da...@apache.org>
Authored: Thu Jun 27 10:09:00 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Jun 27 10:09:00 2013 +0100

----------------------------------------------------------------------
 .../isis/core/commons/lang/StringUtils.java     |  14 ++
 .../services/devutils/MetaModelRow.java         | 196 +++++++++----------
 2 files changed, 106 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bfa434b6/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringUtils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringUtils.java
index 185425b..5abfa76 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringUtils.java
@@ -371,4 +371,18 @@ public final class StringUtils {
         return Enums.getEnumNameFromFriendly(enumFriendlyName);
     }
 
+    /*
+     * eg converts <tt>HiddenFacetForMemberAnnotation</tt> to <tt>HFFMA</tt>.
+     */
+    public static String toAbbreviation(final String str) {
+        final StringBuilder buf = new StringBuilder();
+        for(char c: str.toCharArray()) {
+            if(Character.isUpperCase(c)) {
+                buf.append(c);
+            }
+        }
+        final String string2 = buf.toString();
+        return string2;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/bfa434b6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/MetaModelRow.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/MetaModelRow.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/MetaModelRow.java
index 8f52042..81abeec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/MetaModelRow.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/MetaModelRow.java
@@ -16,13 +16,16 @@
  */
 package org.apache.isis.core.metamodel.services.devutils;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.SortedSet;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 import org.apache.isis.applib.util.ObjectContracts;
+import org.apache.isis.core.commons.lang.StringUtils;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actions.choices.ActionChoicesFacet;
@@ -49,99 +52,11 @@ import org.apache.isis.core.progmodel.facets.properties.validate.PropertyValidat
 public class MetaModelRow implements Comparable<MetaModelRow>{
 
     enum MemberType {
-        PROPERTY {
-            @Override
-            String getChoices(MetaModelRow metaModelRow) {
-                return interpretRowAndFacet(metaModelRow, PropertyChoicesFacet.class);
-            }
-            @Override
-            String getAutoComplete(MetaModelRow metaModelRow) {
-                return interpretRowAndFacet(metaModelRow, PropertyAutoCompleteFacet.class);
-            }
-            @Override
-            String getDefault(MetaModelRow metaModelRow) {
-                return interpretRowAndFacet(metaModelRow, PropertyDefaultFacet.class);
-            }
-            @Override
-            String getValidate(MetaModelRow metaModelRow) {
-                return interpretRowAndFacet(metaModelRow, PropertyValidateFacet.class);
-            }
-        },
-        COLLECTION {
-            @Override
-            String getChoices(MetaModelRow metaModelRow) {
-                return "";
-            }
-            @Override
-            String getAutoComplete(MetaModelRow metaModelRow) {
-                return "";
-            }
-            @Override
-            String getDefault(MetaModelRow metaModelRow) {
-                return "";
-            }
-            @Override
-            String getValidate(MetaModelRow metaModelRow) {
-                final List<String> interpretations = Lists.newArrayList();
-                addIfNotEmpty(interpretRowAndFacet(metaModelRow, CollectionValidateAddToFacet.class), interpretations);
-                addIfNotEmpty(interpretRowAndFacet(metaModelRow, CollectionValidateRemoveFromFacet.class), interpretations);
-                return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : "";
-            }
-        },
-        ACTION {
-            @Override
-            String getChoices(MetaModelRow metaModelRow) {
-                final List<ObjectActionParameter> parameters = metaModelRow.action.getParameters();
-                final List<String> interpretations = Lists.newArrayList();
-                for (ObjectActionParameter param : parameters) {
-                    final ActionParameterChoicesFacet facet = param.getFacet(ActionParameterChoicesFacet.class);
-                    addIfNotEmpty(interpretFacet(facet), interpretations);
-                }
-                return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : interpretRowAndFacet(metaModelRow, ActionChoicesFacet.class);
-            }
-            @Override
-            String getAutoComplete(MetaModelRow metaModelRow) {
-                final List<ObjectActionParameter> parameters = metaModelRow.action.getParameters();
-                final List<String> interpretations = Lists.newArrayList();
-                for (ObjectActionParameter param : parameters) {
-                    final ActionParameterAutoCompleteFacet facet = param.getFacet(ActionParameterAutoCompleteFacet.class);
-                    addIfNotEmpty(interpretFacet(facet), interpretations);
-                }
-                return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : "";
-            }
-            @Override
-            String getDefault(MetaModelRow metaModelRow) {
-                final List<ObjectActionParameter> parameters = metaModelRow.action.getParameters();
-                final List<String> interpretations = Lists.newArrayList();
-                for (ObjectActionParameter param : parameters) {
-                    final ActionParameterDefaultsFacet facet = param.getFacet(ActionParameterDefaultsFacet.class);
-                    addIfNotEmpty(interpretFacet(facet), interpretations);
-                }
-                return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : interpretRowAndFacet(metaModelRow, ActionDefaultsFacet.class);
-            }
-            @Override
-            String getValidate(MetaModelRow metaModelRow) {
-                return interpretRowAndFacet(metaModelRow, ActionValidationFacet.class);
-            }
-        };
-
-        private static String interpretRowAndFacet(MetaModelRow metaModelRow, Class<? extends Facet> facetClass) {
-            final Facet facet = metaModelRow.member.getFacet(facetClass);
-            return interpretFacet(facet);
-        }
-        
-        private static void addIfNotEmpty(final String str, final List<String> list) {
-            if(!Strings.isNullOrEmpty(str)) {
-                list.add(str);
-            }
-        }
-
-        abstract String getChoices(MetaModelRow metaModelRow);
-        abstract String getAutoComplete(MetaModelRow metaModelRow);
-        abstract String getDefault(MetaModelRow metaModelRow);
-        abstract String getValidate(MetaModelRow metaModelRow);
+        PROPERTY,
+        COLLECTION,
+        ACTION;
     }
-    
+
     private final ObjectSpecification spec;
     private final MemberType memberType;
     private final ObjectMember member;
@@ -173,7 +88,16 @@ public class MetaModelRow implements Comparable<MetaModelRow>{
         return service || spec.isService() ?"2 Service":spec.isValue()?"3 Value":spec.isParentedOrFreeCollection()?"4 Collection":"1 Object";
     }
     public String getClassName() {
-        return spec.getFullIdentifier();
+        final String fullIdentifier = spec.getFullIdentifier();
+        final int lastDot = fullIdentifier.lastIndexOf(".");
+        return lastDot>0 && lastDot < fullIdentifier.length()-1
+                ?fullIdentifier.substring(lastDot+1,fullIdentifier.length())
+                :fullIdentifier;
+    }
+    public String getPackageName() {
+        final String fullIdentifier = spec.getFullIdentifier();
+        final int lastDot = fullIdentifier.lastIndexOf(".");
+        return lastDot>0?fullIdentifier.substring(0,lastDot):fullIdentifier;
     }
     public String getType() {
         return memberType.name().toLowerCase();
@@ -191,25 +115,71 @@ public class MetaModelRow implements Comparable<MetaModelRow>{
         return interpret(DisabledFacet.class);
     }
     public String getChoices() {
-        return memberType.getChoices(this);
+        if(memberType == MemberType.PROPERTY) {
+            return interpretRowAndFacet(PropertyChoicesFacet.class);
+        } else if(memberType == MemberType.COLLECTION) {
+            return "";
+        } else {
+            final List<ObjectActionParameter> parameters = this.action.getParameters();
+            final SortedSet<String> interpretations = Sets.newTreeSet();
+            for (ObjectActionParameter param : parameters) {
+                final ActionParameterChoicesFacet facet = param.getFacet(ActionParameterChoicesFacet.class);
+                addIfNotEmpty(interpretFacet(facet), interpretations);
+            }
+            return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : interpretRowAndFacet(ActionChoicesFacet.class);
+        }
     }
     public String getAutoComplete() {
-        return memberType.getAutoComplete(this);
+        if(memberType == MemberType.PROPERTY) {
+            return interpretRowAndFacet(PropertyAutoCompleteFacet.class);
+        } else if(memberType == MemberType.COLLECTION) {
+           return "";
+        } else {
+            final List<ObjectActionParameter> parameters = this.action.getParameters();
+            final SortedSet<String> interpretations = Sets.newTreeSet();
+            for (ObjectActionParameter param : parameters) {
+                final ActionParameterAutoCompleteFacet facet = param.getFacet(ActionParameterAutoCompleteFacet.class);
+                addIfNotEmpty(interpretFacet(facet), interpretations);
+            }
+            return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : "";
+        }
     }
     String getDefault() {
-        return memberType.getDefault(this);
+        if(memberType == MemberType.PROPERTY) {
+            return interpretRowAndFacet(PropertyDefaultFacet.class);
+        } else if(memberType == MemberType.COLLECTION) {
+            return "";
+        } else {
+            final List<ObjectActionParameter> parameters = this.action.getParameters();
+            final SortedSet<String> interpretations = Sets.newTreeSet();
+            for (ObjectActionParameter param : parameters) {
+                final ActionParameterDefaultsFacet facet = param.getFacet(ActionParameterDefaultsFacet.class);
+                addIfNotEmpty(interpretFacet(facet), interpretations);
+            }
+            return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : interpretRowAndFacet(ActionDefaultsFacet.class);
+        }
     }
     String getValidate() {
-        return memberType.getValidate(this);
+        if(memberType == MemberType.PROPERTY) {
+            return interpretRowAndFacet(PropertyValidateFacet.class);
+        } else if(memberType == MemberType.COLLECTION) {
+            final SortedSet<String> interpretations = Sets.newTreeSet();
+            addIfNotEmpty(interpretRowAndFacet(CollectionValidateAddToFacet.class), interpretations);
+            addIfNotEmpty(interpretRowAndFacet(CollectionValidateRemoveFromFacet.class), interpretations);
+            return !interpretations.isEmpty()? Joiner.on(";").join(interpretations) : "";
+       } else {
+           return interpretRowAndFacet(ActionValidationFacet.class);
+        }
     }
 
     static Object header() {
-        return "classType,className,memberType,memberName,numParams,hidden,disabled,choices,autoComplete,default,validate";
+        return "classType,packageName,className,memberType,memberName,numParams,hidden,disabled,choices,autoComplete,default,validate";
     }
     
     String asTextCsv() {
         return Joiner.on(",").join(
                 getClassType(),
+                getPackageName(),
                 getClassName(),
                 getType(),
                 getMemberName(),
@@ -221,26 +191,44 @@ public class MetaModelRow implements Comparable<MetaModelRow>{
                 getDefault(),
                 getValidate());
     }
+ 
+    private String interpretRowAndFacet(Class<? extends Facet> facetClass) {
+        final Facet facet = member.getFacet(facetClass);
+        return interpretFacet(facet);
+    }
+    
+    private static void addIfNotEmpty(final String str, final SortedSet<String> set) {
+        if(!Strings.isNullOrEmpty(str)) {
+            set.add(str);
+        }
+    }
     
     private String interpret(final Class<? extends Facet> cls) {
         return interpretFacet(member.getFacet(cls));
     }
 
     private static String interpretFacet(final Facet facet) {
-        if (facet == null) {
+        if (facet == null || facet.isNoop()) {
             return "";
         }
         if (facet instanceof ImperativeFacet) {
             ImperativeFacet imperativeFacet = (ImperativeFacet) facet;
             return imperativeFacet.getMethods().get(0).getName();
-        } else {
-            return "decl.";
-        }
+        } 
+        final String name = facet.getClass().getSimpleName();
+        if (ignore(name)) {
+            return "";
+        } 
+        final String abbr = StringUtils.toAbbreviation(name);
+        return abbr.length()>0 ? abbr : name;
+    }
+
+    protected static boolean ignore(final String name) {
+        return Arrays.asList("PropertyValidateFacetDefault","PropertyDefaultFacetDerivedFromDefaultedFacet").contains(name);
     }
 
     @Override
     public int compareTo(MetaModelRow o) {
         return ObjectContracts.compare(this, o, "classType,className,type desc,memberName");
     }
-
 }
\ No newline at end of file


[2/2] git commit: ISIS-447: prototype class for prototype/exploration actions.

Posted by da...@apache.org.
ISIS-447: prototype class for prototype/exploration actions.


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

Branch: refs/heads/master
Commit: 56b558c543a5c27b999f4089b05c5c3a811caf65
Parents: bfa434b
Author: Dan Haywood <da...@apache.org>
Authored: Thu Jun 27 10:11:50 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Jun 27 10:11:50 2013 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/links/LinkAndLabel.java |  9 +++++-
 .../additionallinks/AdditionalLinksPanel.java   |  5 +++-
 .../cssmenu/AppActionsCssMenuLinkFactory.java   |  6 ++--
 .../ajaxtable/BulkActionsLinkFactory.java       |  2 +-
 .../entity/EntityActionLinkFactory.java         |  5 ++--
 .../components/widgets/cssmenu/CssMenuItem.java | 31 ++++++++++++++++++--
 .../entitylink/EntityLinkSelect2Panel.html      |  4 +--
 .../entitylink/EntityLinkSelect2Panel.java      |  2 +-
 .../viewer/wicket/ui/pages/PageAbstract.css     |  7 ++++-
 9 files changed, 57 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
index 9aca2ea..717a528 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
@@ -30,12 +30,14 @@ public class LinkAndLabel implements Serializable {
     private final String label;
     private final String disabledReasonIfAny;
     private final boolean blobOrClob;
+    private final boolean prototype;
 
-    public LinkAndLabel(final AbstractLink link, final String label, String disabledReasonIfAny, boolean blobOrClob) {
+    public LinkAndLabel(final AbstractLink link, final String label, String disabledReasonIfAny, final boolean blobOrClob, final boolean prototype) {
         this.link = link;
         this.label = label;
         this.disabledReasonIfAny = disabledReasonIfAny;
         this.blobOrClob = blobOrClob;
+        this.prototype = prototype;
     }
 
     public AbstractLink getLink() {
@@ -53,4 +55,9 @@ public class LinkAndLabel implements Serializable {
     public boolean isBlobOrClob() {
         return blobOrClob;
     }
+ 
+    public boolean isPrototype() {
+        return prototype;
+    }
+    
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
index 434b6b1..92b7162 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
@@ -77,7 +77,10 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
                     viewTitleLabel.add(new AttributeAppender("title", disabledReasonIfAny));
                 }
                 if(linkAndLabel.isBlobOrClob()) {
-                    link.add(new AttributeModifier("class", Model.of("noVeil")));
+                    link.add(new CssClassAppender("noVeil"));
+                }
+                if(linkAndLabel.isPrototype()) {
+                    link.add(new CssClassAppender("prototype"));
                 }
                 viewTitleLabel.add(new CssClassAppender(StringUtils.toLowerDashed(linkAndLabel.getLabel())));
                 link.addOrReplace(viewTitleLabel);

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
index d6df1a5..9e77876 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
@@ -50,8 +50,10 @@ class AppActionsCssMenuLinkFactory implements CssMenuLinkFactory {
         final AbstractLink link = Links.newBookmarkablePageLink(linkId, pageParameters, pageClass);
         final String actionLabel = ObjectActions.nameFor(action);
 
-        boolean blobOrClob = CssMenuItem.returnsBlobOrClob(action);
-        return new LinkAndLabel(link, actionLabel, null, blobOrClob);
+        final boolean blobOrClob = CssMenuItem.returnsBlobOrClob(action);
+        final boolean prototype = CssMenuItem.isExplorationOrPrototype(action);
+        
+        return new LinkAndLabel(link, actionLabel, null, blobOrClob, prototype);
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
index e2481de..f80c8ef 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
@@ -101,6 +101,6 @@ final class BulkActionsLinkFactory implements CssMenuLinkFactory {
 
         };
         link.add(new JGrowlBehaviour());
-        return new LinkAndLabel(link, objectAction.getName(), null, false);
+        return new LinkAndLabel(link, objectAction.getName(), null, false, CssMenuItem.isExplorationOrPrototype(objectAction));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
index 14714e3..99335b8 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
@@ -82,8 +82,9 @@ public final class EntityActionLinkFactory implements CssMenuLinkFactory {
             link.setEnabled(false);
         }
 
-        boolean blobOrClob = CssMenuItem.returnsBlobOrClob(action);
-        return new LinkAndLabel(link, label, disabledReasonIfAny, blobOrClob);
+        final boolean blobOrClob = CssMenuItem.returnsBlobOrClob(action);
+        final boolean prototype = CssMenuItem.isExplorationOrPrototype(action);
+        return new LinkAndLabel(link, label, disabledReasonIfAny, blobOrClob, prototype);
     }
 
     private AbstractLink createLink(final ObjectAdapterMemento adapterMemento, final ObjectAction action, final String linkId, final ObjectAdapter adapter) {

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
index 4f6417b..4c566d7 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
@@ -103,6 +103,11 @@ public class CssMenuItem implements Serializable {
             return cssMenuItem;
         }
 
+        public Builder prototyping(boolean prototype) {
+            cssMenuItem.setPrototyping(prototype);
+            return this;
+        }
+        
         /**
          * Returns the built {@link CssMenuItem}, associating with
          * {@link #parent(CssMenuItem) parent} (if specified).
@@ -113,6 +118,7 @@ public class CssMenuItem implements Serializable {
             }
             return cssMenuItem;
         }
+
     }
 
     private final String name;
@@ -123,12 +129,14 @@ public class CssMenuItem implements Serializable {
     private boolean enabled = true; // unless disabled
     private String disabledReason;
     private boolean blobOrClob = false; // unless set otherwise
+    private boolean prototype = false; // unless set otherwise
 
     static final String ID_MENU_LABEL = "menuLabel";
 
     static final String ID_SUB_MENU_ITEMS = "subMenuItems";
 
 
+
     /**
      * Factory method returning {@link Builder builder}.
      */
@@ -136,6 +144,14 @@ public class CssMenuItem implements Serializable {
         return new Builder(name);
     }
 
+    /**
+     * @param prototype
+     */
+    public void setPrototyping(boolean prototype) {
+        this.prototype = prototype;
+        
+    }
+
     private CssMenuItem(final String name) {
         this.name = name;
     }
@@ -238,9 +254,10 @@ public class CssMenuItem implements Serializable {
         final String reasonDisabledIfAny = usability.getReason();
         
         // check if returns blob or clob (if so, then add CSS to suppress veil)
-        boolean blobOrClob = returnsBlobOrClob(objectAction);
+        final boolean blobOrClob = returnsBlobOrClob(objectAction);
+        final boolean prototype = isExplorationOrPrototype(objectAction);
 
-        return newSubMenuItem(actionLabel).link(link).enabled(reasonDisabledIfAny).returnsBlobOrClob(blobOrClob);
+        return newSubMenuItem(actionLabel).link(link).enabled(reasonDisabledIfAny).returnsBlobOrClob(blobOrClob).prototyping(prototype);
     }
 
     public static boolean returnsBlobOrClob(final ObjectAction objectAction) {
@@ -255,6 +272,10 @@ public class CssMenuItem implements Serializable {
         return blobOrClob;
     }
 
+    public static boolean isExplorationOrPrototype(final ObjectAction action) {
+        return action.getType().isExploration() || action.getType().isPrototype();
+    }
+
     
     /**
      * Creates a {@link Builder} for a submenu item where the provided {@link CssMenuLinkFactory} is able to provide the target adapter. 
@@ -291,7 +312,10 @@ public class CssMenuItem implements Serializable {
             link.add(label);
             
             if(this.blobOrClob) {
-                link.add(new AttributeModifier("class", Model.of("noVeil")));
+                link.add(new CssClassAppender("noVeil"));
+            }
+            if(this.prototype) {
+                link.add(new CssClassAppender("prototype"));
             }
             // .. and hide label
             Components.permanentlyHide(markupContainer, CssMenuItem.ID_MENU_LABEL);
@@ -302,6 +326,7 @@ public class CssMenuItem implements Serializable {
             // ... and show label, along with disabled reason
             label.add(new AttributeModifier("title", Model.of(this.getDisabledReason())));
             label.add(new AttributeModifier("class", Model.of("disabled")));
+
             markupContainer.add(label);
 
             return label;

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
index 62b0add..c3109ca 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
@@ -41,8 +41,8 @@
 					</div>
 				    <div class="clear"/>
 	  			</div>
-			    <div class="feedbackPanel">
-			        <span wicket:id="feedback"/>
+			    <div class="xfeedbackPanel">
+			        <span xwicket:id="feedback"/>
 			    </div>
 			</div>
 		</wicket:panel>

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
index d93c45a..67259d4 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
@@ -93,7 +93,7 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
      * Builds the parts of the GUI that are not dynamic.
      */
     private void buildGui() {
-        addOrReplace(new ComponentFeedbackPanel(ID_FEEDBACK, this));
+        //addOrReplace(new ComponentFeedbackPanel(ID_FEEDBACK, this));
         syncWithInput();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/56b558c5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
index 157e17e..d988bfe 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
@@ -235,6 +235,11 @@ colors
     	font-weight:bold;
 	}
 	
+    #applicationActions .cssMenuPanel .menuh a.prototype span {
+	    color: lightblue;
+	}
+	
+	
 	#applicationActions .cssMenuPanel .menuh li a:link, 
 	#applicationActions .cssMenuPanel .menuh li a:visited, 
 	#applicationActions .cssMenuPanel .menuh li a:active, 
@@ -291,7 +296,7 @@ colors
 	    padding: 0px 1em 0px 1em;
 	    background-image:none !important;
 	}
-	
+
 	#applicationActions .cssMenuPanel .menuh li:hover a, 
 	#applicationActions .cssMenuPanel .menuh li:hover p {
 		color: #FFFFFF;