// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.oer.its.ieee1609dot2;

import java.security.AccessController;
import org.bouncycastle.oer.OERInputStream;
import java.security.PrivilegedAction;
import org.bouncycastle.oer.Element;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.asn1.ASN1Object;

public class Opaque extends ASN1Object
{
    private final byte[] content;
    
    public Opaque(final byte[] array) {
        this.content = Arrays.clone(array);
    }
    
    private Opaque(final ASN1OctetString asn1OctetString) {
        this(asn1OctetString.getOctets());
    }
    
    public static Opaque getInstance(final Object o) {
        if (o instanceof Opaque) {
            return (Opaque)o;
        }
        if (o != null) {
            return new Opaque(ASN1OctetString.getInstance(o));
        }
        return null;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        return new DEROctetString(this.content);
    }
    
    public byte[] getContent() {
        return this.content;
    }
    
    public InputStream getInputStream() {
        return new ByteArrayInputStream(this.content);
    }
    
    public static <T> T getValue(final Class<T> clazz, final Element element, final Opaque opaque) {
        return AccessController.doPrivileged((PrivilegedAction<T>)new PrivilegedAction<T>() {
            @Override
            public T run() {
                try {
                    return clazz.cast(clazz.getMethod("getInstance", Object.class).invoke(null, OERInputStream.parse(opaque.content, element)));
                }
                catch (final Exception cause) {
                    throw new IllegalStateException("could not invoke getInstance on type " + cause.getMessage(), cause);
                }
            }
        });
    }
}
