/* ======================================================================
   Parts Copyright 2006 University of Leeds, Oxford University, University of the Highlands and Islands.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

====================================================================== */

package org.bodington.server.realm;

import org.bodington.server.*;
import org.bodington.sqldatabase.*;
import org.bodington.database.*;
import java.util.Enumeration;

/**
 * Records the membership of a User within a Group.  Contains no
 * serious code.  There are "find" methods and property get/set
 * methods.
 * 
 * @author Jon Maber
 * @version 1.0
 */
public class Member extends org.bodington.sqldatabase.SqlPersistentObject
	{

	/**
	 * A unique primary key for this membership entry.
	 */
	private PrimaryKey member_id;

	/**
	 * The id of the group that the user belongs to.
	 */
	private PrimaryKey group_id;

	/**
	 * The id of the user that belongs to the group.
	 */
	private PrimaryKey user_id;
	
	private MemberIndexKey[] ikeys;

	public static Member findMember( PrimaryKey key )
	    throws BuildingServerException
	    {
	    return (Member)findPersistentObject( key, "org.bodington.server.realm.Member" );
	    }
	
	public static Member findMemberByUserIdAndGroupId( PrimaryKey user_id, PrimaryKey group_id )
	    throws BuildingServerException
	    {
	    MemberIndexKey ikey = new MemberIndexKey();
	    ikey.setUserId( user_id );
	    ikey.setGroupId( group_id );
	    return (Member)findPersistentObject( ikey, "org.bodington.server.realm.Member" );
	    }
	
	public static Member findMember( String where )
	    throws BuildingServerException
	    {
	    return (Member)findPersistentObject( where, "org.bodington.server.realm.Member" );
	    }
	
	public static Enumeration findMembers( String where )
	    throws BuildingServerException
	    {
	    return findPersistentObjects( where, "org.bodington.server.realm.Member" );
	    }
	
	public Member()
		{
		ikeys = new MemberIndexKey[1];
		ikeys[0] = new MemberIndexKey();
		}

    public void setPrimaryKey(PrimaryKey key)
    	{
    	setMemberId( key );
    	}

    public PrimaryKey getPrimaryKey()
    	{
    	return getMemberId();
	    }

    public void setMemberId(PrimaryKey key)
    	{
    	member_id = key;
    	setUnsaved();
    	}

    public PrimaryKey getMemberId()
    	{
    	return member_id;
	    }

    public void setGroupId(PrimaryKey key)
    	{
    	group_id = key;
    	setUnsaved();
    	ikeys[0].setGroupId( key );
    	}

    public PrimaryKey getGroupId()
    	{
    	return group_id;
	    }

    public void setUserId(PrimaryKey key)
    	{
    	user_id = key;
    	setUnsaved();
    	ikeys[0].setUserId( key );
    	}

    public PrimaryKey getUserId()
    	{
    	return user_id;
	    }

    public void setGroup( Group g )
    	{
    	setGroupId( g.getGroupId() );
    	}

    public Group getGroup()
        throws BuildingServerException
    	{
		return Group.findGroup( group_id );
	    }

    public void setUser( User u )
    	{
    	setUserId( u.getUserId() );
    	}

    public User getUser()
        throws BuildingServerException
    	{
		return User.findUser( user_id );
	    }
	
	public IndexKey[] getIndexKeys()
	    {
	    
	    if ( ikeys[0].getGroupId() == null || ikeys[0].getUserId() == null)
	        return null;

	    return ikeys;
	    }
	    
	public boolean matchesKey( IndexKey testikey )
	    {
	    return testikey.equals( ikeys[0] );
	    }
	
	}
