--- /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;
+}