public boolean canRemoveMapping(Mapping mapping) {
    int enablementFlags = domain.getMappingEnablementFlags();
    if (mapping.getNestedIn() == null
        || (enablementFlags & MappingDomain.ENABLE_UNMAPPED_PARENTS) == 0
            && hasMappedChildren(mapping)) {
      return false;
    }

    return true;
  }
  public boolean canCreateMapping(Collection<?> inputs, Collection<?> outputs, Mapping mapping) {
    if (domain == null) {
      return false;
    }
    int enablementFlags = domain.getMappingEnablementFlags();
    if ((enablementFlags & MappingDomain.ENABLE_EMPTY_INPUTS) == 0 && inputs.size() == 0
        || (enablementFlags & MappingDomain.ENABLE_EMPTY_OUTPUTS) == 0 && outputs.size() == 0
        || inputs.size() == 0 && outputs.size() == 0
        || (enablementFlags & MappingDomain.ENABLE_MULTIPLE_INPUTS) == 0 && inputs.size() > 1
        || (enablementFlags & MappingDomain.ENABLE_MULTIPLE_OUTPUTS) == 0 && outputs.size() > 1
        || (enablementFlags & MappingDomain.ENABLE_MULTIPLE_INPUT_MAPPINGS) == 0
            && isMapped(inputs, mapping)
        || (enablementFlags & MappingDomain.ENABLE_MULTIPLE_OUTPUT_MAPPINGS) == 0
            && isMapped(outputs, mapping)
        || (enablementFlags & MappingDomain.ENABLE_UNMAPPED_PARENTS) == 0
            && !hasMappedParents(inputs, outputs)
        || (enablementFlags & MappingDomain.ENABLE_INCOMPATIBLE_METAOBJECTS) == 0
            && !hasCompatibleMetaObjects(inputs, outputs)
        || (enablementFlags & MappingDomain.ENABLE_INCOMPATIBLE_TYPE_CLASSIFIERS) == 0
            && !hasCompatibleTypes(inputs, outputs)) {
      return false;
    }

    for (Object input : inputs) {
      if (!isAttachedObject(input)) {
        return false;
      }
    }

    for (Object output : outputs) {
      if (!isAttachedObject(output)) {
        return false;
      }
    }

    return true;
  }