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 2014/05/23 20:18:35 UTC

[1/2] git commit: ISIS-777: computing of object actions/associations should now be thread-safe

Repository: isis
Updated Branches:
  refs/heads/master 75059c44a -> bf63ac195


ISIS-777: computing of object actions/associations should now be thread-safe


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

Branch: refs/heads/master
Commit: d5cf401fe9547b464a11bf7919612a0b96512cfe
Parents: 75059c4
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri May 23 19:16:28 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri May 23 19:16:28 2014 +0100

----------------------------------------------------------------------
 .../metamodel/spec/feature/ObjectAction.java    |  84 ++++++++++--
 .../spec/feature/ObjectAssociation.java         |  91 ++++++++++++-
 .../specimpl/ObjectSpecificationAbstract.java   | 128 ++++++++++---------
 .../dflt/ObjectSpecificationDefault.java        |   2 +-
 4 files changed, 233 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d5cf401f/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 9c05b51..881ef75 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
@@ -20,9 +20,8 @@
 package org.apache.isis.core.metamodel.spec.feature;
 
 import java.util.List;
-
+import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
-
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.When;
@@ -205,6 +204,47 @@ public interface ObjectAction extends ObjectMember {
 
 
     // //////////////////////////////////////////////////////
+    // Predicates
+    // //////////////////////////////////////////////////////
+
+    public static final class Predicates {
+
+        private Predicates(){}
+
+        public static final Predicate<ObjectAction> VISIBLE_AT_LEAST_SOMETIMES =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.VISIBLE_AT_LEAST_SOMETIMES);
+
+        public static Predicate<ObjectAction> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.dynamicallyVisible(session, target, where));
+        }
+
+        public static Predicate<ObjectAction> withId(final String actionId) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.withId(actionId));
+        }
+
+        public static Predicate<ObjectAction> withNoValidationRules() {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.withNoValidationRules());
+        }
+
+        public static Predicate<ObjectAction> ofType(final ActionType type) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.ofType(type));
+        }
+
+        public static Predicate<ObjectAction> bulk() {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.bulk());
+        }
+
+        public static Predicate<ObjectAction> notBulkOnly() {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.notBulkOnly());
+        }
+
+        public static Predicate<ObjectAction> memberOrderOf(ObjectAssociation association) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.memberOrderOf(association));
+        }
+    }
+
+
+    // //////////////////////////////////////////////////////
     // Filters
     // //////////////////////////////////////////////////////
 
