org.bouncycastle.asn1.cms.AttributeTable Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bouncycastle Show documentation
Show all versions of bouncycastle Show documentation
The Bouncy Castle Java APIs for CMS, PKCS, EAC, TSP, CMP, CRMF, OCSP, and certificate generation. This jar
contains APIs for JDK 1.5 and up. The APIs can be used in conjunction with a JCE/JCA provider such as the one
provided with the Bouncy Castle Cryptography APIs.
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;
}
}