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

[44/47] isis git commit: ISIS-1000: generalizing CssClassFacet to accept an (optional) ObjectAdapter

ISIS-1000: generalizing CssClassFacet to accept an (optional) ObjectAdapter

This allows the same facet to be used for the object-level cssClass() (corresponding to CssClassFacetMethod) as well as the member-level @XxxLayout(cssClass=...) annotations.  It also opens up the possibility of member-level CSS being dynamic (per object instance) in the future.

Also, updated todoapp to demonstrate the feature (completed items are rendered in tables with a line-through and lightgrey).


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

Branch: refs/heads/ISIS-985
Commit: 21065af2853d8d76c81086ef777314b4d104d1ee
Parents: 1db029f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Jan 5 23:33:14 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Jan 6 20:15:33 2015 +0000

----------------------------------------------------------------------
 .../entityactions/AdditionalLinksPanel.java     |  5 ++---
 .../entityactions/EntityActionLinkFactory.java  | 14 ++++++------
 .../actionmenu/serviceactions/CssMenuItem.java  | 18 +--------------
 .../ServiceActionLinkFactory.java               |  2 +-
 .../collection/bulk/BulkActionsLinkFactory.java |  2 +-
 .../ajaxtable/IsisAjaxFallbackDataTable.java    | 12 +++++-----
 .../collections/EntityCollectionsPanel.java     |  4 +++-
 .../entity/combined/EntityCombinedPanel.java    |  7 ++++--
 .../components/scalars/ScalarPanelAbstract.java |  5 ++++-
 .../linkandlabel/ActionLinkFactoryAbstract.java |  8 +++++--
 .../viewer/wicket/ui/util/CssClassAppender.java | 18 +++++++++++++--
 .../facets/members/cssclass/CssClassFacet.java  | 12 +++++-----
 .../members/cssclass/CssClassFacetAbstract.java | 19 +++++++++++-----
 .../cssclass/method/CssClassFacetMethod.java    | 23 ++++++++++++--------
 .../json/LayoutMetadataReaderFromJson.java      |  4 ++--
 .../metamodel/spec/ObjectSpecification.java     | 11 +---------
 .../metamodel/spec/feature/ObjectAction.java    | 14 +++++-------
 .../specimpl/ObjectSpecificationAbstract.java   | 16 +++-----------
 ...ClassAnnotationOnMemberFacetFactoryTest.java |  2 +-
 ...ssClassFacetOnTypeAnnotationFactoryTest.java |  2 +-
 .../testspec/ObjectSpecificationStub.java       |  7 +-----
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  3 +++
 .../webapp/src/main/webapp/css/application.css  |  7 ++++++
 23 files changed, 111 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
index 5724453..3fd13d6 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
@@ -118,9 +118,8 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
                 link.add(new CssClassAppender(linkAndLabel.getActionIdentifier()));
 
                 final String cssClass = linkAndLabel.getCssClass();