@@ -212,8 +252,11 @@ public interface ObjectAction extends ObjectMember {
     public static final class Filters {
         
         private Filters(){}
-        
-        @SuppressWarnings("deprecation")
+
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static final Filter<ObjectAction> VISIBLE_AT_LEAST_SOMETIMES = new Filter<ObjectAction>() {
             @Override
             public boolean accept(final ObjectAction action) {
@@ -222,7 +265,10 @@ public interface ObjectAction extends ObjectMember {
             }
         };
 
-        @SuppressWarnings("deprecation")
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAction> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
             return new Filter<ObjectAction>() {
                 @Override
@@ -233,7 +279,10 @@ public interface ObjectAction extends ObjectMember {
             };
         }
 
-        @SuppressWarnings("deprecation")
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAction> withId(final String actionId) {
             return new Filter<ObjectAction>(){
                 @Override
@@ -243,7 +292,10 @@ public interface ObjectAction extends ObjectMember {
             };
         }
 
-        @SuppressWarnings("deprecation")
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAction> withNoValidationRules() {
             return new Filter<ObjectAction>(){
                 @Override
@@ -253,7 +305,10 @@ public interface ObjectAction extends ObjectMember {
                 }};
         }
 
-        @SuppressWarnings("deprecation")
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAction> ofType(final ActionType type) {
             return new Filter<ObjectAction>(){
                 @Override
@@ -263,7 +318,10 @@ public interface ObjectAction extends ObjectMember {
             };
         }
 
-        @SuppressWarnings("deprecation")
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAction> bulk() {
             return new Filter<ObjectAction>(){
 
@@ -288,8 +346,11 @@ public interface ObjectAction extends ObjectMember {
                     return true;
                 }};
         }
-        
-        @SuppressWarnings("deprecation")
+
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAction> notBulkOnly() {
             return new Filter<ObjectAction>(){
 
@@ -321,6 +382,5 @@ public interface ObjectAction extends ObjectMember {
                 }
             };
         }
-
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d5cf401f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
index 8790990..39c80a5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
@@ -145,6 +145,62 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
                 }
             };
         }
+
+        /**
+         * Only fields that are for properties (ie 1:1 associations)
+         */
+        public final static Predicate<ObjectAssociation> PROPERTIES =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.PROPERTIES);
+
+        /**
+         * Only fields that are for reference properties (ie 1:1 associations)
+         */
+        public final static Predicate<ObjectAssociation> REFERENCE_PROPERTIES =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.REFERENCE_PROPERTIES);
+
+        /**
+         * Only fields that are for properties (ie 1:1 associations)
+         */
+        public final static Predicate<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.WHERE_VISIBLE_IN_COLLECTION_TABLE);
+
+        /**
+         * Only fields that are for properties (ie 1:1 associations)
+         */
+        public final static Predicate<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.WHERE_VISIBLE_IN_STANDALONE_TABLE);
+
+        /**
+         * All fields (that is, excludes out nothing).
+         */
+        public final static Predicate<ObjectAssociation> ALL =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.ALL);
+
+        /**
+         * Only fields that are for collections (ie 1:m associations)
+         */
+        public final static Predicate<ObjectAssociation> COLLECTIONS =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.COLLECTIONS);
+
+        /**
+         * Only properties that are visible statically, ie have not been
+         * unconditionally hidden at compile time.
+         */
+        public static final Predicate<ObjectAssociation> VISIBLE_AT_LEAST_SOMETIMES =
+                org.apache.isis.applib.filter.Filters.asPredicate(Filters.VISIBLE_AT_LEAST_SOMETIMES);
+
+        public static final Predicate<ObjectAssociation> staticallyVisible(final Where context) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.staticallyVisible(context));
+        }
+
+        public static final Predicate<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.dynamicallyVisible(session, target, where));
+        }
+
+        public static final Predicate<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.enabled(session, adapter, where));
+        }
+
     }
     
     // //////////////////////////////////////////////////////
@@ -158,7 +214,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
 
         /**
          * Filters only fields that are for properties (ie 1:1 associations)
+         *
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
+        @Deprecated
         public final static Filter<ObjectAssociation> PROPERTIES = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation association) {
@@ -168,7 +227,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
 
         /**
          * Filters only fields that are for reference properties (ie 1:1 associations)
+         *
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
+        @Deprecated
         public final static Filter<ObjectAssociation> REFERENCE_PROPERTIES = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation association) {
@@ -179,7 +241,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
         
         /**
          * Filters only fields that are for properties (ie 1:1 associations)
+         *
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
+        @Deprecated
         public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation association) {
@@ -190,7 +255,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
 
         /**
          * Filters only fields that are for properties (ie 1:1 associations)
+         *
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
+        @Deprecated
         public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation association) {
@@ -201,7 +269,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
 
         /**
          * Returns all fields (that is, filters out nothing).
+         *
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
+        @Deprecated
         public final static Filter<ObjectAssociation> ALL = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation property) {
@@ -211,7 +282,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
 
         /**
          * Filters only fields that are for collections (ie 1:m associations)
+         *
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
+        @Deprecated
         public final static Filter<ObjectAssociation> COLLECTIONS = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation property) {
@@ -222,7 +296,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
         /**
          * Filters only properties that are visible statically, ie have not been
          * unconditionally hidden at compile time.
+         *
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
+        @Deprecated
         public static final Filter<ObjectAssociation> VISIBLE_AT_LEAST_SOMETIMES = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation property) {
@@ -231,6 +308,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
             }
         };
 
+        /**
+        * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+        */
+        @Deprecated
         public static final Filter<ObjectAssociation> staticallyVisible(final Where context) {
             return new Filter<ObjectAssociation>() {
                 @Override
@@ -244,7 +325,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
             };
         }
 
