All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bouncycastle.oer.OEROptional Maven / Gradle / Ivy

Go to download

The Bouncy Castle Java APIs for ASN.1 extension and utility APIs used to support bcpkix and bctls with the BC FIPS provider. The APIs may also be used with other providers although if being used in a FIPS context it is the responsibility of the user to ensure that any other providers used are FIPS certified and used appropriately.

The newest version!
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;
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy