docs: private List<Map<String, String>> marshall(IPermission[] data) {
  
          // Assertions.
          if (data == null) {
              String msg = "Argument 'data' cannot be null";
              throw new IllegalArgumentException(msg);
          }
  
          List<Map<String, String>> rslt = new ArrayList<Map<String, String>>(data.length);
          for (IPermission p : data) {
              JsonEntityBean bean = getEntityBean(p.getPrincipal());
  
              Map<String, String> entry = new HashMap<String, String>();
              entry.put("owner", p.getOwner());
              entry.put("principalType", bean.getEntityTypeAsString());
              entry.put("principalName", bean.getName());
              entry.put("principalKey", p.getPrincipal());
              entry.put("activity", p.getActivity());
              entry.put("target", p.getTarget());
              entry.put("permissionType", p.getType());
  
              /*
               *  Attempt to find a name for this target through the permission
               *  target provider registry.  If none can be found, just use
               *  the target key.
               */
  
              String targetName = null;
              try {
                  // attempt to get the target provider for this activity
                  IPermissionActivity activity =
                          permissionOwnerDao.getPermissionActivity(p.getOwner(), p.getActivity());
                  entry.put("activityName", activity.getName());
  
                  IPermissionOwner owner = permissionOwnerDao.getPermissionOwner(p.getOwner());
                  entry.put("ownerName", owner.getName());
  
                  String providerKey = activity.getTargetProviderKey();
                  IPermissionTargetProvider provider =
                          targetProviderRegistry.getTargetProvider(providerKey);
  
                  // get the target from the provider
                  IPermissionTarget target = provider.getTarget(p.getTarget());
                  targetName = target.getName();
  
              } catch (RuntimeException e) {
                  // likely a result of a null activity or provider
                  log.trace("Failed to resolve target name", e);
              }
  
              if (targetName == null) {
                  targetName = p.getTarget();
              }
              entry.put("targetName", targetName);
  
              rslt.add(entry);
          }
  
          return rslt;
      }