You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by mg...@apache.org on 2015/01/05 21:49:16 UTC

isis git commit: ISIS-1000 Add a new Facet for DomainObject#cssClass() method

Repository: isis
Updated Branches:
  refs/heads/ISIS-1000-CssClassFacetMethod [created] c5c03a952


ISIS-1000 Add a new Facet for DomainObject#cssClass() method

For now the css class is used only for data table rows


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

Branch: refs/heads/ISIS-1000-CssClassFacetMethod
Commit: c5c03a952432f375f6c808d249096129650d80dc
Parents: c53d299
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Jan 5 22:48:09 2015 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Jan 5 22:48:09 2015 +0200

----------------------------------------------------------------------
 .../wicket/model/models/ModelAbstract.java      |  4 +-
 .../ajaxtable/IsisAjaxFallbackDataTable.java    | 21 ++++++--
 .../cssclass/method/CssClassFacetMethod.java    | 50 +++++++++++++++++++
 .../method/CssClassFacetMethodFactory.java      | 52 ++++++++++++++++++++
 .../metamodel/spec/ObjectSpecification.java     |  9 ++++
 .../specimpl/ObjectSpecificationAbstract.java   | 11 +++++
 .../dflt/ProgrammingModelFacetsJava5.java       |  2 +
 .../testspec/ObjectSpecificationStub.java       |  5 ++
 8 files changed, 148 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
index 00c4512..ce17a7c 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.viewer.wicket.model.models;
 
-import java.util.List;
 import java.util.Map;
 import com.google.common.collect.Maps;
 import org.apache.wicket.Component;
@@ -27,7 +26,6 @@ import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.util.string.Strings;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
@@ -128,4 +126,4 @@ public abstract class ModelAbstract<T> extends LoadableDetachableModel<T> implem
         return getPersistenceSession().getAdapterManager();
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/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 84eabb0..509eb6a 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
@@ -28,12 +28,14 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.NoRecordsToolbar;
+import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.repeater.IItemFactory;
 import org.apache.wicket.markup.repeater.IItemReuseStrategy;
 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.viewer.wicket.model.hints.IsisUiHintEvent;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant;
