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/11/13 18:57:21 UTC

[10/11] isis git commit: ISIS-1252: adding support for CssClassUiEvent. Also adding in concept of Noop events to suppress (and making these the default); also...

ISIS-1252: adding support for CssClassUiEvent.  Also adding in concept of Noop events to suppress (and making these the default); also...

... some cosmetic UI changes for the downloadXml and downloadXsd mixin actions.


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

Branch: refs/heads/master
Commit: 99c55b8c343f77baa796c59128d89c6fdd1f0d78
Parents: d556d51
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Nov 13 17:56:05 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Nov 13 17:56:05 2015 +0000

----------------------------------------------------------------------
 .../applib/annotation/DomainObjectLayout.java   |  16 +--
 .../services/eventbus/CssClassFaUiEvent.java    | 108 -------------------
 .../services/eventbus/CssClassUiEvent.java      |  15 ++-
 .../applib/services/eventbus/IconUiEvent.java   |  15 ++-
 .../applib/services/eventbus/TitleUiEvent.java  |  15 ++-
 .../applib/services/jaxb/Dto_downloadXml.java   |   8 +-
 .../applib/services/jaxb/Dto_downloadXsd.java   |   8 +-
 ...ectLayoutAnnotationUsingCssClassUiEvent.java |  99 +++++++++++++++++
 .../DomainObjectLayoutFacetFactory.java         |   3 +
 ...nObjectLayoutAnnotationUsingIconUiEvent.java |  16 +--
 ...ObjectLayoutAnnotationUsingTitleUiEvent.java |   3 +
 .../dflt/ProgrammingModelFacetsJava5.java       |   1 -
 12 files changed, 165 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
index 535248d..d65dc2f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
@@ -25,7 +25,6 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import org.apache.isis.applib.services.eventbus.CssClassFaUiEvent;
 import org.apache.isis.applib.services.eventbus.CssClassUiEvent;
 import org.apache.isis.applib.services.eventbus.IconUiEvent;
 import org.apache.isis.applib.services.eventbus.TitleUiEvent;
