package mit.roles ;

public class RolesFactory
extends roles.RolesFactory
{
	private static final String NODATE = "        " ;

	private static int count = 0 ;

	private sql.SqlFactory sqlFactory = null ;
	public sql.SqlFactory getSqlFactory() { return sqlFactory ; }

	private sql.Connection connection = null ;
	public sql.Connection getConnection()
		throws Exception
	{
System.out.println( "mit.roles.RolesFactory.getConnection" ) ;
		if( null == sqlFactory )
		{
System.out.println( "mit.roles.RolesFactory.getConnection null sqlFactory" ) ;
			sqlFactory = sql.SqlFactory.getDefaultSqlFactory( getProperties() )  ;
		}
		if( null != sqlFactory )
		{
System.out.println( "mit.roles.RolesFactory.getConnection not null sqlFactory" ) ;
			connection = sqlFactory.newConnection( getProperties() , getServiceName() + Integer.toString( count++ ) ) ;
		}
		return this.connection ; }

	private roles.Person forUser = null ;
	public roles.Person getForUser()
	{
		if( null == this.forUser )
		{
			if( null != getProperties() )
			{
				String kerberosName = ( String ) getProperties().get( "ForUser" ) ;
				if( null != kerberosName )
				{
					this.forUser = mit.roles.Person.create( this , kerberosName ) ;
				}
			}
		}
		return this.forUser ;
	}

	public static String createRolesDate
		( java.sql.Timestamp timestamp
		)
		throws Exception
	{
		if( null != timestamp )
		{
			java.util.GregorianCalendar date
				= new java.util.GregorianCalendar() ;
			date.setTime( ( java.util.Date ) timestamp ) ;
			String rolesDate = null ;
			int month = date.get( java.util.Calendar.YEAR ) ;
			int day = date.get( java.util.Calendar.DAY_OF_MONTH ) ;
			int year = date.get( java.util.Calendar.MONTH ) ;
			if( month < 10 )
			{
				rolesDate += "0" ;
			}
			rolesDate += Integer.toString( month ) ;
			if( day < 10 )
			{
				rolesDate += "0" ;
			}
			rolesDate += Integer.toString( day ) + Integer.toString( year ) ;
			return rolesDate ;
		}
		return NODATE ;
	}

	public static java.sql.Timestamp createSqlTimestamp
		( String rolesDate
		)
		throws Exception
	{
		if( null != rolesDate )
		{
			int month = Integer.parseInt( rolesDate.substring( 0 , 2 ) ) ;
			int day = Integer.parseInt( rolesDate.substring( 2 , 4 ) ) ;
			int year = Integer.parseInt( rolesDate.substring( 4 , 8 ) ) ;
			java.util.GregorianCalendar gc
				= new java.util.GregorianCalendar( year , month , day ) ;
			return new java.sql.Timestamp( gc.getTime().getTime() ) ;
		}
		return null ;
	}

	public roles.Authorization createAuthorization
		( roles.Person person
		, roles.Function function
		, roles.Qualifier qualifier
		, roles.GrantPrivilege grant
		, Boolean doFunction
		, java.sql.Timestamp effectiveDate
		, java.sql.Timestamp expirationDate
		)
		throws Exception
	{
		return mit.roles.Authorization.create
			( this
			, person
			, function
			, qualifier
			, grant
			, doFunction
			, effectiveDate
			, expirationDate
			) ;
	}

	public roles.Authorization createAuthorization
		( roles.Person person
		, roles.Function function
		, roles.Qualifier qualifier
		, roles.GrantPrivilege grant
		, Boolean doFunction
		)
		throws Exception
	{
		return mit.roles.Authorization.create
			( this
			, person
			, function
			, qualifier
			, grant
			, doFunction
			) ;
	}

	public roles.People getWhoCanDo
		( roles.Function function
		, roles.Qualifier qualifier
		, Boolean isActiveNow
		)
		throws Exception
	{
		return mit.roles.People.getWhoCanDo
			( this
			, function
			, qualifier
			, isActiveNow
			) ;
	}

	public roles.People getWhoCanDo
		( roles.Function function
		, Boolean isActiveNow
		)
		throws Exception
	{
		return mit.roles.People.getWhoCanDo
			( this
			, function
			, isActiveNow
			) ;
	}

	public roles.People getWhoCanDo
		( roles.FunctionCategory functionCategory
		, Boolean isActiveNow
		)
		throws Exception
	{
		return mit.roles.People.getWhoCanDo
			( this
			, functionCategory
			, isActiveNow
			) ;
	}

	public roles.People getWhoCanDo
		( roles.FunctionCategory functionCategory
		, roles.Qualifier qualifier
		, Boolean isActiveNow
		)
		throws Exception
	{
		return mit.roles.People.getWhoCanDo
			( this
			, functionCategory
			, qualifier
			, isActiveNow
			) ;
	}

	public roles.People getWhoCanDo
		( roles.Qualifier qualifier
		, Boolean isActiveNow
		)
		throws Exception
	{
		return mit.roles.People.getWhoCanDo
			( this
			, qualifier
			, isActiveNow
			) ;
	}

	public roles.Authorizations getAuthsForDoingFWithQ
		( roles.Function function
		, roles.Qualifier qualifier
		, Boolean isActiveNow
		)
		throws Exception
	{
		return mit.roles.Authorizations.getAuthsForDoingFWithQ
			( this
			, function
			, qualifier
			, isActiveNow
			) ;
	}

	public roles.Authorizations getAuthsForDoingFWithQ
		( roles.FunctionCategory functionCategory
		, roles.Qualifier qualifier
		, Boolean isActiveNow
		)
		throws Exception
	{
		return mit.roles.Authorizations.getAuthsForDoingFWithQ
			( this
			, functionCategory
			, qualifier
			, isActiveNow
			) ;
	}

	public roles.Authorizations getAuthsSimpleForm
		( roles.Person person
		, roles.Function function
		, roles.Qualifier qualifier
		, Boolean isActiveNow
		, Boolean expandFunctions
		, Boolean qualifiersOptions
		)
		throws Exception
	{
		return mit.roles.Authorizations.getAuthsSimpleForm
			( this
			, person
			, function
			, qualifier
			, isActiveNow
			, expandFunctions
			, qualifiersOptions
			) ;
	}

	public roles.Authorizations getAuthsSimpleForm
		( roles.Person person
		, roles.FunctionCategory functionCategory
		, roles.Qualifier qualifier
		, Boolean isActiveNow
		, Boolean expandFunctions
		, Boolean expandQualifiers
		)
		throws Exception
	{
		return mit.roles.Authorizations.getAuthsSimpleForm
			( this
			, person
			, functionCategory
			, qualifier
			, isActiveNow
			, expandFunctions
			, expandQualifiers
			) ;
	}

	public roles.Authorizations getAuthsSimpleForm
		( roles.Person person
		, roles.Function function
		, Boolean isActiveNow
		, Boolean expandFunctions
		, Boolean expandQualifiers
		)
	throws Exception
	{
		return mit.roles.Authorizations.getAuthsSimpleForm
			( this
			, person
			, function
			, isActiveNow
			, expandFunctions
			, expandQualifiers
			) ;
	}

	public roles.Authorizations getAuthsSimpleForm
		( roles.Person person
		, roles.FunctionCategory functionCategory
		, Boolean isActiveNow
		, Boolean expandFunctions
		, Boolean expandQualifiers
		)
		throws Exception
	{
		return mit.roles.Authorizations.getAuthsSimpleForm
			( this
			, person
			, functionCategory
			, isActiveNow
			, expandFunctions
			, expandQualifiers
			) ;
	}

	public Boolean isAuthorized
		( roles.Person person
		, roles.Function function
		, roles.Qualifier qualifier
		)
		throws Exception
	{
		return mit.roles.Authorization.isAuthorized
			( this
			, ( mit.roles.Person ) person
			, ( mit.roles.Function ) function
			, ( mit.roles.Qualifier ) qualifier
			) ;
	}

	private String[] authorizationFieldNames = { "id" } ; //TODO: populate this list
	private roles.Field[] authorizationFields = null ;
	public roles.Field[] getCurrentAuthorizationFields()
		throws Exception
	{
		if( null == authorizationFields )
		{
			authorizationFields = new roles.Field[ authorizationFieldNames.length ] ;
			for( int i = 0 ; authorizationFields.length != i ; i ++ )
			{
				authorizationFields[ i ] = new roles.Field( authorizationFieldNames[ i ] ) ;
			}
		}
		return authorizationFields ;
	}

	private String[] personFieldNames = { "id" } ; //TODO: populate this list
	private roles.Field[] personFields = null ;
	public roles.Field[] getCurrentPersonFields()
		throws Exception
	{
		if( null == personFields )
		{
			personFields = new roles.Field[ personFieldNames.length ] ;
			for( int i = 0 ; personFields.length != i ; i ++ )
			{
				personFields[ i ] = new roles.Field( personFieldNames[ i ] ) ;
			}
		}
		return personFields ;
	}

	public roles.Person newPerson
		( Object key
		)
		throws Exception
	{
		return new mit.roles.Person
			( this
			, ( String ) key
			, null
			, null
			, null
			, null
			, null
			, null
			, null
			, null
			) ;
	}

	private String[] functionFieldNames = { "id" } ; //TODO: populate this list
	private roles.Field[] functionFields = null ;
	public roles.Field[] getCurrentFunctionFields()
		throws Exception
	{
		if( null == functionFields )
		{
			functionFields = new roles.Field[ functionFieldNames.length ] ;
			for( int i = 0 ; functionFields.length != i ; i ++ )
			{
				functionFields[ i ] = new roles.Field( functionFieldNames[ i ] ) ;
			}
		}
		return functionFields ;
	}

	public roles.Function newFunction
		( roles.FunctionCategory functionCategory
		, String name
		)
		throws Exception
	{
		return new mit.roles.Function
			( this
			, name
			, ( String ) null
			, functionCategory
			, ( roles.QualifierType ) null
			) ;
	}

	public roles.Function newFunction
		( String functionCategoryString
		, String name
		)
		throws Exception
	{
		roles.FunctionCategory functionCategory
			= new mit.roles.FunctionCategory
				( functionCategoryString
				, ( String ) null
				) ;
		return new mit.roles.Function
			( this
			, name
			, ( String ) null
			, functionCategory
			, ( roles.QualifierType ) null
			) ;
	}

	public roles.Function newFunction
		( Object id
		)
		throws Exception
	{
		return new mit.roles.Function
			( this
			, id
			, ( String ) null
			, ( String ) null
			, ( roles.FunctionCategory ) null
			, ( roles.QualifierType ) null
			) ;
	}

	public roles.Function newFunction
		( Object id
		, roles.FunctionCategory functionCategory
		, String name
		)
		throws Exception
	{
		return new mit.roles.Function
			( this
			, id
			, name
			, ( String ) null
			, functionCategory
			, ( roles.QualifierType ) null
			) ;
	}

	public roles.FunctionCategory newFunctionCategory
		( String functionCategoryString
		)
		throws Exception
	{
		return new mit.roles.FunctionCategory
			( functionCategoryString
			, ( String ) null
			) ;
	}

	public roles.Function createFunction
		( String name
		, String description
		, roles.FunctionCategory functionCategory
		, roles.QualifierType qualifierType
		)
		throws Exception
	{
		return mit.roles.Function.create
			( this
			, name
			, description
			, ( mit.roles.FunctionCategory ) functionCategory
			, ( mit.roles.QualifierType ) qualifierType
			) ;
	}

	public roles.Functions getFunctionsInCategory
		( roles.FunctionCategory functionCategory
		)
		throws Exception
	{
		return mit.roles.Functions.getFunctionsInCategory
			( this
			, ( mit.roles.FunctionCategory ) functionCategory
			) ;
	}

	private String[] qualifierFieldNames = { "id" } ; //TODO: populate this list
	private roles.Field[] qualifierFields = null ;
	public roles.Field[] getCurrentQualifierFields()
		throws Exception
	{
		if( null == qualifierFields )
		{
			qualifierFields = new roles.Field[ qualifierFieldNames.length ] ;
			for( int i = 0 ; qualifierFields.length != i ; i ++ )
			{
				qualifierFields[ i ] = new roles.Field( qualifierFieldNames[ i ] ) ;
			}
		}
		return qualifierFields ;
	}

	public roles.Qualifier createQualifier
		( roles.QualifierType qualifierType
		, String qualifierCode
		, String description
		, roles.Qualifier parent
		)
		throws Exception
	{
		return mit.roles.Qualifier.create
			( this
			, qualifierType
			, qualifierCode
			, description
			, parent
			) ;
	}

	public roles.Qualifier getRootQualifier
		( roles.QualifierType qualifierType
		)
		throws Exception
	{
		return mit.roles.Qualifier.getRootQualifier
			( this
			, qualifierType
			) ;
	}

	public roles.Qualifiers getQualifierChildren
	( roles.Qualifier qualifier
	)
	throws Exception
	{
		return mit.roles.Qualifiers.getQualifierChildren
			( this
			, qualifier
			) ;
	}

}