| 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; |
| } |
| } |