Author: sanka
Date: Sun Apr 16 12:17:52 2006
New Revision: 394545
URL: http://svn.apache.org/viewcvs?rev=394545&view=rev
Log:
Fixed few minor defects
Added WSDLPolicyProcessor which provides WSDL PolicyAttachment support
Added:
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/attachment/
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/attachment/WSDLPolicyProcessor.java
Modified:
webservices/commons/trunk/modules/policy/project.properties
webservices/commons/trunk/modules/policy/project.xml
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/AbstractAssertion.java
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/Assertion.java
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/PolicyReference.java
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/XorCompositeAssertion.java
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/util/OMPolicyReader.java
webservices/commons/trunk/modules/policy/test-resources/merged/Policy22-21.xml
Modified: webservices/commons/trunk/modules/policy/project.properties
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/project.properties?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
--- webservices/commons/trunk/modules/policy/project.properties (original)
+++ webservices/commons/trunk/modules/policy/project.properties Sun Apr 16
12:17:52 2006
@@ -19,6 +19,7 @@
policy.version=SNAPSHOT
axiom.version=SNAPSHOT
+axis.wsdl4j.version=1.2
stax.api.version=1.0
stax.impl.groupid=stax
stax.impl.artifactid=stax
Modified: webservices/commons/trunk/modules/policy/project.xml
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/project.xml?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
--- webservices/commons/trunk/modules/policy/project.xml (original)
+++ webservices/commons/trunk/modules/policy/project.xml Sun Apr 16 12:17:52
2006
@@ -127,6 +127,14 @@
<module>true</module>
</properties>
</dependency>
+ <dependency>
+ <groupId>axis</groupId>
+ <artifactId>axis-wsdl4j</artifactId>
+ <version>${axis.wsdl4j.version}</version>
+ <properties>
+ <module>true</module>
+ </properties>
+ </dependency>
</dependencies>
<!-- build information for the project -->
Modified:
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/AbstractAssertion.java
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/AbstractAssertion.java?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
---
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/AbstractAssertion.java
(original)
+++
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/AbstractAssertion.java
Sun Apr 16 12:17:52 2006
@@ -35,6 +35,12 @@
/** To refer to the parent of this assertion */
protected Assertion parent = null;
+
+ /** To store the description of the origin of the assertion */
+ protected String source = null;
+
+ /** To store the line no of the assertion in the file */
+ protected int lineNo = -1;
/**
*
@@ -182,4 +188,20 @@
public int size() {
return childTerms.size();
}
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setLineNo(int lineNo) {
+ this.lineNo = lineNo;
+ }
+
+ public int getLineNo() {
+ return lineNo;
+ }
}
Modified:
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/Assertion.java
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/Assertion.java?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
---
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/Assertion.java
(original)
+++
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/Assertion.java
Sun Apr 16 12:17:52 2006
@@ -216,4 +216,40 @@
*/
public short getType();
+ /**
+ * Returns a string which describes the source of the assertion. For
+ * instance name of the policy file that contains the assertion. Returns
+ * null if it is not set.
+ *
+ * @return a string that describe the origin of the assertion.
+ */
+ public String getSource();
+
+ /**
+ * Sets specified string as the source of the assertion.
+ *
+ * @param source
+ * the string which describe the source of the origin of the
+ * assertion
+ */
+ public void setSource(String source);
+
+ /**
+ * Returns the line no of the assertion which is line no of the
assertion in
+ * the file where the assertion is first read. came from. Returns -1 if
it
+ * is not set.
+ *
+ * @return the line no of the assertion in file where the assertion is
first
+ * read.
+ */
+ public int getLineNo();
+
+ /**
+ * Sets the line no of the assertion which should be the line no of the
+ * assertion in the file where the assertion is first read.
+ *
+ * @param lineNo
+ */
+ public void setLineNo(int lineNo);
+
}
Modified:
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/PolicyReference.java
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/PolicyReference.java?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
---
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/PolicyReference.java
(original)
+++
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/PolicyReference.java
Sun Apr 16 12:17:52 2006
@@ -34,6 +34,12 @@
private String PolicyURIString = null;
private Assertion parent = null;
+
+ /** To store the description of the origin of the assertion */
+ protected String source = null;
+
+ /** To store the line no of the assertion in the file */
+ protected int lineNo = -1;
/**
* Constructs a PolicyReferece object which refers to the Policy which
is
@@ -105,7 +111,7 @@
}
public boolean isNormalized() {
- throw new UnsupportedOperationException();
+ return false;
}
public void setNormalized(boolean flag) {
@@ -143,5 +149,21 @@
*/
public final short getType() {
return Assertion.POLIY_REFERCE_TYPE;
- }
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setLineNo(int lineNo) {
+ this.lineNo = lineNo;
+ }
+
+ public int getLineNo() {
+ return lineNo;
+ }
}
Modified:
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/XorCompositeAssertion.java
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/XorCompositeAssertion.java?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
---
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/XorCompositeAssertion.java
(original)
+++
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/XorCompositeAssertion.java
Sun Apr 16 12:17:52 2006
@@ -224,15 +224,6 @@
.hasNext();) {
nXOR.addTerm(AND.merge((Assertion)
iterator2.next()));
}
-
- if (target.isEmpty() && AND.isEmpty()) { //
FIXME is this a
- // hack?
- /*
- * " <wsp:ExactlyOne> <wsp:All/>
- * </wsp:ExactlyOne>".intersect("
<wsp:ExactlyOne/>")
- */
- nXOR.addTerm(AND);
- }
}
return nXOR;
Added:
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/attachment/WSDLPolicyProcessor.java
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/attachment/WSDLPolicyProcessor.java?rev=394545&view=auto
==============================================================================
---
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/attachment/WSDLPolicyProcessor.java
(added)
+++
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/attachment/WSDLPolicyProcessor.java
Sun Apr 16 12:17:52 2006
@@ -0,0 +1,379 @@
+package org.apache.ws.policy.attachment;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.wsdl.Binding;
+import javax.wsdl.BindingFault;
+import javax.wsdl.BindingInput;
+import javax.wsdl.BindingOperation;
+import javax.wsdl.BindingOutput;
+import javax.wsdl.Definition;
+import javax.wsdl.Fault;
+import javax.wsdl.Input;
+import javax.wsdl.Message;
+import javax.wsdl.Operation;
+import javax.wsdl.Output;
+import javax.wsdl.Port;
+import javax.wsdl.PortType;
+import javax.wsdl.Service;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.UnknownExtensibilityElement;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.ws.policy.Policy;
+import org.apache.ws.policy.PolicyConstants;
+import org.apache.ws.policy.PolicyReference;
+import org.apache.ws.policy.util.DOMPolicyReader;
+import org.apache.ws.policy.util.PolicyFactory;
+import org.apache.ws.policy.util.PolicyRegistry;
+import org.w3c.dom.Document;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class WSDLPolicyProcessor {
+
+ private static final QName POLICY = new QName(
+ PolicyConstants.WS_POLICY_NAMESPACE_URI,
PolicyConstants.WS_POLICY);
+
+ private static final QName POLICY_REF = new QName(
+ PolicyConstants.WS_POLICY_NAMESPACE_URI,
+ PolicyConstants.WS_POLICY_REFERENCE);
+
+ Definition wsdl4jDefinition = null;
+
+ PolicyRegistry registry = null;
+
+ DOMPolicyReader prdr = null;
+
+ public WSDLPolicyProcessor(InputStream in) throws WSDLException {
+ this(in, null);
+ }
+
+ public WSDLPolicyProcessor(InputStream in, PolicyRegistry registry)
+ throws WSDLException {
+ if (registry != null) {
+ this.registry = registry;
+ }
+
+ try {
+ DocumentBuilderFactory builderFactory =
DocumentBuilderFactory
+ .newInstance();
+ builderFactory.setNamespaceAware(true);
+ Document doc =
builderFactory.newDocumentBuilder().parse(in);
+
+ WSDLFactory wsdlFactory = WSDLFactory.newInstance();
+ WSDLReader reader = wsdlFactory.newWSDLReader();
+
+ wsdl4jDefinition = reader.readWSDL(null, doc);
+
+ registry = new PolicyRegistry();
+
+ prdr = (DOMPolicyReader) PolicyFactory
+
.getPolicyReader(PolicyFactory.DOM_POLICY_READER);
+
+ processDefinition(wsdl4jDefinition);
+
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public Policy getEffectiveServicePolicy(QName service) {
+ Service wsdl4jService = wsdl4jDefinition.getService(service);
+
+ List policyList = getPoliciesAsExtElements(wsdl4jService
+ .getExtensibilityElements());
+
+ return getEffectivePolicy(policyList);
+ }
+
+ public Policy getEffectiveEndpointPolicy(QName service, String port) {
+ Service wsdl4jService = wsdl4jDefinition.getService(service);
+ if (wsdl4jService == null) {
+ throw new IllegalArgumentException("invalid service
name");
+ }
+
+ Port wsdl4jPort = wsdl4jService.getPort(port);
+ if (wsdl4jPort == null) {
+ throw new RuntimeException("invalid port name");
+ }
+
+ ArrayList policyList = new ArrayList();
+
+ policyList.addAll(getPoliciesAsExtElements(wsdl4jPort
+ .getExtensibilityElements()));
+
+ Binding wsdl4jBinding = wsdl4jPort.getBinding();
+ policyList.addAll(getPoliciesAsExtElements(wsdl4jBinding
+ .getExtensibilityElements()));
+
+ PortType wsdl4jPortType = wsdl4jBinding.getPortType();
+ policyList.addAll(getPoliciesAsExtAttributes(wsdl4jPortType
+ .getExtensionAttributes()));
+
+ return getEffectivePolicy(policyList);
+ }
+
+ public Policy getEffectiveOperationPolicy(QName service, String
portName,
+ String opName) {
+ Service wsdl4jService = wsdl4jDefinition.getService(service);
+ if (wsdl4jService == null) {
+ throw new IllegalArgumentException("invalid service
name");
+ }
+
+ Port wsdl4jPort = wsdl4jService.getPort(portName);
+ if (wsdl4jPort == null) {
+ throw new IllegalArgumentException("invalid port name");
+ }
+
+ Binding wsdl4jBinding = wsdl4jPort.getBinding();
+ BindingOperation wsdl4jBindingOperation = wsdl4jBinding
+ .getBindingOperation(opName, null, null);
+ if (wsdl4jBindingOperation == null) {
+ throw new IllegalArgumentException("invalid binding
name");
+ }
+
+ ArrayList policyList = new ArrayList();
+
policyList.addAll(getPoliciesAsExtElements(wsdl4jBindingOperation
+ .getExtensibilityElements()));
+
+ Operation wsdl4jOperation =
wsdl4jBindingOperation.getOperation();
+ policyList.addAll(getPoliciesAsExtElements(wsdl4jOperation
+ .getExtensibilityElements()));
+
+ return getEffectivePolicy(policyList);
+ }
+
+ public Policy getEffectiveInputPolicy(QName service, String portName,
String opName) {
+ Service wsdl4jService = wsdl4jDefinition.getService(service);
+ if (wsdl4jService == null) {
+ throw new IllegalArgumentException("invalid service name");
+ }
+
+ Port wsdl4jPort = wsdl4jService.getPort(portName);
+ if (wsdl4jPort == null) {
+ throw new IllegalArgumentException("invalid port name");
+ }
+
+ Binding wsdl4jBinding = wsdl4jPort.getBinding();
+ BindingOperation wsdl4jBindingOperation = wsdl4jBinding
+ .getBindingOperation(opName, null, null);
+ if (wsdl4jBindingOperation == null) {
+ throw new IllegalArgumentException("invalid binding name");
+ }
+
+ ArrayList policyList = new ArrayList();
+ BindingInput wsdl4jBindingInput =
wsdl4jBindingOperation.getBindingInput();
+
policyList.addAll(getPoliciesAsExtElements(wsdl4jBindingInput.getExtensibilityElements()));
+
+ Operation wsdl4jOperation = wsdl4jBindingOperation.getOperation();
+ Input wsdl4jInput = wsdl4jOperation.getInput();
+
policyList.addAll(getPoliciesAsExtAttributes(wsdl4jInput.getExtensionAttributes()));
+
+ Message wsdl4jMessage = wsdl4jInput.getMessage();
+
policyList.addAll(getPoliciesAsExtElements(wsdl4jMessage.getExtensibilityElements()));
+
+
+ return getEffectivePolicy(policyList);
+ }
+
+ public Policy getEffectiveOutputPolicy(QName service, String portName,
String opName) {
+
+ Service wsdl4jService = wsdl4jDefinition.getService(service);
+ if (wsdl4jService == null) {
+ throw new IllegalArgumentException("invalid service name");
+ }
+
+ Port wsdl4jPort = wsdl4jService.getPort(portName);
+ if (wsdl4jPort == null) {
+ throw new IllegalArgumentException("invalid port name");
+ }
+
+ Binding wsdl4jBinding = wsdl4jPort.getBinding();
+ BindingOperation wsdl4jBindingOperation = wsdl4jBinding
+ .getBindingOperation(opName, null, null);
+ if (wsdl4jBindingOperation == null) {
+ throw new IllegalArgumentException("invalid binding name");
+ }
+
+ ArrayList policyList = new ArrayList();
+ BindingOutput wsdl4jBindingOutput =
wsdl4jBindingOperation.getBindingOutput();
+
policyList.addAll(getPoliciesAsExtElements(wsdl4jBindingOutput.getExtensibilityElements()));
+
+ Operation wsdl4jOperation = wsdl4jBindingOperation.getOperation();
+ Output wsdl4jOutput = wsdl4jOperation.getOutput();
+
policyList.addAll(getPoliciesAsExtAttributes(wsdl4jOutput.getExtensionAttributes()));
+
+ Message wsdl4jMessage = wsdl4jOutput.getMessage();
+
policyList.addAll(getPoliciesAsExtElements(wsdl4jMessage.getExtensibilityElements()));
+
+ return getEffectivePolicy(policyList);
+ }
+
+ public Policy getEffectiveFaultPolicy(QName service, String portName,
String opName) {
+
+ Service wsdl4jService = wsdl4jDefinition.getService(service);
+ if (wsdl4jService == null) {
+ throw new IllegalArgumentException("invalid service name");
+ }
+
+ Port wsdl4jPort = wsdl4jService.getPort(portName);
+ if (wsdl4jPort == null) {
+ throw new IllegalArgumentException("invalid port name");
+ }
+
+ Binding wsdl4jBinding = wsdl4jPort.getBinding();
+ BindingOperation wsdl4jBindingOperation = wsdl4jBinding
+ .getBindingOperation(opName, null, null);
+ if (wsdl4jBindingOperation == null) {
+ throw new IllegalArgumentException("invalid binding name");
+ }
+
+ ArrayList policyList = new ArrayList();
+ Map wsdl4jBindingFaults = wsdl4jBindingOperation.getBindingFaults();
+ Iterator iterator = wsdl4jBindingFaults.values().iterator();
+
+ if (! iterator.hasNext()) {
+ throw new RuntimeException("can't find any faults");
+ }
+
+ BindingFault wsdl4jBindingFault = (BindingFault) iterator.next();
+
policyList.addAll(getPoliciesAsExtElements(wsdl4jBindingFault.getExtensibilityElements()));
+
+ Operation wsdl4jOperation = wsdl4jBindingOperation.getOperation();
+ Fault wsdl4jFault =
wsdl4jOperation.getFault(wsdl4jBindingFault.getName());
+
policyList.addAll(getPoliciesAsExtAttributes(wsdl4jFault.getExtensionAttributes()));
+
+ Message wsdl4jMessage = wsdl4jFault.getMessage();
+
policyList.addAll(getPoliciesAsExtElements(wsdl4jMessage.getExtensibilityElements()));
+
+ return getEffectivePolicy(policyList);
+ }
+
+ private Policy getEffectivePolicy(List policyList) {
+ Policy policy = null;
+ Object policyElement;
+ ;
+
+ for (Iterator iterator = policyList.iterator();
iterator.hasNext();) {
+ policyElement = iterator.next();
+ if (policyElement instanceof Policy) {
+ policy = (policy == null) ? (Policy)
policyElement
+ : (Policy)
policy.merge((Policy) policyElement,
+ registry);
+
+ } else if (policyElement instanceof PolicyReference) {
+ policy = (policy == null) ? (Policy)
((PolicyReference) policyElement)
+ .normalize(registry)
+ : (Policy) policy.merge(
+
(PolicyReference) policyElement, registry);
+
+ }
+ }
+
+ if (!policy.isNormalized()) {
+ policy = (Policy) policy.normalize(registry);
+ }
+
+ return policy;
+
+ }
+
+ private void processDefinition(Definition wsdl4jDefinition) {
+ registerPoliciesAsExtElements(wsdl4jDefinition
+ .getExtensibilityElements());
+ }
+
+ private void registerPoliciesAsExtElements(List extElements) {
+ Object extElement;
+ UnknownExtensibilityElement unknown;
+
+ for (Iterator iterator = extElements.iterator();
iterator.hasNext();) {
+ extElement = iterator.next();
+
+ if (extElement instanceof UnknownExtensibilityElement) {
+ unknown = (UnknownExtensibilityElement)
extElement;
+
+ if (POLICY.equals(unknown.getElementType())) {
+ Policy p =
prdr.readPolicy(unknown.getElement());
+
+ if (p.getPolicyURI() != null) {
+
registry.register(p.getPolicyURI(), p);
+ }
+ }
+ }
+ }
+ }
+
+ private List getPoliciesAsExtElements(List extElements) {
+ ArrayList policyList = new ArrayList();
+
+ Object extElement;
+ UnknownExtensibilityElement unknown;
+
+ for (Iterator iterator = extElements.iterator();
iterator.hasNext();) {
+ extElement = iterator.next();
+
+ if (extElement instanceof UnknownExtensibilityElement) {
+ unknown = (UnknownExtensibilityElement)
extElement;
+
+ if (POLICY.equals(unknown.getElementType())) {
+
+ Policy p =
prdr.readPolicy(unknown.getElement());
+ policyList.add(p);
+
+ } else if
(POLICY_REF.equals(unknown.getElementType())) {
+ PolicyReference ref =
prdr.readPolicyReference(unknown
+ .getElement());
+ policyList.add(ref);
+ }
+ }
+ }
+
+ return policyList;
+ }
+
+ private List getPoliciesAsExtAttributes(Map extAttributes) {
+ ArrayList policyList = new ArrayList();
+ QName PolicyURIs = (QName) extAttributes.get(new QName(
+ PolicyConstants.WS_POLICY_NAMESPACE_URI,
"PolicyURIs"));
+
+ if (PolicyURIs != null) {
+ String[] URIs = PolicyURIs.getLocalPart().split(" ");
+ Policy policy;
+
+ for (int i = 0; i < URIs.length; i++) {
+ policy = registry.lookup(URIs[i]);
+
+ if (policy == null) {
+ throw new RuntimeException("cannot
resolve : " + URIs[i]);
+ }
+
+ policyList.add(policy);
+ }
+ }
+
+ return policyList;
+ }
+}
\ No newline at end of file
Modified:
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/util/OMPolicyReader.java
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/util/OMPolicyReader.java?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
---
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/util/OMPolicyReader.java
(original)
+++
webservices/commons/trunk/modules/policy/src/org/apache/ws/policy/util/OMPolicyReader.java
Sun Apr 16 12:17:52 2006
@@ -51,6 +51,7 @@
public Policy readPolicy(InputStream in) {
try {
+
XMLStreamReader reader = XMLInputFactory.newInstance()
.createXMLStreamReader(in);
OMXMLParserWrapper builder = OMXMLBuilderFactory
@@ -66,6 +67,7 @@
}
private Assertion readAssertion(OMElement element) {
+
String namespace = element.getNamespace().getName();
String localName = element.getLocalName();
Modified:
webservices/commons/trunk/modules/policy/test-resources/merged/Policy22-21.xml
URL:
http://svn.apache.org/viewcvs/webservices/commons/trunk/modules/policy/test-resources/merged/Policy22-21.xml?rev=394545&r1=394544&r2=394545&view=diff
==============================================================================
---
webservices/commons/trunk/modules/policy/test-resources/merged/Policy22-21.xml
(original)
+++
webservices/commons/trunk/modules/policy/test-resources/merged/Policy22-21.xml
Sun Apr 16 12:17:52 2006
@@ -1 +1,3 @@
-<wsp:Policy
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"><wsp:ExactlyOne><wsp:All/></wsp:ExactlyOne></wsp:Policy>
\ No newline at end of file
+<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
+ <wsp:ExactlyOne />
+</wsp:Policy>
\ No newline at end of file