1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.wss4j.policy.builders;
20
21 import org.apache.neethi.Assertion;
22 import org.apache.neethi.AssertionBuilderFactory;
23 import org.apache.neethi.builders.AssertionBuilder;
24 import org.apache.wss4j.policy.SP13Constants;
25 import org.apache.wss4j.policy.SPConstants;
26 import org.apache.wss4j.policy.SPUtils;
27 import org.apache.wss4j.policy.model.Header;
28 import org.apache.wss4j.policy.model.RequiredParts;
29 import org.w3c.dom.Element;
30
31 import javax.xml.namespace.QName;
32 import java.util.ArrayList;
33 import java.util.List;
34
35 public class RequiredPartsBuilder implements AssertionBuilder<Element> {
36
37 @Override
38 public Assertion build(Element element, AssertionBuilderFactory factory) throws IllegalArgumentException {
39
40 final SPConstants.SPVersion spVersion = SPConstants.SPVersion.getSPVersion(element.getNamespaceURI());
41
42 final List<Header> headers = getHeaders(element, false, spVersion);
43 RequiredParts requiredParts = new RequiredParts(spVersion, headers);
44 requiredParts.setOptional(SPUtils.isOptional(element));
45 requiredParts.setIgnorable(SPUtils.isIgnorable(element));
46 return requiredParts;
47 }
48
49 protected List<Header> getHeaders(Element element, boolean ignoreNameElement, SPConstants.SPVersion spVersion) {
50 List<Header> headers = new ArrayList<>();
51 Element child = SPUtils.getFirstChildElement(element);
52 while (child != null) {
53 if (SPConstants.HEADER.equals(child.getLocalName())
54 && spVersion.getNamespace().equals(child.getNamespaceURI())) {
55 String headerName = child.getAttributeNS(null, SPConstants.NAME);
56 if (headerName.length() == 0) {
57 if (ignoreNameElement) {
58 headerName = null;
59 } else {
60 throw new IllegalArgumentException("sp:" + element.getLocalName()
61 + "/sp:" + child.getLocalName() + " must have a Name attribute");
62 }
63 }
64 String headerNamespace = child.getAttributeNS(null, SPConstants.NAMESPACE);
65 if (headerNamespace == null || headerNamespace.length() == 0) {
66 throw new IllegalArgumentException(SPConstants.ERR_INVALID_POLICY);
67 }
68 headers.add(new Header(headerName, headerNamespace));
69 }
70 child = SPUtils.getNextSiblingElement(child);
71 }
72 return headers;
73 }
74
75 @Override
76 public QName[] getKnownElements() {
77 return new QName[]{SP13Constants.REQUIRED_PARTS};
78 }
79 }