-        
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
             return new Filter<ObjectAssociation>() {
                 @Override
@@ -255,7 +339,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
             };
         }
 
-
+        /**
+         * @deprecated -use {@link com.google.common.base.Predicate equivalent}
+         */
+        @Deprecated
         public static Filter<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
             return new Filter<ObjectAssociation>() {
                 @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d5cf401f/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 f05813d..64e8ccb 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
@@ -19,15 +19,12 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
+import java.util.*;
 import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.Identifier;
@@ -125,10 +122,21 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     private final List<ObjectAssociation> associations = Lists.newArrayList();
     private final List<ObjectAction> objectActions = Lists.newArrayList();
-    
+    // partitions and caches objectActions by type; updated in sortCacheAndUpdateActions()
+    private final Map<ActionType, List<ObjectAction>> objectActionsByType = createObjectActionsByType();
+
+    private static Map<ActionType, List<ObjectAction>> createObjectActionsByType() {
+        final Map<ActionType, List<ObjectAction>> map = Maps.newHashMap();
+        for (final ActionType type : ActionType.values()) {
+            map.put(type, Lists.<ObjectAction>newArrayList());
+        }
+        return map;
+    }
+
     private boolean contributeeAssociationsAdded;
     private boolean contributeeActionsAdded;
-    
+
+
     private final List<ObjectSpecification> interfaces = Lists.newArrayList();
     private final SubclassList subclasses = new SubclassList();
 
@@ -210,7 +218,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     
     /**
      * As provided explicitly within the
-     * {@link #IntrospectableSpecificationAbstract(Class, String, SpecificationContext)
+     * {@link #ObjectSpecificationAbstract(Class, String, org.apache.isis.core.metamodel.spec.SpecificationContext, org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext)}
      * constructor}.
      * 
      * <p>
@@ -222,11 +230,6 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return correspondingClass;
     }
 
-    /**
-     * As provided explicitly within the
-     * {@link #IntrospectableSpecificationAbstract(Class, String, SpecificationContext)
-     * constructor}.
-     */
     @Override
     public String getShortIdentifier() {
         return shortName;
@@ -249,8 +252,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
     /**
-     * Only if {@link #setIntrospected(boolean)} has been called (should be
-     * called within {@link #updateFromFacetValues()}.
+     * Only if {@link #setIntrospectionState(org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract.IntrospectionState)}
+     * has been called (should be called within {@link #updateFromFacetValues()}.
      */
     public IntrospectionState getIntrospectionState() {
         return introspected;
@@ -327,14 +330,24 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     protected void sortAndUpdateAssociations(final List<ObjectAssociation> associations) {
         final List<ObjectAssociation> orderedAssociations = sortAssociations(associations);
-        this.associations.clear();
-        this.associations.addAll(orderedAssociations);
+        synchronized (this.associations) {
+            this.associations.clear();
+            this.associations.addAll(orderedAssociations);
+        }
     }
 
-    protected void sortAndUpdateActions(final List<ObjectAction> objectActions) {
+    protected void sortCacheAndUpdateActions(final List<ObjectAction> objectActions) {
         final List<ObjectAction> orderedActions = sortActions(objectActions);
-        this.objectActions.clear();
-        this.objectActions.addAll(orderedActions);
+        synchronized (this.objectActions){
+            this.objectActions.clear();
+            this.objectActions.addAll(orderedActions);
+
+            for (final ActionType type : ActionType.values()) {
+                final List<ObjectAction> objectActionForType = objectActionsByType.get(type);
+                objectActionForType.clear();
+                objectActionForType.addAll(Collections2.filter(objectActions, ObjectAction.Predicates.ofType(type)));
+            }
+        }
     }
 
     // //////////////////////////////////////////////////////////////////////
@@ -458,8 +471,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     // //////////////////////////////////////////////////////////////////////
 
     /**
-     * Expect to be populated using {@link #setSingularName(String)}, but has
-     * default name as well.
+     * The name according to any available {@link org.apache.isis.core.metamodel.facets.named.NamedFacet},
+     * but falling back to {@link #getFullIdentifier()} otherwise.
      */
     @Override
     public String getSingularName() {
@@ -468,8 +481,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
     /**
-     * Expect to be populated using {@link #setPluralName(String)} but has
-     * default name as well.
+     * The pluralized name according to any available {@link org.apache.isis.core.metamodel.facets.object.plural.PluralFacet},
+     * else <tt>null</tt>.
      */
     @Override
     public String getPluralName() {
@@ -478,8 +491,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
     /**
-     * Expect to be populated using {@link #setDescribedAs(String)} but has
-     * default name as well.
+     * The description according to any available {@link org.apache.isis.core.metamodel.facets.object.plural.PluralFacet},
+     * else empty string (<tt>""</tt>).
      */
     @Override
     public String getDescription() {
@@ -641,17 +654,20 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     // //////////////////////////////////////////////////////////////////////
 
     @Override
-    public List<ObjectAssociation> getAssociations(final Contributed contributee) {
-        if(contributee.isIncluded() && !contributeeAssociationsAdded) {
-            List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
-            final List<ObjectAssociation> contributeeAssociations = createContributeeAssociations();
-            associations.addAll(contributeeAssociations);
-            sortAndUpdateAssociations(associations);
-            contributeeAssociationsAdded = true;
+    public List<ObjectAssociation> getAssociations(final Contributed contributed) {
+        // the "contributed.isIncluded()" guard is required because we cannot do this too early;
+        // there must be a session available
+        if(contributed.isIncluded() && !contributeeAssociationsAdded) {
+            synchronized (this.associations) {
+                List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
+                associations.addAll(createContributeeAssociations());
+                sortAndUpdateAssociations(associations);
+                contributeeAssociationsAdded = true;
+            }
         }
         final List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
         return Lists.newArrayList(Iterables.filter(
-                associations, ContributeeMember.Predicates.regularElse(contributee)));
+                associations, ContributeeMember.Predicates.regularElse(contributed)));
     }
 
 
@@ -750,34 +766,32 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             final List<ActionType> types,
             final Contributed contributed, 
             final Filter<ObjectAction> filter) {
+
+        // update our list of actions if requesting for contributed actions
+        // and they have not yet been added
+        // the "contributed.isIncluded()" guard is required because we cannot do this too early;
+        // there must be a session available
         if(contributed.isIncluded() && !contributeeActionsAdded) {
-            final List<ObjectAction> actions = Lists.newArrayList(this.objectActions);
-            actions.addAll(createContributeeActions());
-            sortAndUpdateActions(actions);
-            contributeeActionsAdded = true;
+            synchronized (this.objectActions) {
+                final List<ObjectAction> actions = Lists.newArrayList(this.objectActions);
+                actions.addAll(createContributeeActions());
+                sortCacheAndUpdateActions(actions);
+                contributeeActionsAdded = true;
+            }
         }
-        
+
         final List<ObjectAction> actions = Lists.newArrayList();
         for (final ActionType type : types) {
-            final Predicate<ObjectAction> predicate =
-                    Filters.asPredicate(Filters.and(
-                        ObjectAction.Filters.ofType(type),
-                        filter));
-            for (ObjectAction objectAction : objectActions) {
-                if(predicate.apply(objectAction)) {
-                    actions.add(objectAction);
-                }
-            }
-            // an NPE here somehow???
-//            @SuppressWarnings("unchecked")
-//            final Collection<ObjectAction> filterActions =
-//                    Collections2.filter(objectActions, predicate);
-//            actions.addAll(filterActions);
+            final Collection<ObjectAction> filterActions =
+                    Collections2.filter(objectActionsByType.get(type), Filters.asPredicate(filter));
+            actions.addAll(filterActions);
         }
-        return Lists.newArrayList(Iterables.filter(
-                actions, ContributeeMember.Predicates.regularElse(contributed)));
+        return Lists.newArrayList(
+                Iterables.filter(
+                        actions,
+                        ContributeeMember.Predicates.regularElse(contributed)));
     }
-    
+
     @Override
     public List<ObjectAction> getObjectActions(
             final Contributed contributed) {
@@ -1045,7 +1059,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     
 
     /**
-     * @param the number of the parameter that matches, or -1 if none.
+     * @param serviceAction - number of the parameter that matches, or -1 if none.
      */
     private int contributeeParameterMatchOf(final ObjectAction serviceAction) {
         final List<ObjectActionParameter> params = serviceAction.getParameters();

http://git-wip-us.apache.org/repos/asf/isis/blob/d5cf401f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 3db9b93..77a4c55 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -167,7 +167,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
         if(isNotIntrospected()) {
             final List<ObjectAction> actions = createActions(metadataProperties);
-            sortAndUpdateActions(actions);
+            sortCacheAndUpdateActions(actions);
         }
 
         if(isNotIntrospected()) {


[2/2] git commit: ISIS-776: FixtureScripts#findFixtureScriptFor

Posted by da...@apache.org.
ISIS-776: FixtureScripts#findFixtureScriptFor

... moved up from todo app, also overloaded to search by fixture class name (instead of its qualifed name)


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

Branch: refs/heads/master
Commit: bf63ac195ec81a8217611f4ee93687e750775d56
Parents: d5cf401
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri May 23 19:18:28 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri May 23 19:18:28 2014 +0100

----------------------------------------------------------------------
 .../applib/fixturescripts/FixtureResult.java     |  2 ++
 .../applib/fixturescripts/FixtureScripts.java    | 19 +++++++++++++++++++
 .../fixture/todo/ToDoItemsFixturesService.java   | 16 +++-------------
 3 files changed, 24 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bf63ac19/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java
index 095327f..647a114 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java
@@ -20,8 +20,10 @@ package org.apache.isis.applib.fixturescripts;
 
 import org.apache.isis.applib.AbstractViewModel;
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Paged;
 import org.apache.isis.applib.annotation.Title;
 
+@Paged(500)
 public class FixtureResult extends AbstractViewModel {
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/bf63ac19/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index fd00004..acb4d7c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -182,6 +182,25 @@ public abstract class FixtureScripts extends AbstractService {
         return fixtureScript.validateRun(parameters);
     }
 
+    protected FixtureScript findFixtureScriptFor(String qualifiedName) {
+        List<FixtureScript> fixtureScripts = fixtureScriptList;
+        for (FixtureScript fs : fixtureScripts) {
+            if(fs.getQualifiedName().contains(qualifiedName)) {
+                return fs;
+            }
+        }
+        return null;
+    }
+    protected FixtureScript findFixtureScriptFor(Class<? extends FixtureScript> fixtureScriptClass) {
+        List<FixtureScript> fixtureScripts = fixtureScriptList;
+        for (FixtureScript fs : fixtureScripts) {
+            if(fixtureScriptClass.isAssignableFrom(fs.getClass())) {
+                return fs;
+            }
+        }
+        return null;
+    }
+
 
     // //////////////////////////////////////
 

http://git-wip-us.apache.org/repos/asf/isis/blob/bf63ac19/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
index 5b5722b..914eee8 100644
--- a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
+++ b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
@@ -18,6 +18,8 @@
  */
 package fixture.todo;
 
+import fixture.todo.scenarios.RecreateToDoItemsAndCompleteSeveralForCurrent;
+
 import java.util.List;
 
 import org.apache.isis.applib.annotation.MemberOrder;
@@ -49,18 +51,6 @@ public class ToDoItemsFixturesService extends FixtureScripts {
     @Prototype
     @MemberOrder(sequence="20")
     public List<FixtureResult> recreateToDoItemsForCurrent() {
-        return findFixtureScriptFor("recreate-current").run(null);
-    }
-    public String disableRecreateToDoItemsForCurrent() {
-        return findFixtureScriptFor("recreate-current") == null? "Could not find fixture script 'recreate-current'": null;
-    }
-    private FixtureScript findFixtureScriptFor(String qualifiedName) {
-        List<FixtureScript> fixtureScripts = choices0RunFixtureScript();
-        for (FixtureScript fs : fixtureScripts) {
-            if(fs.getQualifiedName().contains(qualifiedName)) {
-                return fs;
-            }
-        }
-        return null;
+        return findFixtureScriptFor(RecreateToDoItemsAndCompleteSeveralForCurrent.class).run(null);
     }
 }