001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */package org.apache.cxf.ws.policy.builder.primitive;
019:
020: import java.util.Iterator;
021: import java.util.List;
022: import java.util.ResourceBundle;
023:
024: import javax.xml.namespace.QName;
025:
026: import org.w3c.dom.Element;
027: import org.w3c.dom.Node;
028:
029: import org.apache.cxf.common.i18n.BundleUtils;
030: import org.apache.cxf.common.i18n.Message;
031: import org.apache.cxf.helpers.CastUtils;
032: import org.apache.cxf.ws.policy.PolicyBuilder;
033: import org.apache.cxf.ws.policy.PolicyConstants;
034: import org.apache.cxf.ws.policy.PolicyException;
035: import org.apache.neethi.All;
036: import org.apache.neethi.Assertion;
037: import org.apache.neethi.ExactlyOne;
038: import org.apache.neethi.Policy;
039: import org.apache.neethi.PolicyComponent;
040:
041: /**
042: * Implementation of an assertion that required exactly one (possibly empty) child element
043: * of type Policy (as does for examples the wsam:Addressing assertion).
044: *
045: */
046: public class NestedPrimitiveAssertion extends PrimitiveAssertion {
047:
048: private static final ResourceBundle BUNDLE = BundleUtils
049: .getBundle(NestedPrimitiveAssertion.class);
050: private Policy nested;
051:
052: protected NestedPrimitiveAssertion(QName name, boolean optional) {
053: super (name, optional);
054: }
055:
056: public NestedPrimitiveAssertion(Element elem,
057: PolicyBuilder builder, PolicyConstants constants) {
058: super (elem, constants);
059:
060: // expect exactly one child element of type Policy
061:
062: Element policyElem = null;
063: for (Node nd = elem.getFirstChild(); nd != null; nd = nd
064: .getNextSibling()) {
065: if (Node.ELEMENT_NODE == nd.getNodeType()) {
066: QName qn = new QName(nd.getNamespaceURI(), nd
067: .getLocalName());
068: if (constants.getPolicyElemQName().equals(qn)
069: && null == policyElem) {
070: policyElem = (Element) nd;
071: } else {
072: throw new PolicyException(new Message(
073: "UNEXPECTED_CHILD_ELEMENT_EXC", BUNDLE,
074: constants.getPolicyElemQName()));
075: }
076: }
077: }
078: if (null == policyElem) {
079: throw new PolicyException(new Message(
080: "UNEXPECTED_CHILD_ELEMENT_EXC", BUNDLE, constants
081: .getPolicyElemQName()));
082: }
083:
084: nested = builder.getPolicy(policyElem);
085: }
086:
087: public PolicyComponent normalize() {
088: Policy normalisedNested = (Policy) nested.normalize(true);
089:
090: Policy p = new Policy();
091: ExactlyOne ea = new ExactlyOne();
092: p.addPolicyComponent(ea);
093: if (isOptional()) {
094: ea.addPolicyComponent(new All());
095: }
096: // for all alternatives in normalised nested policy
097: Iterator alternatives = normalisedNested.getAlternatives();
098: while (alternatives.hasNext()) {
099: All all = new All();
100: List<Assertion> alternative = CastUtils.cast(
101: (List) alternatives.next(), Assertion.class);
102: NestedPrimitiveAssertion a = new NestedPrimitiveAssertion(
103: getName(), false);
104: a.nested = new Policy();
105: ExactlyOne nea = new ExactlyOne();
106: a.nested.addPolicyComponent(nea);
107: All na = new All();
108: nea.addPolicyComponent(na);
109: na.addPolicyComponents(alternative);
110: all.addPolicyComponent(a);
111: ea.addPolicyComponent(all);
112: }
113: return p;
114: }
115:
116: public Policy getNested() {
117: return nested;
118: }
119:
120: @Override
121: public boolean equal(PolicyComponent policyComponent) {
122: if (!super .equal(policyComponent)) {
123: return false;
124: }
125: NestedPrimitiveAssertion other = (NestedPrimitiveAssertion) policyComponent;
126: return getNested().equal(other.getNested());
127: }
128:
129: protected void setNested(Policy n) {
130: nested = n;
131: }
132:
133: }
|