@@ -46,7 +45,7 @@ public @interface DomainObjectLayout {
      * This subclass must provide a no-arg constructor; the fields are set reflectively.
      * </p>
      */
-    Class<? extends TitleUiEvent<?>> titleUiEvent() default TitleUiEvent.Default.class;
+    Class<? extends TitleUiEvent<?>> titleUiEvent() default TitleUiEvent.Noop.class;
 
     // //////////////////////////////////////
 
@@ -57,7 +56,7 @@ public @interface DomainObjectLayout {
      * This subclass must provide a no-arg constructor; the fields are set reflectively.
      * </p>
      */
-    Class<? extends IconUiEvent<?>> iconUiEvent() default IconUiEvent.Default.class;
+    Class<? extends IconUiEvent<?>> iconUiEvent() default IconUiEvent.Noop.class;
 
     // //////////////////////////////////////
 
@@ -68,7 +67,7 @@ public @interface DomainObjectLayout {
      * This subclass must provide a no-arg constructor; the fields are set reflectively.
      * </p>
      */
-    Class<? extends CssClassUiEvent<?>> cssClassUiEvent() default CssClassUiEvent.Default.class;
+    Class<? extends CssClassUiEvent<?>> cssClassUiEvent() default CssClassUiEvent.Noop.class;
 
     /**
      * Indicates the css class that a domain class (type) should have.
@@ -78,15 +77,6 @@ public @interface DomainObjectLayout {
     // //////////////////////////////////////
 
     /**
-     * Which subclass of {@link CssClassFaUiEvent} should be used to obtain a CSS font-awesome class and position.
-     *
-     * <p>
-     * This subclass must provide a no-arg constructor; the fields are set reflectively.
-     * </p>
-     */
-    Class<? extends CssClassFaUiEvent<?>> cssClassFaUiEvent() default CssClassFaUiEvent.Default.class;
-
-    /**
      * Indicates the <a href="http://fortawesome.github.io/Font-Awesome/">Font Awesome</a> CSS class to decorate an
      * domain object.
      */

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassFaUiEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassFaUiEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassFaUiEvent.java
deleted file mode 100644
index 54cf2b7..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassFaUiEvent.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.services.eventbus;
-
-import java.util.EventObject;
-
-import org.apache.isis.applib.annotation.DomainObjectLayout;
-
-/**
- * Emitted for subscribers to obtain a cssClassFa hint (equivalent to the {@link DomainObjectLayout#cssClassFa()} attribute), providing the CSS class for a font-awesome
- * icon for this domain object.
- */
-public abstract class CssClassFaUiEvent<S> extends AbstractUiEvent<S> {
-
-    private static final long serialVersionUID = 1L;
-
-    //region > constructors
-    /**
-     * If used then the framework will set state via (non-API) setters.
-     *
-     * <p>
-     *     Because the {@link EventObject} superclass prohibits a null source, a dummy value is temporarily used.
-     * </p>
-     */
-    public CssClassFaUiEvent() {
-        this(null);
-    }
-
-    public CssClassFaUiEvent(final S source) {
-        super(source);
-    }
-
-    //endregion
-
-    //region > Default class
-
-    /**
-     * Propagated if no custom subclass was specified using
-     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent()} annotation attribute.
-     */
-    public static class Default extends CssClassFaUiEvent<Object> {
-        private static final long serialVersionUID = 1L;
-    }
-    //endregion
-
-    //region > cssClassFa
-    private String cssClassFa;
-
-    /**
-     * The CSS class for a font-awesome icon for this domain object, as provided by a subscriber using {@link #setCssClassFa(String)}.
-     */
-    public String getCssClassFa() {
-        return cssClassFa;
-    }
-
-
-    /**
-     * For subscribers to call to provide a CSS class for a font-awesome icon for this object.
-     */
-    public void setCssClassFa(final String cssClass) {
-        this.cssClassFa = cssClass;
-    }
-    //endregion
-
-    //region > cssClassFaPosition
-    private DomainObjectLayout.CssClassFaPosition cssClassFaPosition;
-
-    /**
-     * The {@link DomainObjectLayout.CssClassFaPosition position} as provided by a subscriber using {@link #setCssClassFaPosition(org.apache.isis.applib.annotation.DomainObjectLayout.CssClassFaPosition)}.
-     *
-     * <p>
-     *     This attribute is currently ignored by Isis viewers.
-     * </p>
-     */
-    public DomainObjectLayout.CssClassFaPosition getCssClassFaPosition() {
-        return cssClassFaPosition;
-    }
-
-    /**
-     * For subscribers to call to provide the positioning of the font-awesome icon for this object.
-     *
-     * <p>
-     *     This attribute is currently ignored by Isis viewers.
-     * </p>
-     */
-    public void setCssClassFaPosition(
-            final DomainObjectLayout.CssClassFaPosition cssClassFaPosition) {
-        this.cssClassFaPosition = cssClassFaPosition;
-    }
-    //endregion
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassUiEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassUiEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassUiEvent.java
index f43c603..49c41ec 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassUiEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CssClassUiEvent.java
@@ -50,14 +50,25 @@ public abstract class CssClassUiEvent<S> extends AbstractUiEvent<S> {
     //region > Default class
 
     /**
-     * Propagated if no custom subclass was specified using
-     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent()} annotation attribute.
+     * Implementation provided as a convenience for domain objects that have no custom subclass.
      */
     public static class Default extends CssClassUiEvent<Object> {
         private static final long serialVersionUID = 1L;
     }
     //endregion
 
+    //region > Noop class
+
+    /**
+     * Marker class that is the default for
+     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#cssClassUiEvent()} annotation attribute, meaning that
+     * an event should <i>not</i> be emitted by default.
+     */
+    public static class Noop extends CssClassUiEvent<Object> {
+        private static final long serialVersionUID = 1L;
+    }
+    //endregion
+
     //region > cssClass
     private String cssClass;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/IconUiEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/IconUiEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/IconUiEvent.java
index 5924a95..2a777e2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/IconUiEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/IconUiEvent.java
@@ -48,14 +48,25 @@ public abstract class IconUiEvent<S> extends AbstractUiEvent<S> {
     //region > Default class
 
     /**
-     * Propagated if no custom subclass was specified using
-     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent()} annotation attribute.
+     * Implementation provided as a convenience for domain objects that have no custom subclass.
      */
     public static class Default extends IconUiEvent<Object> {
         private static final long serialVersionUID = 1L;
     }
     //endregion
 
+    //region > Noop class
+
+    /**
+     * Marker class that is the default for
+     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent()} annotation attribute, meaning that
+     * an event should <i>not</i> be emitted by default.
+     */
+    public static class Noop extends IconUiEvent<Object> {
+        private static final long serialVersionUID = 1L;
+    }
+    //endregion
+
     //region > iconName
     private String iconName;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/TitleUiEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/TitleUiEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/TitleUiEvent.java
index 181015d..0bb9b91 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/TitleUiEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/TitleUiEvent.java
@@ -32,14 +32,25 @@ public abstract class TitleUiEvent<S> extends AbstractUiEvent<S> {
     //region > Default class
 
     /**
-     * Propagated if no custom subclass was specified using
-     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#titleUiEvent()} annotation attribute.
+     * Implementation provided as a convenience for domain objects that have no custom subclass.
      */
     public static class Default extends TitleUiEvent<Object> {
         private static final long serialVersionUID = 1L;
     }
     //endregion
 
+    //region > Noop class
+
+    /**
+     * Marker class that is the default for
+     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#titleUiEvent()} annotation attribute, meaning that
+     * an event should <i>not</i> be emitted by default.
+     */
+    public static class Noop extends TitleUiEvent<Object> {
+        private static final long serialVersionUID = 1L;
+    }
+    //endregion
+
     //region > constructors
     /**
      * If used then the framework will set state via (non-API) setters.

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXml.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXml.java
index 91332b3..79c4006 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXml.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXml.java
@@ -25,8 +25,10 @@ import javax.xml.bind.JAXBException;
 
 import org.apache.isis.applib.FatalException;
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.value.Clob;
 
@@ -50,7 +52,11 @@ public class Dto_downloadXml {
 
     @Action(
             domainEvent = ActionDomainEvent.class,
-            semantics = SemanticsOf.SAFE
+            semantics = SemanticsOf.SAFE,
+            restrictTo = RestrictTo.PROTOTYPING
+    )
+    @ActionLayout(
+            cssClassFa = "fa-download"
     )
     @MemberOrder(sequence = "500.1")
     public Object $$(final String fileName) throws JAXBException, IOException {

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXsd.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXsd.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXsd.java
index ce10bb1..dfb4c90 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXsd.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/Dto_downloadXsd.java
@@ -30,8 +30,10 @@ import javax.inject.Inject;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.FatalException;
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
@@ -56,7 +58,11 @@ public class Dto_downloadXsd {
 
     @Action(
             domainEvent = ActionDomainEvent.class,
-            semantics = SemanticsOf.SAFE
+            semantics = SemanticsOf.SAFE,
+            restrictTo = RestrictTo.PROTOTYPING
+    )
+    @ActionLayout(
+            cssClassFa = "fa-download"
     )
     @MemberOrder(sequence = "500.2")
     public Object $$(final String fileName) {

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
new file mode 100644
index 0000000..9f21e51
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
@@ -0,0 +1,99 @@
+/*
+ *  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.domainobjectlayout;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.NonRecoverableException;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.services.eventbus.CssClassUiEvent;
+import org.apache.isis.applib.services.eventbus.EventBusService;
+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.CssClassFacet;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+public class CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent extends FacetAbstract implements
+        CssClassFacet {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.class);
+
+    public static Facet create(
+            final DomainObjectLayout domainObjectLayout,
+            final ServicesInjector servicesInjector,
+            final FacetHolder facetHolder) {
+        if(domainObjectLayout == null) {
+            return null;
+        }
+        final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass = domainObjectLayout.cssClassUiEvent();
+        if(CssClassUiEvent.Noop.class.isAssignableFrom(cssClassUiEventClass)) {
+            return null;
+        }
+
+        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+
+        return new CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
+                cssClassUiEventClass, eventBusService, facetHolder);
+    }
+
+    private final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass;
+    private final EventBusService eventBusService;
+
+    public CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
+            final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass,
+            final EventBusService eventBusService,
+            final FacetHolder holder) {
+        super(CssClassFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
+        this.cssClassUiEventClass = cssClassUiEventClass;
+        this.eventBusService = eventBusService;
+    }
+
+    @Override
+    public String cssClass(final ObjectAdapter objectAdapter) {
+
+        final CssClassUiEvent<Object> cssClassUiEvent = newCssClassUiEvent(objectAdapter);
+
+        eventBusService.post(cssClassUiEvent);
+
+        final String cssClass = cssClassUiEvent.getCssClass();
+        return cssClass; // could be null
+    }
+
+    private CssClassUiEvent<Object> newCssClassUiEvent(final ObjectAdapter owningAdapter) {
+        final Object domainObject = owningAdapter.getObject();
+        return newCssClassUiEvent(domainObject);
+    }
+
+    private CssClassUiEvent<Object> newCssClassUiEvent(final Object domainObject) {
+        try {
+            final CssClassUiEvent<Object> cssClassUiEvent = (CssClassUiEvent<Object>) cssClassUiEventClass.newInstance();
+            cssClassUiEvent.setSource(domainObject);
+            return cssClassUiEvent;
+        } catch (InstantiationException | IllegalAccessException ex) {
+            throw new NonRecoverableException(ex);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
index 7bb700e..51e952d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
@@ -48,6 +48,9 @@ public class DomainObjectLayoutFacetFactory extends FacetFactoryAbstract impleme
         FacetUtil.addFacet(
                 IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.create(
                         domainObjectLayout, servicesInjector, facetHolder));
+        FacetUtil.addFacet(
+                CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.create(
+                        domainObjectLayout, servicesInjector, facetHolder));
 
         FacetUtil.addFacet(
                 CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
index ffe01b9..4036892 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
@@ -26,13 +26,11 @@ import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.eventbus.IconUiEvent;
-import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacetAbstract;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent extends IconFacetAbstract {
 
@@ -46,31 +44,25 @@ public class IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent extends Ic
             return null;
         }
         final Class<? extends IconUiEvent<?>> iconUiEventClass = domainObjectLayout.iconUiEvent();
+        if(IconUiEvent.Noop.class.isAssignableFrom(iconUiEventClass)) {
+            return null;
+        }
 
-        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
-        final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
-        final String translationContext = facetHolderAsSpec.getCorrespondingClass().getCanonicalName();
         final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
 
         return new IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent(
-                iconUiEventClass, translationService, translationContext, eventBusService, facetHolder);
+                iconUiEventClass, eventBusService, facetHolder);
     }
 
     private final Class<? extends IconUiEvent<?>> iconUiEventClass;
-    private final TranslationService translationService;
-    private final String translationContext;
     private final EventBusService eventBusService;
 
     public IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent(
             final Class<? extends IconUiEvent<?>> iconUiEventClass,
-            final TranslationService translationService,
-            final String translationContext,
             final EventBusService eventBusService,
             final FacetHolder holder) {
         super(holder);
         this.iconUiEventClass = iconUiEventClass;
-        this.translationService = translationService;
-        this.translationContext = translationContext;
         this.eventBusService = eventBusService;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
index 55f0b0d..dd8c457 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
@@ -49,6 +49,9 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
         }
         final Class<? extends TitleUiEvent<?>> titleUiEventClass = domainObjectLayout.titleUiEvent();
 
+        if(TitleUiEvent.Noop.class.isAssignableFrom(titleUiEventClass)) {
+            return null;
+        }
         final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
         final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
         final String translationContext = facetHolderAsSpec.getCorrespondingClass().getCanonicalName();

http://git-wip-us.apache.org/repos/asf/isis/blob/99c55b8c/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
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 417297f..3ce5e46 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
@@ -399,7 +399,6 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         // must come after DomainObjectLayoutFacetFactory
         addFactory(TitleAnnotationFacetFactory.class);
         addFactory(TitleFacetViaMethodsFactory.class);
-
         addFactory(IconFacetMethodFactory.class);
         addFactory(CssClassFacetMethodFactory.class);