-                if(cssClass != null) {
-                    link.add(new CssClassAppender(cssClass));
-                }
+                CssClassAppender.appendCssClassTo(link, cssClass);
+
                 viewTitleLabel.add(new CssClassAppender(StringExtensions.asLowerDashed(linkAndLabel.getLabel())));
 
                 link.addOrReplace(viewTitleLabel);

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
index 654cf02..67ebf38 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
@@ -51,31 +51,31 @@ public final class EntityActionLinkFactory extends ActionLinkFactoryAbstract {
             final ObjectAction action,
             final String linkId) {
 
-        final ObjectAdapter adapter = adapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
+        final ObjectAdapter objectAdapter = adapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
         
-        final Boolean persistent = adapter.representsPersistent();
+        final Boolean persistent = objectAdapter.representsPersistent();
         if (!persistent) {
-            throw new IllegalArgumentException("Object '" + adapter.titleString(null) + "' is not persistent.");
+            throw new IllegalArgumentException("Object '" + objectAdapter.titleString(null) + "' is not persistent.");
         }
 
         // check visibility and whether enabled
         final AuthenticationSession session = getAuthenticationSession();
         
-        final Consent visibility = action.isVisible(session, adapter, Where.OBJECT_FORMS);
+        final Consent visibility = action.isVisible(session, objectAdapter, Where.OBJECT_FORMS);
         if (visibility.isVetoed()) {
             return null;
         }
 
         
-        final AbstractLink link = newLink(linkId, adapter, action);
+        final AbstractLink link = newLink(linkId, objectAdapter, action);
         
-        final Consent usability = action.isUsable(session, adapter, Where.OBJECT_FORMS);
+        final Consent usability = action.isUsable(session, objectAdapter, Where.OBJECT_FORMS);
         final String disabledReasonIfAny = usability.getReason();
         if(disabledReasonIfAny != null) {
             link.setEnabled(false);
         }
 
-        return newLinkAndLabel(action, link, disabledReasonIfAny);
+        return newLinkAndLabel(objectAdapter, action, link, disabledReasonIfAny);
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
index b06bc95..8e9a6ae 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
@@ -39,8 +39,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -114,25 +112,11 @@ class CssMenuItem implements Serializable {
             return this;
         }
 
-        public Builder withFacet(CssClassFacet facet) {
-            if(facet != null) {
-                withCssClass(facet.value());
-            }
-            return this;
-        }
-
         public Builder withCssClass(String cssClass) {
             cssMenuItem.setCssClass(cssClass);
             return this;
         }
 
-        public Builder withFacet(CssClassFaFacet facet) {
-            if(facet != null) {
-                withCssClassFa(facet.value());
-            }
-            return this;
-        }
-
         public Builder withCssClassFa(String cssClassFa) {
             cssMenuItem.setCssClassFa(cssClassFa);
             return this;
@@ -346,7 +330,7 @@ class CssMenuItem implements Serializable {
                 .prototyping(ObjectAction.Utils.isExplorationOrPrototype(objectAction))
                 .separator(separator)
                 .withActionIdentifier(ObjectAction.Utils.actionIdentifierFor(objectAction))
-                .withCssClass(ObjectAction.Utils.cssClassFor(objectAction))
+                .withCssClass(ObjectAction.Utils.cssClassFor(objectAction, adapter))
                 .withCssClassFa(ObjectAction.Utils.cssClassFaFor(objectAction))
                 .withCssClassFaPosition(ObjectAction.Utils.cssClassFaPositionFor(objectAction));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
index d9b3b6d..2aa97ba 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
@@ -42,7 +42,7 @@ class ServiceActionLinkFactory extends ActionLinkFactoryAbstract {
 
         final AbstractLink link = newLink(linkId, objectAdapter, action);
 
-        return newLinkAndLabel(action, link, null);
+        return newLinkAndLabel(objectAdapter, action, link, null);
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index 1ccbd22..14ba904 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -202,7 +202,7 @@ public final class BulkActionsLinkFactory implements ActionLinkFactory {
         final boolean explorationOrPrototype = ObjectAction.Utils.isExplorationOrPrototype(objectAction);
         final String actionIdentifier = ObjectAction.Utils.actionIdentifierFor(objectAction);
         final String description = ObjectAction.Utils.descriptionOf(objectAction);
-        final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
+        final String cssClass = ObjectAction.Utils.cssClassFor(objectAction, null);
         final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
         final ActionLayout.CssClassFaPosition cssClassFaPosition = ObjectAction.Utils.cssClassFaPositionFor(objectAction);
         final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackDataTable.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackDataTable.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackDataTable.java
index 509eb6a..57580bd 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackDataTable.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackDataTable.java
@@ -35,11 +35,13 @@ import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.OddEvenItem;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.lang.Generics;
-import org.apache.wicket.util.string.Strings;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.hints.IsisUiHintEvent;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 public class IsisAjaxFallbackDataTable<T, S> extends DataTable<T, S> implements UiHintPathSignificant {
     
@@ -84,10 +86,10 @@ public class IsisAjaxFallbackDataTable<T, S> extends DataTable<T, S> implements
 
                 if (model instanceof EntityModel) {
                     EntityModel entityModel = (EntityModel) model;
-                    String cssClass = entityModel.getTypeOfSpecification().getCssClass(entityModel.getObject());
-                    if (!Strings.isEmpty(cssClass)) {
-                        tag.append("class", cssClass, " ");
-                    }
+                    final ObjectAdapter objectAdapter = entityModel.getObject();
+                    final ObjectSpecification typeOfSpecification = entityModel.getTypeOfSpecification();
+                    String cssClass = typeOfSpecification.getCssClass(objectAdapter);
+                    CssClassAppender.appendCssClassTo(tag, cssClass);
                 }
             }
         };

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
index 7d35b91..5b50367 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
@@ -109,7 +109,9 @@ public class EntityCollectionsPanel extends PanelAbstract<EntityModel> {
 
         final CssClassFacet facet = association.getFacet(CssClassFacet.class);
         if(facet != null) {
-            collectionRvContainer.add(new CssClassAppender(facet.value()));
+            final ObjectAdapter objectAdapter = entityModel.getObject();
+            final String cssClass = facet.cssClass(objectAdapter);
+            CssClassAppender.appendCssClassTo(collectionRvContainer, cssClass);
         }
         final WebMarkupContainer fieldset = new WebMarkupContainer(ID_COLLECTION_GROUP);
         collectionRvContainer.add(fieldset);

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
index 26fe7bc..ee26581 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.viewer.wicket.ui.components.entity.combined;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
@@ -43,9 +44,11 @@ public class EntityCombinedPanel extends PanelAbstract<EntityModel> {
 
     private void buildGui() {
         final EntityModel model = getModel();
-        final CssClassFacet facet = model.getObject().getSpecification().getFacet(CssClassFacet.class);
+        final ObjectAdapter objectAdapter = model.getObject();
+        final CssClassFacet facet = objectAdapter.getSpecification().getFacet(CssClassFacet.class);
         if(facet != null) {
-            this.add(new CssClassAppender(facet.value()));
+            final String cssClass = facet.cssClass(objectAdapter);
+            CssClassAppender.appendCssClassTo(this, cssClass);
         }
 
         addOrReplace(ComponentType.ENTITY_SUMMARY, model);

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index 3299c06..420fa1a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -36,6 +36,7 @@ import org.apache.wicket.model.Model;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.propparam.layout.LabelAtFacet;
 import org.apache.isis.core.runtime.system.DeploymentType;
@@ -273,7 +274,9 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         ScalarModel model = getModel();
         final CssClassFacet facet = model.getFacet(CssClassFacet.class);
         if(facet != null) {
-            CssClassAppender.appendCssClassTo(this, facet.value());
+            final ObjectAdapter parentAdapter = model.getParentObjectAdapterMemento().getObjectAdapter(AdapterManager.ConcurrencyChecking.NO_CHECK);
+            final String cssClass = facet.cssClass(parentAdapter);
+            CssClassAppender.appendCssClassTo(this, cssClass);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index e400a06..b0e37c3 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -202,7 +202,11 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
                 action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Clob.class);
     }
 
-    protected LinkAndLabel newLinkAndLabel(final ObjectAction objectAction, final AbstractLink link, final String disabledReasonIfAny) {
+    protected LinkAndLabel newLinkAndLabel(
+            final ObjectAdapter objectAdapter,
+            final ObjectAction objectAction,
+            final AbstractLink link,
+            final String disabledReasonIfAny) {
 
         final String label = ObjectAction.Utils.nameFor(objectAction);
         final boolean blobOrClob = ObjectAction.Utils.returnsBlobOrClob(objectAction);
@@ -210,7 +214,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
         final String actionIdentifier = ObjectAction.Utils.actionIdentifierFor(objectAction);
         final String description = ObjectAction.Utils.descriptionOf(objectAction);
         final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
-        final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
+        final String cssClass = ObjectAction.Utils.cssClassFor(objectAction, objectAdapter);
         final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
         final ActionLayout.CssClassFaPosition cssClassFaPosition = ObjectAction.Utils.cssClassFaPositionFor(objectAction);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/CssClassAppender.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/CssClassAppender.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/CssClassAppender.java
index 28aeadc..884bd26 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/CssClassAppender.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/CssClassAppender.java
@@ -19,8 +19,10 @@
 
 package org.apache.isis.viewer.wicket.ui.util;
 
+import com.google.common.base.Strings;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
@@ -41,12 +43,24 @@ public class CssClassAppender extends AttributeAppender {
     }
 
     /**
-     * Adds CSS class to container (providing that the class is non-null.
+     * Adds CSS class to tag (providing that the class is non-null and non-empty).
+     */
+    public static void appendCssClassTo(
+            final ComponentTag tag,
+            final String cssClass) {
+        if(Strings.isNullOrEmpty(cssClass)) {
+            return;
+        }
+        tag.append("class", cssClass, " ");
+    }
+
+    /**
+     * Adds CSS class to container (providing that the class is non-null and non-empty).
      */
     public static void appendCssClassTo(
             final MarkupContainer markupContainer,
             final String cssClass) {
-        if(cssClass == null) {
+        if(Strings.isNullOrEmpty(cssClass)) {
             return;
         }
         markupContainer.add(new CssClassAppender(cssClass));

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacet.java
index b2d9ce3..e69854b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacet.java
@@ -19,14 +19,14 @@
 
 package org.apache.isis.core.metamodel.facets.members.cssclass;
 
-import org.apache.isis.core.metamodel.facets.SingleStringValueFacet;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**
  * The css class of a class, a property, collection, or an action.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@CssClass</tt>.
  */
-public interface CssClassFacet extends SingleStringValueFacet {
+public interface CssClassFacet extends Facet {
+
+    public String cssClass(final ObjectAdapter objectAdapter);
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
index 76dd19e..7ae7821 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
@@ -19,17 +19,26 @@
 
 package org.apache.isis.core.metamodel.facets.members.cssclass;
 
+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.SingleStringValueFacetAbstract;
 
-public class CssClassFacetAbstract extends SingleStringValueFacetAbstract implements CssClassFacet {
+public abstract class CssClassFacetAbstract extends FacetAbstract implements CssClassFacet {
+
+    public static Class<? extends Facet> type() {
+        return CssClassFacet.class;
+    }
+
+    private final String value;
 
     public CssClassFacetAbstract(final String value, final FacetHolder holder) {
-        super(type(), holder, value);
+        super(type(), holder, Derivation.NOT_DERIVED);
+        this.value = value;
     }
 
-    public static Class<? extends Facet> type() {
-        return CssClassFacet.class;
+    @Override
+    public String cssClass(final ObjectAdapter objectAdapter) {
+        return value;
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
index 67899df..2f0cd35 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
@@ -21,25 +21,30 @@ package org.apache.isis.core.metamodel.facets.object.cssclass.method;
 
 import java.lang.reflect.Method;
 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.members.cssclass.CssClassFacetAbstract;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 
-public class CssClassFacetMethod extends CssClassFacetAbstract {
+public class CssClassFacetMethod extends FacetAbstract implements CssClassFacet {
+
+    public static Class<? extends Facet> type() {
+        return CssClassFacet.class;
+    }
 
     private final Method method;
 
+
     public CssClassFacetMethod(final Method method, final FacetHolder holder) {
-        super(null, holder);
+        super(type(), holder, Derivation.NOT_DERIVED);
         this.method = method;
     }
 
     @Override
-    public String value() {
-        throw new UnsupportedOperationException("This method shouldn't be called. Call #value(ObjectAdapter) instead.");
-    }
-
-//    @Override
-    public String value(final ObjectAdapter owningAdapter) {
+    public String cssClass(final ObjectAdapter owningAdapter) {
+        if(owningAdapter == null) {
+            return "";
+        }
         try {
             return (String) ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
         } catch (final RuntimeException ex) {

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index 0fbe337..7c6f327 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -473,7 +473,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
         CssClassFacet cssClassFacet = action.getFacet(CssClassFacet.class);
         if(cssClassFacet != null && !cssClassFacet.isNoop()) {
             CssClassFacetRepr cssClassFacetRepr = new CssClassFacetRepr();
-            cssClassFacetRepr.value = cssClassFacet.value();
+            cssClassFacetRepr.value = cssClassFacet.cssClass(null);
             actionRepr.cssClass = cssClassFacetRepr;
         }
         DescribedAsFacet describedAsFacet = action.getFacet(DescribedAsFacet.class);
@@ -508,7 +508,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
         CssClassFacet cssClassFacet = assoc.getFacet(CssClassFacet.class);
         if(cssClassFacet != null && !cssClassFacet.isNoop()) {
             CssClassFacetRepr cssClassFacetRepr = new CssClassFacetRepr();
-            cssClassFacetRepr.value = cssClassFacet.value();
+            cssClassFacetRepr.value = cssClassFacet.cssClass(null);
             memberRepr.cssClass = cssClassFacetRepr;
         }
         DescribedAsFacet describedAsFacet = assoc.getFacet(DescribedAsFacet.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 051f430..5c47558 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -37,7 +37,6 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.object.parented.ParentedFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
@@ -162,14 +161,6 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
     String getHelp();
 
     /**
-     * Returns a css class name of the specification.
-     *
-     * <p>
-     * Corresponds to the {@link org.apache.isis.applib.annotation.CssClass#value()) value} of {@link CssClassFacet};
-     */
-    String getCssClass();
-
-    /**
      * Returns the title string for the specified object.
      * 
      * <p>
@@ -203,7 +194,7 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
      * Returns the CSS class name to use for the specified object.
      *
      * <p>
-     * Corresponds to the {@link org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet#value()} value}
+     * Corresponds to the {@link org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet#cssClass(org.apache.isis.core.metamodel.adapter.ObjectAdapter)} value}
      * returned by the {@link org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet}.
      */
     String getCssClass(ObjectAdapter object);

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index ad7bc2a..3ec0bdf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -40,7 +40,6 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetFilters;
-import org.apache.isis.core.metamodel.facets.SingleStringValueFacet;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
@@ -257,7 +256,8 @@ public interface ObjectAction extends ObjectMember {
         }
 
         public static String cssClassFaFor(final ObjectAction action) {
-            return facetValueIfAnyFor(action, CssClassFaFacet.class);
+            final CssClassFaFacet cssClassFaFacet = action.getFacet(CssClassFaFacet.class);
+            return cssClassFaFacet != null ? cssClassFaFacet.value() : null;
         }
 
         public static ActionLayout.CssClassFaPosition cssClassFaPositionFor(final ObjectAction action) {
@@ -265,13 +265,9 @@ public interface ObjectAction extends ObjectMember {
             return facet != null ? facet.getPosition() : ActionLayout.CssClassFaPosition.LEFT;
         }
 
-        public static String cssClassFor(final ObjectAction action) {
-            return facetValueIfAnyFor(action, CssClassFacet.class);
-        }
-
-        private static String facetValueIfAnyFor(ObjectAction action, Class<? extends SingleStringValueFacet> facetType) {
-            final SingleStringValueFacet singleStringValueFacet = action.getFacet(facetType);
-            return singleStringValueFacet != null ? singleStringValueFacet.value() : null;
+        public static String cssClassFor(final ObjectAction action, final ObjectAdapter objectAdapter) {
+            final CssClassFacet cssClassFacet = action.getFacet(CssClassFacet.class);
+            return cssClassFacet != null ? cssClassFacet.cssClass(objectAdapter) : null;
         }
 
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 1e317e8..a216496 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -55,7 +55,6 @@ import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethod;
 import org.apache.isis.core.metamodel.facets.object.parented.ParentedFacet;
 import org.apache.isis.core.metamodel.facets.object.dirty.ClearDirtyObjectFacet;
 import org.apache.isis.core.metamodel.facets.object.dirty.IsDirtyObjectFacet;
@@ -158,7 +157,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     private TitleFacet titleFacet;
     private IconFacet iconFacet;
-    private CssClassFacetMethod cssClassFacetMethod;
+    private CssClassFacet cssClassFacet;
 
     private IntrospectionState introspected = IntrospectionState.NOT_INTROSPECTED;
 
@@ -362,10 +361,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
         titleFacet = getFacet(TitleFacet.class);
         iconFacet = getFacet(IconFacet.class);
-        CssClassFacet cssClassFacet = getFacet(CssClassFacet.class);
-        if (cssClassFacet instanceof CssClassFacetMethod) {
-            cssClassFacetMethod = (CssClassFacetMethod) cssClassFacet;
-        }
+        cssClassFacet = getFacet(CssClassFacet.class);
 
         this.persistability = determinePersistability();
     }
@@ -422,7 +418,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     @Override
     public String getCssClass(final ObjectAdapter reference) {
-        return cssClassFacetMethod == null ? null : cssClassFacetMethod.value(reference);
+        return cssClassFacet == null ? null : cssClassFacet.cssClass(reference);
     }
 
     // //////////////////////////////////////////////////////////////////////
@@ -522,12 +518,6 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
     @Override
-    public String getCssClass() {
-        final CssClassFacet cssClassFacet = getFacet(CssClassFacet.class);
-        return cssClassFacet == null ? null : cssClassFacet.value();
-    }
-
-    @Override
     public Persistability persistability() {
         return persistability;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassAnnotationOnMemberFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassAnnotationOnMemberFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassAnnotationOnMemberFacetFactoryTest.java
index a0ebfbe..96b0f79 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassAnnotationOnMemberFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassAnnotationOnMemberFacetFactoryTest.java
@@ -54,6 +54,6 @@ public class CssClassAnnotationOnMemberFacetFactoryTest extends AbstractFacetFac
         assertThat(facet, is(not(nullValue())));
         assertThat(facet instanceof CssClassFacetAbstract, is(true));
         final CssClassFacetAbstract cssClassFacetAbstract = (CssClassFacetAbstract) facet;
-        assertThat(cssClassFacetAbstract.value(), equalTo("user"));
+        assertThat(cssClassFacetAbstract.cssClass(null), equalTo("user"));
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
index f667d13..8bd39a1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
@@ -55,6 +55,6 @@ public class CssClassFacetOnTypeAnnotationFactoryTest extends AbstractFacetFacto
         assertThat(facet, is(not(nullValue())));
         assertThat(facet, is(instanceOf(CssClassFacetAbstract.class)));
         final CssClassFacetAbstract cssClassFacetAbstract = (CssClassFacetAbstract) facet;
-        assertThat(cssClassFacetAbstract.value(), equalTo("testClass"));
+        assertThat(cssClassFacetAbstract.cssClass(null), equalTo("testClass"));
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index d2d4816..1f8a791 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -265,17 +265,12 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
-    public String getCssClass() {
-        return null;
-    }
-
-    @Override
     public String getTitle(final ObjectAdapter targetAdapter, final Localization localization) {
         return getTitle(null, targetAdapter, localization);
     }
 
     @Override
-    public String getTitle(ObjectAdapter contextAdapterIfAny, ObjectAdapter targetAdapter, Localization localization) {
+    public String getTitle(final ObjectAdapter contextAdapterIfAny, ObjectAdapter targetAdapter, final Localization localization) {
         return title;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
index 7d7ab90..5fd005e 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
@@ -151,6 +151,9 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
     public String iconName() {
         return !isComplete() ? "todo" : "done";
     }
+
+    public String cssClass() { return iconName(); }
+
     //endregion
 
     //region > description (property)

http://git-wip-us.apache.org/repos/asf/isis/blob/21065af2/example/application/todoapp/webapp/src/main/webapp/css/application.css
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/webapp/css/application.css b/example/application/todoapp/webapp/src/main/webapp/css/application.css
index 400c158..51d9500 100644
--- a/example/application/todoapp/webapp/src/main/webapp/css/application.css
+++ b/example/application/todoapp/webapp/src/main/webapp/css/application.css
@@ -22,3 +22,10 @@
     color: red;
 }
 
+tr.todo {
+}
+
+tr.done {
+    text-decoration: line-through;
+    color: #d3d3d3;
+}