@Override
  public List<ObjectAction> getObjectActions(
      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) {
      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 Collection<ObjectAction> filterActions =
          Collections2.filter(objectActionsByType.get(type), Filters.asPredicate(filter));
      actions.addAll(filterActions);
    }
    return Lists.newArrayList(
        Iterables.filter(actions, ContributeeMember.Predicates.regularElse(contributed)));
  }
 @Override
 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(contributed)));
 }