2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / System.Security.Policy / FirstMatchCodeGroup.cs
index 4fcc9fe7a5a0f0e1dfe34a7d73046ff1c35d3ba7..6d5825dd48f8320235c2e93c8c23eac3b5557f17 100644 (file)
@@ -1,18 +1,45 @@
+//
 // System.Security.Policy.FirstMatchCodeGroup
 //
 // Author(s):
 //  Jackson Harper (Jackson@LatitudeGeo.com)
 //
 // (C) 2002 Jackson Harper, All rights reserved.
-
-using System;
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
 
 namespace System.Security.Policy {
 
+       [Serializable]
        public sealed class FirstMatchCodeGroup : CodeGroup {
                
-               public FirstMatchCodeGroup(IMembershipCondition membershipCondition, PolicyStatement policy) :
-                       base (membershipCondition, policy)
+               public FirstMatchCodeGroup (IMembershipCondition membershipCondition, PolicyStatement policy)
+                       : base (membershipCondition, policy)
+               {
+               }
+
+               // for PolicyLevel (to avoid validation duplication)
+               internal FirstMatchCodeGroup (SecurityElement e, PolicyLevel level)
+                       : base (e, level)
                {
                }
 
@@ -20,8 +47,7 @@ namespace System.Security.Policy {
                // Public Properties
                //
 
-               public override string MergeLogic
-               {
+               public override string MergeLogic {
                        get { return "First Match"; }
                }
 
@@ -29,69 +55,54 @@ namespace System.Security.Policy {
                // Public Methods
                //
                
-               public override CodeGroup Copy()
+               public override CodeGroup Copy ()
                {
                        FirstMatchCodeGroup copy = CopyNoChildren ();
-
-                       foreach (CodeGroup group in Children) {
-                               copy.AddChild ( group );
+                       foreach (CodeGroup child in Children) {
+                               copy.AddChild (child.Copy ());  // deep copy
                        }
-
                        return copy;
                }
 
-               public override PolicyStatement Resolve(Evidence evidence)
+               public override PolicyStatement Resolve (Evidence evidence)
                {
-                       PolicyStatement policy = null;
-                       PolicyStatement child_policy;
+                       if (evidence == null)
+                               throw new ArgumentNullException ("evidence");
 
-                       if (null == evidence)
-                               throw new ArgumentNullException ();
+                       if (!MembershipCondition.Check (evidence))
+                               return null;
 
-                       if (MembershipCondition.Check (evidence)) {
-                               if (null != PolicyStatement) {
-                                       policy = PolicyStatement;
-                               } else {
-                                       // Loop through all children breaking on the first one that resolves
-                                       foreach (CodeGroup child in Children) {
-                                               if (null == (child_policy = child.Resolve (evidence)))
-                                                       continue;
-                                               policy = child_policy;
-                                               break;
-                                       }
+                       foreach (CodeGroup child in Children) {
+                               PolicyStatement policy = child.Resolve (evidence);
+                               if (policy != null) {
+                                       return policy;  // first match
                                }
                        }
-                       
-                       return policy;
+                       return this.PolicyStatement;    // default
                }
                
-               public override CodeGroup ResolveMatchingCodeGroups(Evidence evidence)
+               public override CodeGroup ResolveMatchingCodeGroups (Evidence evidence)
                {
-                       CodeGroup group = null;
+                       if (evidence == null)
+                               throw new ArgumentNullException ("evidence");
+
+                       if (!MembershipCondition.Check (evidence))
+                               return null;
 
-                       if (null == evidence)
-                               throw new ArgumentNullException ();
-                       
-                       if (MembershipCondition.Check (evidence)) {
-                               group = CopyNoChildren ();
-                               
-                               // Add the first child that resolves
-                               foreach (CodeGroup child in Children) {
-                                       if ( null == child.Resolve (evidence))
-                                               continue;
-                                       group.AddChild (child);
-                                       break;
+                       foreach (CodeGroup child in Children) {
+                               if (child.Resolve (evidence) != null) {
+                                       return child.Copy ();   // first match
+                                       // FIXME copy childrens ?
                                }
                        }
-
-                       return group;
+                       return this.CopyNoChildren ();  // default
                }
        
                //
                // Private Methods
                //
        
-               private FirstMatchCodeGroup CopyNoChildren()
+               private FirstMatchCodeGroup CopyNoChildren ()
                {
                        FirstMatchCodeGroup copy = new FirstMatchCodeGroup (MembershipCondition, PolicyStatement);
 
@@ -101,6 +112,4 @@ namespace System.Security.Policy {
                        return copy;
                }
        }
-
 }
-