/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.x509.dn; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; /** * Ordered list of {@link Attribute}s. * * @author Middleware Services */ public class Attributes implements Iterable<Attribute> { /** Underlying attributes. */ private final List<Attribute> attributes = new ArrayList<>(5); /** * Adds an attribute by type and value to the end of the attribute list. * * @param typeOid OID of attribute type. * @param value Attribute value. */ public void add(final String typeOid, final String value) { final StandardAttributeType type = StandardAttributeType.fromOid(typeOid); if (type != null) { add(new Attribute(type, value)); } else { add(new Attribute(new UnknownAttributeType(typeOid), value)); } } /** * Adds the given attribute to the end of the attribute list. * * @param attr Non-null attribute. */ public void add(final Attribute attr) { if (attr == null) { throw new IllegalArgumentException("Attribute cannot be null"); } attributes.add(attr); } /** * Gets the number of attributes contained in this instance. * * @return Number of attributes. */ public int size() { return attributes.size(); } /** * Gets an immutable list of attributes. * * @return Non-null immutable attribute list. */ public List<Attribute> getAll() { return Collections.unmodifiableList(attributes); } /** * Gets an immutable list of all attributes of the given type. The order of the returned list reflects the ordering of * the underlying attributes. * * @param type Attribute type. * * @return Non-null list of attributes of given type. An empty list is returned if there are no attributes of the * given type. */ public List<String> getValues(final AttributeType type) { final List<String> values = new ArrayList<>(attributes.size()); values.addAll( attributes.stream().filter( attr -> attr.getType().equals(type)).map(Attribute::getValue).collect(Collectors.toList())); return Collections.unmodifiableList(values); } /** * Gets the first value of the given type that appears in the attribute list. * * @param type Attribute type. * * @return Value of first attribute of given type or null if no attributes of given type exist. */ public String getValue(final AttributeType type) { for (Attribute attr : attributes) { if (attr.getType().equals(type)) { return attr.getValue(); } } return null; } @Override public Iterator<Attribute> iterator() { return attributes.iterator(); } }