コード例 #1
0
ファイル: Policy.cs プロジェクト: Condeti/XACML.NET
		/// <summary>
		/// Evaluates the policy.
		/// </summary>
		/// <param name="context">The evaluation context instance.</param>
		/// <returns>The decission result for this policy.</returns>
		public Decision Evaluate( EvaluationContext context )
		{
            if (context == null) throw new ArgumentNullException("context");
			context.Trace( "Evaluating policy: {0}", _policy.Description );
			context.AddIndent();
			context.CurrentPolicy = this;
			try
			{
				// Evaluate the variables
				if( this._policy.SchemaVersion == XacmlVersion.Version20 )
				{
					if( _variables == null )
					{
						context.Trace( "Evaluating variables..." );
						_variables = new Hashtable();
					
						foreach( pol.VariableDefinitionElement variableDef in _policy.VariableDefinitions.Values )
						{
							VariableDefinition variable = new VariableDefinition( variableDef );
							_variables.Add( variableDef.Id, variable );
						}
					}
				}

				// Matches the target.
				TargetEvaluationValue targetEvaluationValue = Match( context );

				// If the target matches.
				if( targetEvaluationValue == TargetEvaluationValue.Match )
				{
					context.Trace( "Rule combination algorithm: {0}", _policy.RuleCombiningAlgorithm );

					// Evaluate all rules and apply rule combination
					inf.IRuleCombiningAlgorithm rca = EvaluationEngine.CreateRuleCombiningAlgorithm( _policy.RuleCombiningAlgorithm );
					_evaluationValue = rca.Evaluate( context, _rules );
				}
				else if( targetEvaluationValue == TargetEvaluationValue.NoMatch )
				{
					_evaluationValue = Decision.NotApplicable;
				}
				else if( targetEvaluationValue == TargetEvaluationValue.Indeterminate )
				{
					_evaluationValue = Decision.Indeterminate;
				}

				context.Trace( "Policy: {0}", _evaluationValue );
			
				// Copy all the obligations.
				_obligations = new pol.ObligationCollection();
				if( _evaluationValue != Decision.Indeterminate && 
					_evaluationValue != Decision.NotApplicable &&
					_policy.Obligations != null && _policy.Obligations.Count != 0 )
				{
					foreach( pol.ObligationElement obl in _policy.Obligations )
					{
						if( ( obl.FulfillOn == pol.Effect.Deny && _evaluationValue == Decision.Deny ) || 
							( obl.FulfillOn == pol.Effect.Permit && _evaluationValue == Decision.Permit ) )
						{
							context.Trace( "Adding obligation: {0} ", obl.ObligationId );
							_obligations.Add( obl );
						}
					}
				}

				return _evaluationValue;
			}
			finally
			{
				context.RemoveIndent();
				context.CurrentPolicy = null;
			}
		}