private static @NotNull List<Attribute> internAttributes(@NotNull Element origin, @NotNull JDOMInterner interner) {
    List<Attribute> originAttributes = JDOMUtil.getAttributes(origin);
    if (originAttributes.isEmpty()) {
      return EMPTY_LIST;
    }

    AttributeType type = null;
    String[] nameValues = new String[originAttributes.size() * 2];
    Namespace namespace = null;
    for (int i = 0; i < originAttributes.size(); i++) {
      Attribute origAttribute = originAttributes.get(i);
      if (type == null) {
        type = origAttribute.getAttributeType();
        namespace = origAttribute.getNamespace();
      }
      else if (type != origAttribute.getAttributeType() || !origAttribute.getNamespace().equals(namespace)) {
        type = null;
        // no single type/namespace, fallback to ImmutableAttrList
        break;
      }

      String name = interner.internString(origAttribute.getName());
      String value = interner.internString(origAttribute.getValue());
      nameValues[i * 2] = name;
      nameValues[i * 2 + 1] = value;
    }

    if (type == null) {
      List<ImmutableAttribute> list = new ArrayList<>(originAttributes.size());
      for (Attribute attribute : originAttributes) {
        list.add(new ImmutableAttribute(interner.internString(attribute.getName()),
                                        interner.internString(attribute.getValue()),
                                        attribute.getAttributeType(), attribute.getNamespace()));
      }
      return Collections.unmodifiableList(list);
    }
    else {
      return new ImmutableSameTypeAttributeList(nameValues, type, namespace);
    }
  }
private static @NotNull List<Attribute> internAttributes(@NotNull Element origin, @NotNull JDOMInterner interner)