/**
  * Returns a combined map of user and group permissions, with group names prefixed by {@link
  * AccessControlLists#GROUP_PREFIX}.
  */
 public ListMultimap<String, T> getAllPermissions() {
   ListMultimap<String, T> tmp = ArrayListMultimap.create();
   tmp.putAll(userCache);
   for (String group : groupCache.keySet()) {
     tmp.putAll(AccessControlLists.GROUP_PREFIX + group, groupCache.get(group));
   }
   return tmp;
 }
 public Builder addRelations(String parentQualifier, String... childrenQualifiers) {
   Preconditions.checkNotNull(parentQualifier);
   Preconditions.checkNotNull(childrenQualifiers);
   Preconditions.checkArgument(
       childrenQualifiers.length > 0, "childrenQualifiers can't be empty");
   relations.putAll(parentQualifier, Arrays.asList(childrenQualifiers));
   return this;
 }
  /**
   * Merge with another validation report
   *
   * @param other the report to merge with
   */
  public void mergeWith(final ValidationReport other) {
    if (fatal) return;

    if (other.fatal) {
      msgMap.clear();
      fatal = true;
    }

    msgMap.putAll(other.msgMap);
  }
  @Override
  protected boolean performRefinementForState(BooleanFormula pInterpolant, ARGState pState)
      throws InterruptedException, SolverException {
    checkState(newPredicates != null);
    checkArgument(!bfmgr.isTrue(pInterpolant));

    predicateCreation.start();
    newPredicates.putAll(extractLocation(pState), convertInterpolant(pInterpolant));
    predicateCreation.stop();

    return false;
  }
  /**
   * Returns a map of the data items.
   *
   * @return a map of items.
   * @see DataMap
   */
  @NonNull
  @Override
  public ListMultimap<String, I> getDataMap() {
    // put all the sets in a multimap. The result is that for each key,
    // there is a sorted list of items from all the layers, including removed ones.
    ListMultimap<String, I> fullItemMultimap = ArrayListMultimap.create();

    for (S resourceSet : mDataSets) {
      ListMultimap<String, I> map = resourceSet.getDataMap();
      for (Map.Entry<String, Collection<I>> entry : map.asMap().entrySet()) {
        fullItemMultimap.putAll(entry.getKey(), entry.getValue());
      }
    }

    return fullItemMultimap;
  }
  // Register the methods of a class.
  private void registerMethods(Class<?> clazz, Method parent, Object obj) {
    for (Method method : clazz.getMethods()) {
      if (!method.isAnnotationPresent(Command.class)) continue;
      // We want to be able invoke with an instance
      if (!Modifier.isStatic(method.getModifiers())) {
        // Can't register this command if we don't have an instance
        if (obj == null) continue;
        instances.put(method, obj);
      }

      Command cmd = method.getAnnotation(Command.class);
      // Cache the aliases too
      for (String alias : cmd.aliases()) {
        for (String modifier : cmd.modifiers()) {
          commands.put(alias + " " + modifier, method);
        }
        if (!commands.containsKey(alias + " help")) {
          commands.put(alias + " help", null);
        }
      }

      List<Annotation> annotations = Lists.newArrayList();
      for (Annotation annotation : method.getDeclaringClass().getAnnotations()) {
        Class<? extends Annotation> annotationClass = annotation.annotationType();
        if (annotationProcessors.containsKey(annotationClass)) annotations.add(annotation);
      }
      for (Annotation annotation : method.getAnnotations()) {
        Class<? extends Annotation> annotationClass = annotation.annotationType();
        if (!annotationProcessors.containsKey(annotationClass)) continue;
        Iterator<Annotation> itr = annotations.iterator();
        while (itr.hasNext()) {
          Annotation previous = itr.next();
          if (previous.annotationType() == annotationClass) {
            itr.remove();
          }
        }
        annotations.add(annotation);
      }

      if (annotations.size() > 0) registeredAnnotations.putAll(method, annotations);

      Class<?>[] parameterTypes = method.getParameterTypes();
      if (parameterTypes.length <= 1 || parameterTypes[1] == CommandSender.class)
        serverCommands.add(method);
    }
  }
  /**
   * Sets the post blob load state to TOUCHED.
   *
   * <p>After a load from the blob file, all items have their state set to nothing. If the load mode
   * is not set to incrementalState then we want the items that are in the current merge result to
   * have their state be TOUCHED.
   *
   * <p>This will allow the first use of {@link #mergeData(MergeConsumer, boolean)} to add these to
   * the consumer as if they were new items.
   *
   * @see #loadFromBlob(java.io.File, boolean)
   * @see DataItem#isTouched()
   */
  private void setPostBlobLoadStateToTouched() {
    ListMultimap<String, I> itemMap = ArrayListMultimap.create();

    // put all the sets into list per keys. The order is important as the lower sets are
    // overridden by the higher sets.
    for (S dataSet : mDataSets) {
      ListMultimap<String, I> map = dataSet.getDataMap();
      for (Map.Entry<String, Collection<I>> entry : map.asMap().entrySet()) {
        itemMap.putAll(entry.getKey(), entry.getValue());
      }
    }

    // the items that represent the current state is the last item in the list for each key.
    for (String key : itemMap.keySet()) {
      List<I> itemList = itemMap.get(key);
      itemList.get(itemList.size() - 1).resetStatusToTouched();
    }
  }
 @Override
 public void putAll(final Map<? extends K, ? extends List<V>> m) {
   for (Entry<? extends K, ? extends List<V>> entry : m.entrySet()) {
     backingMap.putAll(entry.getKey(), entry.getValue());
   }
 }
 /**
  * Sets this BindsConfig to be identical to other
  *
  * @param other The BindsConfig to copy
  */
 public void setBinds(BindsConfig other) {
   data.clear();
   data.putAll(other.data);
 }