org.bouncycastle.oer.OEROptional Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bcutil-debug-jdk15to18 Show documentation
Show all versions of bcutil-debug-jdk15to18 Show documentation
The Bouncy Castle Java APIs for ASN.1 extension and utility APIs used to support bcpkix and bctls. This jar contains APIs for JDK 1.5 to JDK 1.8.
package org.bouncycastle.oer;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import org.bouncycastle.asn1.ASN1Absent;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1Primitive;
/**
* A placeholder object that represents an absent item.
*/
public class OEROptional
extends ASN1Object
{
public static final OEROptional ABSENT = new OEROptional(false, null);
private final boolean defined;
private final ASN1Encodable value;
private OEROptional(boolean defined, ASN1Encodable value)
{
this.defined = defined;
this.value = value;
}
public static OEROptional getInstance(Object o)
{
if (o instanceof OEROptional)
{
return (OEROptional)o;
}
else if (o instanceof ASN1Encodable)
{
return new OEROptional(true, (ASN1Encodable)o);
}
return ABSENT;
}
public static T getValue(Class type, Object src)
{
OEROptional o = OEROptional.getInstance(src);
if (!o.defined)
{
return null;
}
return o.getObject(type);
}
/**
* utility method to cast value to a given type or to call that type's getInstance(Object o) method
* if it has one.
*
* @param type The target type.
* @param The type.
* @return An instance of that type.
*/
public T getObject(final Class type)
{
if (defined)
{
if (value.getClass().isInstance(type))
{
return type.cast(value);
}
else
{
return AccessController.doPrivileged(new PrivilegedAction()
{
public T run()
{
try
{
Method m = type.getMethod("getInstance", Object.class);
return type.cast(m.invoke(null, value));
}
catch (Exception ex)
{
throw new IllegalStateException("could not invoke getInstance on type " + ex.getMessage(), ex);
}
}
});
}
}
return null;
}
public ASN1Encodable get()
{
if (!defined)
{
return ABSENT;
}
return value;
}
public ASN1Primitive toASN1Primitive()
{
if (!defined)
{
return ASN1Absent.INSTANCE;
}
return get().toASN1Primitive();
}
public boolean isDefined()
{
return defined;
}
public String toString()
{
if (defined)
{
return "OPTIONAL(" + value + ")";
}
else
{
return "ABSENT";
}
}
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (o == null || getClass() != o.getClass())
{
return false;
}
if (!super.equals(o))
{
return false;
}
OEROptional that = (OEROptional)o;
if (defined != that.defined)
{
return false;
}
return value != null ? value.equals(that.value) : that.value == null;
}
public int hashCode()
{
int result = super.hashCode();
result = 31 * result + (defined ? 1 : 0);
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
}