webservices/wsstar/wsstarpolicy/src/PolicyIntersecter.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarpolicy/src/PolicyIntersecter.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,259 @@
+/*
+* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    
+*
+*/
+
+
+
+
+#include "PolicyIntersecter.h"
+
+#include <XmlEngDdom.h>
+#include "wssecuritypolicy.h"
+#include "Wspolicy.h"
+
+
+using namespace WSPolicy;
+
+CPolicyIntersecter* CPolicyIntersecter::NewL()
+{
+    CPolicyIntersecter* pSelf =
+        CPolicyIntersecter::NewLC();
+    CleanupStack::Pop(pSelf);
+    return pSelf;
+}
+CPolicyIntersecter* CPolicyIntersecter::NewLC()
+{
+    CPolicyIntersecter* pSelf = new (ELeave) CPolicyIntersecter();
+    CleanupStack::PushL(pSelf);
+    pSelf->ConstructL();
+    return pSelf;  
+}
+void CPolicyIntersecter::ConstructL()
+{
+    iSecurityPolicyDomain =    CWsSecurityPolicy::NewL();
+   
+}
+CPolicyIntersecter::~CPolicyIntersecter()
+{
+   iPolicy1.Close(); 
+   iPolicy2.Close();
+
+   delete iSecurityPolicyDomain;
+}
+CPolicyIntersecter::CPolicyIntersecter()
+{
+    
+}
+
+TXmlEngElement CPolicyIntersecter::IntersectL(TDesC& /*aFirstPolicy*/, TDesC& /*aSecondPolicy*/)
+{
+//    TDOMImplementation domImpl = XmlEngine::DOM::DOMImplementationSource::DOMImplementationL (XmlEngine::DOM::KImplementationID);  
+    RXmlEngDOMImplementation domImpl;
+    RXmlEngDocument doc;
+    doc.OpenL(domImpl);
+
+//    RDOMParser parser = domImpl.CreateDOMParser();
+
+//    iPolicy1 = parser.ParseFileL( aFirstPolicy );
+//    iPolicy2 = parser.ParseFileL( aSecondPolicy );
+
+    TXmlEngElement& pPolicy1 = iPolicy1.AsElement();
+    TXmlEngElement& pPolicy2 = iPolicy2.AsElement();
+    
+    
+    TXmlEngElement result = IntersectL(pPolicy1,pPolicy2);
+    return result;
+}
+
+
+TXmlEngElement CPolicyIntersecter::IntersectL(TXmlEngElement aFirstPolicy, TXmlEngElement aSecondPolicy)
+{
+    RXmlEngDocument policyDoc  = aFirstPolicy.OwnerDocument().CloneDocumentL();
+    TXmlEngElement& newIntersectedPolicy = policyDoc.AsElement();
+
+    RXmlEngNodeList<TXmlEngElement> listPolicynew;
+    newIntersectedPolicy.GetChildElements(listPolicynew); //get the children of policy  
+
+    if(listPolicynew.HasNext()) 
+    {
+        iIntersectedPolicyElement = listPolicynew.Next();
+        iIntersectedPolicyElement.RemoveChildren();
+    }
+
+        //now add all the intersecterd assertions in this AND Element
+
+    RXmlEngNodeList<TXmlEngElement> listPolicyFirst;
+    aFirstPolicy.GetChildElements(listPolicyFirst); //get the children of policy
+
+    RXmlEngNodeList<TXmlEngElement> listPolicySecond;
+    aSecondPolicy.GetChildElements(listPolicySecond); //get the children of policy
+    
+    TXmlEngElement XOR = iIntersectedPolicyElement.AddNewElementSameNsL(WSPolicy::KXorCompositeAssertion);
+
+    if(listPolicyFirst.HasNext() && listPolicySecond.HasNext()) 
+    {
+        TXmlEngElement policyElement = listPolicyFirst.Next();
+        
+        TPtrC8 localName = policyElement.TagName();
+                
+        RXmlEngNodeList<TXmlEngElement> xorList; //get the only xor element
+        policyElement.GetElementsByTagNameL(xorList, WSPolicy::KXorCompositeAssertion, WSPolicy::KWsPolicyNsUri);
+        TXmlEngElement pXORFirst = NULL;
+        
+        if(xorList.HasNext())
+            pXORFirst = xorList.Next();
+        //get all AND elements from the above xor. 
+        
+        RXmlEngNodeList<TXmlEngElement> andListFirst; //get the only xor element from First Policy
+        pXORFirst.GetElementsByTagNameL(andListFirst, WSPolicy::KAndCompositeAssertion, WSPolicy::KWsPolicyNsUri);
+
+    //second policy
+        TXmlEngElement policyElementSec = listPolicySecond.Next();
+        
+        TPtrC8 localName2 = policyElementSec.TagName();
+                
+        RXmlEngNodeList<TXmlEngElement> xorListSec; //get the only xor element
+        policyElementSec.GetElementsByTagNameL(xorListSec, WSPolicy::KXorCompositeAssertion, WSPolicy::KWsPolicyNsUri);
+        TXmlEngElement pXORSec = NULL;
+        
+        if(xorListSec.HasNext())
+            pXORSec = xorListSec.Next();
+        //we have to get all AND elements from the above xor. we will do it in loop
+        
+        
+        while (andListFirst.HasNext())
+        {
+            TXmlEngElement AND = XOR.AddNewElementSameNsL(WSPolicy::KAndCompositeAssertion);
+            
+            TXmlEngElement andEleF = andListFirst.Next();
+            
+            TPtrC8 localName = andEleF.TagName();
+            //find all assertions in this AND element
+            
+            
+            IntersectCompareSecondAssertionsL(andEleF, pXORSec, AND);
+        }
+  
+    }
+    
+
+    return XOR;
+    
+}
+
+TXmlEngElement CPolicyIntersecter::IntersectCompareSecondAssertionsL(TXmlEngElement aFirstElement, TXmlEngElement aSecondElement, TXmlEngElement aIntersectedAND)
+{
+
+    RXmlEngNodeList<TXmlEngElement> assertionListF; //get all of first assrtions
+    aFirstElement.GetChildElements(assertionListF);
+
+    RXmlEngNodeList<TXmlEngElement> andListSec; //get all of AND elements
+    aSecondElement.GetElementsByTagNameL(andListSec, WSPolicy::KAndCompositeAssertion, WSPolicy::KWsPolicyNsUri);
+    
+    RArray<TXmlEngElement> result;
+    while(andListSec.HasNext())
+    {
+    //for every of AND element, loop for every AND element in first policy
+        TXmlEngElement andEleS = andListSec.Next();
+        
+        TPtrC8 localNameS = andEleS.TagName();
+        //find all assertions in this AND element
+        
+        RXmlEngNodeList<TXmlEngElement> assertionListS; //get the only xor element
+        andEleS.GetChildElements(assertionListS);
+        //RESOLVE all assertion from same AND element  
+
+         IntersectAllANDAssertionsL(aFirstElement, andEleS, result);
+         if(result.Count() > 0)             
+         {
+           for (TInt i = 0; i<result.Count(); i++) 
+           {
+           TXmlEngElement resultEle = result[i].CopyL();
+           aIntersectedAND.AppendChildL(resultEle);
+           }
+           result.Reset();
+         }
+        //if result then we have merged policy else we have NULL here
+         
+    }
+    return NULL;
+}
+void CPolicyIntersecter::IntersectAllANDAssertionsL(TXmlEngElement aFirstElement, TXmlEngElement aSecondElement, RArray<TXmlEngElement>& aResult)
+{
+    TInt outcount = 0;
+    TInt inCount = 0;
+
+    RXmlEngNodeList<TXmlEngElement> assertionListF; //get all of first assrtions
+    aFirstElement.GetChildElements(assertionListF);
+    
+    while (assertionListF.HasNext())
+    {
+        TXmlEngElement assertionFirst = assertionListF.Next();
+
+        TPtrC8 localName1 = assertionFirst.TagName();
+        
+        outcount++;
+
+        RXmlEngNodeList<TXmlEngElement> assertionListS; //get all of AND elements
+        aSecondElement.GetChildElements(assertionListS);
+
+        while(assertionListS.HasNext())
+        {
+            TXmlEngElement assertionSecond = assertionListS.Next();
+
+            TPtrC8 localName2 = assertionSecond.TagName();
+            inCount++;
+            if((localName1.Compare(localName2) == 0) && 
+            VerifyNamespace(assertionFirst, assertionSecond))            
+            {
+                //call domain specific policy to resolve
+                //check the namespaces here to find which domain we need to process
+                //both namespaces should be checked and if they are same then we can intersect them
+
+                TPtrC8 namespaceUri1 = assertionFirst.NamespaceUri();
+
+                //if its ws security policy
+                if(namespaceUri1.Compare(KWsSecurityPolicyNsUri) == 0)
+                {
+/*                
+                    TXmlEngElement result = iSecurityPolicyDomain->Intersect(localName1, assertionFirst, assertionSecond);
+                    if(result.NotNull())
+                    {
+                        aResult.Append(assertionFirst);
+                        aResult.Append(assertionSecond);
+                    }
+*/                    
+                }                
+            }
+        }
+        
+    }
+}
+
+TInt CPolicyIntersecter::VerifyNamespace(TXmlEngElement aFirstElement, TXmlEngElement aSecondElement)
+{
+
+    TPtrC8 namespaceUri1 = aFirstElement.NamespaceUri();
+    TPtrC8 namespaceUri2 = aSecondElement.NamespaceUri();
+
+    if(namespaceUri1 != KNullDesC8() && namespaceUri2 != KNullDesC8())
+    {
+      if(namespaceUri1.Compare(namespaceUri2) == 0)
+        return ETrue;  
+    }
+
+  return KErrNotFound;  
+}