/*
 * X509Certificate.java
 *
 * Created on 04 March 2004, 11:24
 */

package org.bodington.server.realm;

import java.security.cert.X509Certificate;
import java.io.*;
import java.util.Enumeration;
import java.util.logging.*;

import org.bodington.server.BuildingServerException;
import org.bodington.database.*;
import org.bodington.sqldatabase.*;
import org.bodington.util.*;

/**
 *
 * @author  jrm
 */
public class UserX509 extends org.bodington.sqldatabase.SqlPersistentObject
{
    private PrimaryKey user_x509_id;
    private PrimaryKey user_id;
    
    private X509Certificate cert;

    private int serial_number;
    private String distinguished_name;
    
    
    public static UserX509 findUserX509( PrimaryKey key )
    throws BuildingServerException
    {
        return (UserX509)findPersistentObject( key, "org.bodington.server.realm.UserX509" );
    }

    public static Enumeration findUserX509s( int serial, String dn )
    throws BuildingServerException
    {
        String dn_spec;
        if ( dn.length() > 255 )
            dn_spec = dn.substring( 0, 255 );
        else
            dn_spec = dn;
        return findPersistentObjects( 
            "serial_number = " + serial + " AND distinguished_name = " + SqlDatabase.quotedSQL( dn_spec ), 
            "org.bodington.server.realm.UserX509" );
    }
    
    
    /** Creates a new instance of X509Certificate */
    public UserX509()
    {
    }
    
    public org.bodington.database.PrimaryKey getPrimaryKey()
    {
        return getUserX509Id();
    }
    
    public void setPrimaryKey(org.bodington.database.PrimaryKey key)
    {
        setUserX509Id( key );
    }
    
    public org.bodington.database.PrimaryKey getUserX509Id()
    {
        return user_x509_id;
    }
    
    public void setUserX509Id(org.bodington.database.PrimaryKey key)
    {
        setUnsaved();
        user_x509_id = key;
    }
    
    public org.bodington.database.PrimaryKey getUserId()
    {
        return user_id;
    }
    
    public void setUserId(org.bodington.database.PrimaryKey key)
    {
        setUnsaved();
        user_id = key;
    }
    
    public int getSerialNumber()
    {
        return serial_number;
    }
    
    public void setSerialNumber( int s )
    {
        setUnsaved();
        serial_number = s;
    }
    
    public String getDistinguishedName()
    {
        return distinguished_name;
    }
    
    public void setDistinguishedName( String s )
    {
        setUnsaved();
        if ( s.length() > 255 )
            distinguished_name = s.substring( 0, 255 );
        else
            distinguished_name = s;
    }
    
    public String getSerializedCertificate()
    {
        if ( cert == null )
            return null;
        
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        try
        {
            ObjectOutputStream objout = new ObjectOutputStream( bout );
            objout.writeObject( cert );
            objout.close();
        }
        catch ( IOException ioe )
        {
            Logger.getLogger( "org.bodington" ).logp(
            Level.SEVERE,
            "UserX509",
            "getSerializedCertificate",
            ioe.getMessage(),
            ioe );
            return null;
        }
        Base64Encoder encoder = new Base64Encoder();
        return encoder.encode( bout.toByteArray() );
    }
    
    public void setSerializedCertificate( String s )
    {
        setUnsaved();
        cert=null;
        if ( s == null || s.length() == 0 )
            return;
        
        try
        {
            Base64Decoder decoder = new Base64Decoder();
            byte[] binary = decoder.decodeBuffer( s );
            ByteArrayInputStream bin = new ByteArrayInputStream( binary );
            ObjectInputStream objin = new ObjectInputStream( bin );
            cert = (X509Certificate)objin.readObject();
        }
        catch ( Exception e )
        {
            Logger.getLogger( "org.bodington" ).logp(
            Level.SEVERE,
            "UserX509",
            "getSerializedCertificate",
            e.getMessage(),
            e );
        }
    }
    
    public X509Certificate getX509Certificate()
    {
        return cert;
    }
    
    public void setX509Certificate( X509Certificate c )
    {
        setUnsaved();
        cert = c;
    }
}