@@ -66,7 +68,7 @@ public class IsisAjaxFallbackDataTable<T, S> extends DataTable<T, S> implements
     }
     
     private void buildGui() {
-        headersToolbar = new IsisAjaxFallbackHeadersToolbar<S>(this, this.dataProvider);
+        headersToolbar = new IsisAjaxFallbackHeadersToolbar<>(this, this.dataProvider);
         addTopToolbar(headersToolbar);
         addBottomToolbar(new IsisAjaxNavigationToolbar(this));
         addBottomToolbar(new NoRecordsToolbar(this));
@@ -75,7 +77,20 @@ public class IsisAjaxFallbackDataTable<T, S> extends DataTable<T, S> implements
     @Override
     protected Item<T> newRowItem(final String id, final int index, final IModel<T> model)
     {
-        return new OddEvenItem<T>(id, index, model);
+        return new OddEvenItem<T>(id, index, model) {
+            @Override
+            protected void onComponentTag(ComponentTag tag) {
+                super.onComponentTag(tag);
+
+                if (model instanceof EntityModel) {
+                    EntityModel entityModel = (EntityModel) model;
+                    String cssClass = entityModel.getTypeOfSpecification().getCssClass(entityModel.getObject());
+                    if (!Strings.isEmpty(cssClass)) {
+                        tag.append("class", cssClass, " ");
+                    }
+                }
+            }
+        };
     }
 
     static class PreserveModelReuseStrategy implements IItemReuseStrategy {
@@ -193,4 +208,4 @@ public class IsisAjaxFallbackDataTable<T, S> extends DataTable<T, S> implements
         return UiHintContainer.Util.hintContainerOf(this, EntityModel.class);
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/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
new file mode 100644
index 0000000..67899df
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
@@ -0,0 +1,50 @@
+/*
+ *  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.cssclass.method;
+
+import java.lang.reflect.Method;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
+
+public class CssClassFacetMethod extends CssClassFacetAbstract {
+
+    private final Method method;
+
+    public CssClassFacetMethod(final Method method, final FacetHolder holder) {
+        super(null, holder);
+        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) {
+        try {
+            return (String) ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
+        } catch (final RuntimeException ex) {
+            return null;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
new file mode 100644
index 0000000..b34bd30
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
@@ -0,0 +1,52 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.object.cssclass.method;
+
+import java.lang.reflect.Method;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+
+public class CssClassFacetMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
+
+    private static final String CSS_CLASS_PREFIX = "cssClass";
+
+    private static final String[] PREFIXES = { CSS_CLASS_PREFIX, };
+
+    public CssClassFacetMethodFactory() {
+        super(FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+        final Class<?> cls = processClassContext.getCls();
+        final FacetHolder facetHolder = processClassContext.getFacetHolder();
+
+        final Method method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, CSS_CLASS_PREFIX, String.class, NO_PARAMETERS_TYPES);
+        if (method == null) {
+            return;
+        }
+        processClassContext.removeMethod(method);
+        FacetUtil.addFacet(new CssClassFacetMethod(method, facetHolder));
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/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 cc3f63e..051f430 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
@@ -199,6 +199,15 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
      */
     String getIconName(ObjectAdapter object);
 
+    /**
+     * 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}
+     * returned by the {@link org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet}.
+     */
+    String getCssClass(ObjectAdapter object);
+
     boolean isAbstract();
 
     // //////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/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 f582bf8..1e317e8 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,6 +55,7 @@ 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;
@@ -157,6 +158,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     private TitleFacet titleFacet;
     private IconFacet iconFacet;
+    private CssClassFacetMethod cssClassFacetMethod;
 
     private IntrospectionState introspected = IntrospectionState.NOT_INTROSPECTED;
 
@@ -360,6 +362,10 @@ 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;
+        }
 
         this.persistability = determinePersistability();
     }
@@ -414,6 +420,11 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return iconFacet == null ? null : iconFacet.iconName(reference);
     }
 
+    @Override
+    public String getCssClass(final ObjectAdapter reference) {
+        return cssClassFacetMethod == null ? null : cssClassFacetMethod.value(reference);
+    }
+
     // //////////////////////////////////////////////////////////////////////
     // Specification
     // //////////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/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 6027aeb..febdc24 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
@@ -87,6 +87,7 @@ import org.apache.isis.core.metamodel.facets.object.choices.boundedannot.Choices
 import org.apache.isis.core.metamodel.facets.object.choices.boundedmarkerifc.ChoicesFacetFromBoundedMarkerInterfaceFactory;
 import org.apache.isis.core.metamodel.facets.object.choices.enums.EnumFacetUsingValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.object.cssclass.annotation.CssClassFacetOnTypeAnnotationFactory;
+import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethodFactory;
 import org.apache.isis.core.metamodel.facets.object.cssclassfa.annotation.annotation.CssClassFaFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.defaults.annotcfg.DefaultedFacetAnnotationElseConfigurationFactory;
 import org.apache.isis.core.metamodel.facets.object.describedas.annotation.DescribedAsFacetOnTypeAnnotationFactory;
@@ -319,6 +320,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         // objects
         addFactory(ObjectFacetSpecIdAnnotationFactory.class);
         addFactory(IconFacetMethodFactory.class);
+        addFactory(CssClassFacetMethodFactory.class);
 
         addFactory(CreatedCallbackFacetFactory.class);
         addFactory(LoadCallbackFacetFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/c5c03a95/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 38f7b58..d2d4816 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
@@ -210,6 +210,11 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
+    public String getCssClass(final ObjectAdapter reference) {
+        return null;
+    }
+
+    @Override
     public ObjectAction getObjectAction(final ActionType type, final String name, final List<ObjectSpecification> parameters) {
         if (action != null && action.getId().equals(name)) {
             return action;