org.bouncycastle.asn1.cms.AttributeTable.java Source code

Java tutorial

Introduction

Here is the source code for org.bouncycastle.asn1.cms.AttributeTable.java

Source

package org.bouncycastle.asn1.cms;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.DERSet;

/**
 * This is helper tool to construct {@link Attributes} sets.
 */
public class AttributeTable {
    private Hashtable attributes = new Hashtable();

    public AttributeTable(Hashtable attrs) {
        attributes = copyTable(attrs);
    }

    public AttributeTable(ASN1EncodableVector v) {
        for (int i = 0; i != v.size(); i++) {
            Attribute a = Attribute.getInstance(v.get(i));

            addAttribute(a.getAttrType(), a);
        }
    }

    public AttributeTable(ASN1Set s) {
        for (int i = 0; i != s.size(); i++) {
            Attribute a = Attribute.getInstance(s.getObjectAt(i));

            addAttribute(a.getAttrType(), a);
        }
    }

    public AttributeTable(Attribute attr) {
        addAttribute(attr.getAttrType(), attr);
    }

    public AttributeTable(Attributes attrs) {
        this(ASN1Set.getInstance(attrs.toASN1Primitive()));
    }

    private void addAttribute(ASN1ObjectIdentifier oid, Attribute a) {
        Object value = attributes.get(oid);

        if (value == null) {
            attributes.put(oid, a);
        } else {
            Vector v;

            if (value instanceof Attribute) {
                v = new Vector();

                v.addElement(value);
                v.addElement(a);
            } else {
                v = (Vector) value;

                v.addElement(a);
            }

            attributes.put(oid, v);
        }
    }

    /**
     * Return the first attribute matching the OBJECT IDENTIFIER oid.
     * 
     * @param oid type of attribute required.
     * @return first attribute found of type oid.
     */
    public Attribute get(ASN1ObjectIdentifier oid) {
        Object value = attributes.get(oid);

        if (value instanceof Vector) {
            return (Attribute) ((Vector) value).elementAt(0);
        }

        return (Attribute) value;
    }

    /**
     * Return all the attributes matching the OBJECT IDENTIFIER oid. The vector will be 
     * empty if there are no attributes of the required type present.
     * 
     * @param oid type of attribute required.
     * @return a vector of all the attributes found of type oid.
     */
    public ASN1EncodableVector getAll(ASN1ObjectIdentifier oid) {
        ASN1EncodableVector v = new ASN1EncodableVector();

        Object value = attributes.get(oid);

        if (value instanceof Vector) {
            Enumeration e = ((Vector) value).elements();

            while (e.hasMoreElements()) {
                v.add((Attribute) e.nextElement());
            }
        } else if (value != null) {
            v.add((Attribute) value);
        }

        return v;
    }

    public int size() {
        int size = 0;

        for (Enumeration en = attributes.elements(); en.hasMoreElements();) {
            Object o = en.nextElement();

            if (o instanceof Vector) {
                size += ((Vector) o).size();
            } else {
                size++;
            }
        }

        return size;
    }

    public Hashtable toHashtable() {
        return copyTable(attributes);
    }

    public ASN1EncodableVector toASN1EncodableVector() {
        ASN1EncodableVector v = new ASN1EncodableVector();
        Enumeration e = attributes.elements();

        while (e.hasMoreElements()) {
            Object value = e.nextElement();

            if (value instanceof Vector) {
                Enumeration en = ((Vector) value).elements();

                while (en.hasMoreElements()) {
                    v.add(Attribute.getInstance(en.nextElement()));
                }
            } else {
                v.add(Attribute.getInstance(value));
            }
        }

        return v;
    }

    public Attributes toASN1Structure() {
        return new Attributes(this.toASN1EncodableVector());
    }

    private Hashtable copyTable(Hashtable in) {
        Hashtable out = new Hashtable();
        Enumeration e = in.keys();

        while (e.hasMoreElements()) {
            Object key = e.nextElement();

            out.put(key, in.get(key));
        }

        return out;
    }

    /**
     * Return a new table with the passed in attribute added.
     *
     * @param attrType the type of the attribute to add.
     * @param attrValue the value corresponding to the attribute (will be wrapped in a SET).
     * @return a new table with the extra attribute in it.
     */
    public AttributeTable add(ASN1ObjectIdentifier attrType, ASN1Encodable attrValue) {
        AttributeTable newTable = new AttributeTable(attributes);

        newTable.addAttribute(attrType, new Attribute(attrType, new DERSet(attrValue)));

        return newTable;
    }

    public AttributeTable remove(ASN1ObjectIdentifier attrType) {
        AttributeTable newTable = new AttributeTable(attributes);

        newTable.attributes.remove(attrType);

        return newTable;
    }
}