/* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.xml.internal.ws.policy.jaxws; import com.sun.xml.internal.ws.api.model.wsdl.WSDLObject; import com.sun.xml.internal.ws.api.model.wsdl.editable.*; import com.sun.xml.internal.ws.api.wsdl.parser.WSDLParserExtension; import com.sun.xml.internal.ws.api.wsdl.parser.WSDLParserExtensionContext; import com.sun.xml.internal.ws.api.policy.PolicyResolver; import com.sun.xml.internal.ws.resources.PolicyMessages; import com.sun.xml.internal.ws.policy.jaxws.SafePolicyReader.PolicyRecord; import com.sun.xml.internal.ws.policy.privateutil.PolicyLogger; import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import com.sun.xml.internal.ws.policy.sourcemodel.PolicySourceModel; import com.sun.xml.internal.ws.policy.sourcemodel.PolicySourceModelContext; import com.sun.xml.internal.ws.policy.sourcemodel.wspolicy.NamespaceVersion; import com.sun.xml.internal.ws.policy.sourcemodel.wspolicy.XmlToken; import com.sun.xml.internal.ws.policy.PolicyException; import com.sun.xml.internal.ws.policy.PolicyMap; import com.sun.xml.internal.ws.util.xml.XmlUtil; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import java.util.HashSet; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.ws.WebServiceException; /** * This class parses the Policy Attachments in the WSDL and creates a PolicyMap thaty captures the policies configured on * different PolicySubjects in the wsdl. * * After, it is finished it sets the PolicyMap on the WSDLModel. * * @author Jakub Podlesak (jakub.podlesak at sun.com) * @author Fabian Ritzmann * @author Rama Pulavarthi */ final public class PolicyWSDLParserExtension extends WSDLParserExtension { enum HandlerType { PolicyUri, AnonymousPolicyId } final static class PolicyRecordHandler { String handler; HandlerType type; PolicyRecordHandler(HandlerType type, String handler) { this.type = type; this.handler = handler; } HandlerType getType() { return type; } String getHandler() { return handler; } } private static final PolicyLogger LOGGER = PolicyLogger.getLogger(PolicyWSDLParserExtension.class); //anonymous policy id prefix private static final StringBuffer AnonymnousPolicyIdPrefix = new StringBuffer("#__anonymousPolicy__ID"); // anonymous policies count private int anonymousPoliciesCount; private final SafePolicyReader policyReader = new SafePolicyReader(); // policy queue -- needed for evaluating the right order policy of policy models expansion private PolicyRecord expandQueueHead = null; // storage for policy models with an id passed by private Map<String,PolicyRecord> policyRecordsPassedBy = null; // storage for anonymous policies defined within given WSDL private Map<String,PolicySourceModel> anonymousPolicyModels = null; // container for URIs of policies referenced private List<String> unresolvedUris = null; // structures for policies really needed to build a map private final LinkedList<String> urisNeeded = new LinkedList<String>(); private final Map<String, PolicySourceModel> modelsNeeded = new HashMap<String, PolicySourceModel>(); // lookup tables for Policy attachments found private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4ServiceMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4PortMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4PortTypeMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4BindingMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4BoundOperationMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4OperationMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4MessageMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4InputMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4OutputMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4FaultMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4BindingInputOpMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4BindingOutputOpMap = null; private Map<WSDLObject, Collection<PolicyRecordHandler>> handlers4BindingFaultOpMap = null; private PolicyMapBuilder policyBuilder = new PolicyMapBuilder(); private boolean isPolicyProcessed(final String policyUri) { return modelsNeeded.containsKey(policyUri); } private void addNewPolicyNeeded(final String policyUri, final PolicySourceModel policyModel) { if (!modelsNeeded.containsKey(policyUri)) { modelsNeeded.put(policyUri, policyModel); urisNeeded.addFirst(policyUri); } } private Map<String, PolicySourceModel> getPolicyModels() { return modelsNeeded; } private Map<String,PolicyRecord> getPolicyRecordsPassedBy() { if (null==policyRecordsPassedBy) { policyRecordsPassedBy = new HashMap<String,PolicyRecord>(); } return policyRecordsPassedBy; } private Map<String,PolicySourceModel> getAnonymousPolicyModels() { if (null==anonymousPolicyModels) { anonymousPolicyModels = new HashMap<String,PolicySourceModel>(); } return anonymousPolicyModels; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4ServiceMap() { if (null==handlers4ServiceMap) { handlers4ServiceMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4ServiceMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4PortMap() { if (null==handlers4PortMap) { handlers4PortMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4PortMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4PortTypeMap() { if (null==handlers4PortTypeMap) { handlers4PortTypeMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4PortTypeMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4BindingMap() { if (null==handlers4BindingMap) { handlers4BindingMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4BindingMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4OperationMap() { if (null==handlers4OperationMap) { handlers4OperationMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4OperationMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4BoundOperationMap() { if (null==handlers4BoundOperationMap) { handlers4BoundOperationMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4BoundOperationMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4MessageMap() { if (null==handlers4MessageMap) { handlers4MessageMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4MessageMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4InputMap() { if (null==handlers4InputMap) { handlers4InputMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4InputMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4OutputMap() { if (null==handlers4OutputMap) { handlers4OutputMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4OutputMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4FaultMap() { if (null==handlers4FaultMap) { handlers4FaultMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4FaultMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4BindingInputOpMap() { if (null==handlers4BindingInputOpMap) { handlers4BindingInputOpMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4BindingInputOpMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4BindingOutputOpMap() { if (null==handlers4BindingOutputOpMap) { handlers4BindingOutputOpMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4BindingOutputOpMap; } private Map<WSDLObject, Collection<PolicyRecordHandler>> getHandlers4BindingFaultOpMap() { if (null==handlers4BindingFaultOpMap) { handlers4BindingFaultOpMap = new HashMap<WSDLObject,Collection<PolicyRecordHandler>>(); } return handlers4BindingFaultOpMap; } private List<String> getUnresolvedUris(final boolean emptyListNeeded) { if ((null == unresolvedUris) || emptyListNeeded) { unresolvedUris = new LinkedList<String>(); } return unresolvedUris; } private void policyRecToExpandQueue(final PolicyRecord policyRec) { if (null==expandQueueHead) { expandQueueHead = policyRec; } else { expandQueueHead = expandQueueHead.insert(policyRec); } } /** * Creates a new instance of PolicyWSDLParserExtension */ public PolicyWSDLParserExtension() { } private PolicyRecordHandler readSinglePolicy(final PolicyRecord policyRec, final boolean inner) { PolicyRecordHandler handler = null; String policyId = policyRec.policyModel.getPolicyId(); if (policyId == null) { policyId = policyRec.policyModel.getPolicyName(); } if (policyId != null) { // policy id defined, keep the policy handler = new PolicyRecordHandler(HandlerType.PolicyUri, policyRec.getUri()); getPolicyRecordsPassedBy().put(policyRec.getUri(), policyRec); policyRecToExpandQueue(policyRec); } else if (inner) { // no id given to the policy --> keep as an annonymous policy model final String anonymousId = AnonymnousPolicyIdPrefix.append(anonymousPoliciesCount++).toString(); handler = new PolicyRecordHandler(HandlerType.AnonymousPolicyId,anonymousId); getAnonymousPolicyModels().put(anonymousId, policyRec.policyModel); if (null != policyRec.unresolvedURIs) { getUnresolvedUris(false).addAll(policyRec.unresolvedURIs); } } return handler; } private void addHandlerToMap( final Map<WSDLObject, Collection<PolicyRecordHandler>> map, final WSDLObject key, final PolicyRecordHandler handler) { if (map.containsKey(key)) { map.get(key).add(handler); } else { final Collection<PolicyRecordHandler> newSet = new LinkedList<PolicyRecordHandler>(); newSet.add(handler); map.put(key,newSet); } } private String getBaseUrl(final String policyUri) { if (null == policyUri) { return null; } // TODO: encoded urls (escaped characters) might be a problem ? final int fragmentIdx = policyUri.indexOf('#'); return (fragmentIdx == -1) ? policyUri : policyUri.substring(0, fragmentIdx); } // adding current url even to locally referenced policies // in order to distinguish imported policies private void processReferenceUri( final String policyUri, final WSDLObject element, final XMLStreamReader reader, final Map<WSDLObject, Collection<PolicyRecordHandler>> map) { if (null == policyUri || policyUri.length() == 0) { return; } if ('#' != policyUri.charAt(0)) { // external uri (already) getUnresolvedUris(false).add(policyUri); } addHandlerToMap(map, element, new PolicyRecordHandler( HandlerType.PolicyUri, SafePolicyReader.relativeToAbsoluteUrl(policyUri, reader.getLocation().getSystemId()))); } private boolean processSubelement( final WSDLObject element, final XMLStreamReader reader, final Map<WSDLObject, Collection<PolicyRecordHandler>> map) { if (NamespaceVersion.resolveAsToken(reader.getName()) == XmlToken.PolicyReference) { // "PolicyReference" element interests us processReferenceUri(policyReader.readPolicyReferenceElement(reader), element, reader, map); return true; } else if (NamespaceVersion.resolveAsToken(reader.getName()) == XmlToken.Policy) { // policy could be defined here final PolicyRecordHandler handler = readSinglePolicy( policyReader.readPolicyElement( reader, (null == reader.getLocation().getSystemId()) ? // baseUrl "" : reader.getLocation().getSystemId()), true); if (null != handler) { // only policies with an Id can work for us addHandlerToMap(map, element, handler); } // endif null != handler return true; // element consumed }//end if Policy element found return false; } private void processAttributes(final WSDLObject element, final XMLStreamReader reader, final Map<WSDLObject, Collection<PolicyRecordHandler>> map) { final String[] uriArray = getPolicyURIsFromAttr(reader); if (null != uriArray) { for (String policyUri : uriArray) { processReferenceUri(policyUri, element, reader, map); } } } @Override public boolean portElements(final EditableWSDLPort port, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(port, reader, getHandlers4PortMap()); LOGGER.exiting(); return result; } @Override public void portAttributes(final EditableWSDLPort port, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(port, reader, getHandlers4PortMap()); LOGGER.exiting(); } @Override public boolean serviceElements(final EditableWSDLService service, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(service, reader, getHandlers4ServiceMap()); LOGGER.exiting(); return result; } @Override public void serviceAttributes(final EditableWSDLService service, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(service, reader, getHandlers4ServiceMap()); LOGGER.exiting(); } @Override public boolean definitionsElements(final XMLStreamReader reader){ LOGGER.entering(); if (NamespaceVersion.resolveAsToken(reader.getName()) == XmlToken.Policy) { // Only "Policy" element interests me readSinglePolicy( policyReader.readPolicyElement( reader, (null == reader.getLocation().getSystemId()) ? // baseUrl "" : reader.getLocation().getSystemId()), false); LOGGER.exiting(); return true; } LOGGER.exiting(); return false; } @Override public boolean bindingElements(final EditableWSDLBoundPortType binding, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(binding, reader, getHandlers4BindingMap()); LOGGER.exiting(); return result; } @Override public void bindingAttributes(final EditableWSDLBoundPortType binding, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(binding, reader, getHandlers4BindingMap()); LOGGER.exiting(); } @Override public boolean portTypeElements(final EditableWSDLPortType portType, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(portType, reader, getHandlers4PortTypeMap()); LOGGER.exiting(); return result; } @Override public void portTypeAttributes(final EditableWSDLPortType portType, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(portType, reader, getHandlers4PortTypeMap()); LOGGER.exiting(); } @Override public boolean portTypeOperationElements(final EditableWSDLOperation operation, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(operation, reader, getHandlers4OperationMap()); LOGGER.exiting(); return result; } @Override public void portTypeOperationAttributes(final EditableWSDLOperation operation, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(operation, reader, getHandlers4OperationMap()); LOGGER.exiting(); } @Override public boolean bindingOperationElements(final EditableWSDLBoundOperation boundOperation, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(boundOperation, reader, getHandlers4BoundOperationMap()); LOGGER.exiting(); return result; } @Override public void bindingOperationAttributes(final EditableWSDLBoundOperation boundOperation, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(boundOperation, reader, getHandlers4BoundOperationMap()); LOGGER.exiting(); } @Override public boolean messageElements(final EditableWSDLMessage msg, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(msg, reader, getHandlers4MessageMap()); LOGGER.exiting(); return result; } @Override public void messageAttributes(final EditableWSDLMessage msg, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(msg, reader, getHandlers4MessageMap()); LOGGER.exiting(); } @Override public boolean portTypeOperationInputElements(final EditableWSDLInput input, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(input, reader, getHandlers4InputMap()); LOGGER.exiting(); return result; } @Override public void portTypeOperationInputAttributes(final EditableWSDLInput input, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(input, reader, getHandlers4InputMap()); LOGGER.exiting(); } @Override public boolean portTypeOperationOutputElements(final EditableWSDLOutput output, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(output, reader, getHandlers4OutputMap()); LOGGER.exiting(); return result; } @Override public void portTypeOperationOutputAttributes(final EditableWSDLOutput output, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(output, reader, getHandlers4OutputMap()); LOGGER.exiting(); } @Override public boolean portTypeOperationFaultElements(final EditableWSDLFault fault, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(fault, reader, getHandlers4FaultMap()); LOGGER.exiting(); return result; } @Override public void portTypeOperationFaultAttributes(final EditableWSDLFault fault, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(fault, reader, getHandlers4FaultMap()); LOGGER.exiting(); } @Override public boolean bindingOperationInputElements(final EditableWSDLBoundOperation operation, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(operation, reader, getHandlers4BindingInputOpMap()); LOGGER.exiting(); return result; } @Override public void bindingOperationInputAttributes(final EditableWSDLBoundOperation operation, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(operation, reader, getHandlers4BindingInputOpMap()); LOGGER.exiting(); } @Override public boolean bindingOperationOutputElements(final EditableWSDLBoundOperation operation, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(operation, reader, getHandlers4BindingOutputOpMap()); LOGGER.exiting(); return result; } @Override public void bindingOperationOutputAttributes(final EditableWSDLBoundOperation operation, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(operation, reader, getHandlers4BindingOutputOpMap()); LOGGER.exiting(); } @Override public boolean bindingOperationFaultElements(final EditableWSDLBoundFault fault, final XMLStreamReader reader) { LOGGER.entering(); final boolean result = processSubelement(fault, reader, getHandlers4BindingFaultOpMap()); LOGGER.exiting(result); return result; } @Override public void bindingOperationFaultAttributes(final EditableWSDLBoundFault fault, final XMLStreamReader reader) { LOGGER.entering(); processAttributes(fault, reader, getHandlers4BindingFaultOpMap()); LOGGER.exiting(); } private PolicyMapBuilder getPolicyMapBuilder() { if (null == policyBuilder) { policyBuilder = new PolicyMapBuilder(); } return policyBuilder; } private Collection<String> getPolicyURIs( final Collection<PolicyRecordHandler> handlers, final PolicySourceModelContext modelContext) throws PolicyException{ final Collection<String> result = new ArrayList<String>(handlers.size()); String policyUri; for (PolicyRecordHandler handler : handlers) { policyUri = handler.handler; if (HandlerType.AnonymousPolicyId == handler.type) { final PolicySourceModel policyModel = getAnonymousPolicyModels().get(policyUri); policyModel.expand(modelContext); while (getPolicyModels().containsKey(policyUri)) { policyUri = AnonymnousPolicyIdPrefix.append(anonymousPoliciesCount++).toString(); } getPolicyModels().put(policyUri,policyModel); } result.add(policyUri); } return result; } private boolean readExternalFile(final String fileUrl) { InputStream ios = null; XMLStreamReader reader = null; try { final URL xmlURL = new URL(fileUrl); ios = xmlURL.openStream(); reader = XmlUtil.newXMLInputFactory(true).createXMLStreamReader(ios); while (reader.hasNext()) { if (reader.isStartElement() && NamespaceVersion.resolveAsToken(reader.getName()) == XmlToken.Policy) { readSinglePolicy(policyReader.readPolicyElement(reader, fileUrl), false); } reader.next(); } return true; } catch (IOException ioe) { return false; } catch (XMLStreamException xmlse) { return false; } finally { PolicyUtils.IO.closeResource(reader); PolicyUtils.IO.closeResource(ios); } } @Override public void finished(final WSDLParserExtensionContext context) { LOGGER.entering(context); // need to make sure proper beginning order of internal policies within unresolvedUris list if (null != expandQueueHead) { // any policies found final List<String> externalUris = getUnresolvedUris(false); // protect list of possible external policies getUnresolvedUris(true); // cleaning up the list only final LinkedList<String> baseUnresolvedUris = new LinkedList<String>(); for (PolicyRecord currentRec = expandQueueHead ; null != currentRec ; currentRec = currentRec.next) { baseUnresolvedUris.addFirst(currentRec.getUri()); } getUnresolvedUris(false).addAll(baseUnresolvedUris); expandQueueHead = null; // cut the queue off getUnresolvedUris(false).addAll(externalUris); } while (!getUnresolvedUris(false).isEmpty()) { final List<String> urisToBeSolvedList = getUnresolvedUris(false); getUnresolvedUris(true); // just cleaning up the list for (String currentUri : urisToBeSolvedList) { if (!isPolicyProcessed(currentUri)) { final PolicyRecord prefetchedRecord = getPolicyRecordsPassedBy().get(currentUri); if (null == prefetchedRecord) { if (policyReader.getUrlsRead().contains(getBaseUrl(currentUri))) { // --> unresolvable policy LOGGER.logSevereException(new PolicyException(PolicyMessages.WSP_1014_CAN_NOT_FIND_POLICY(currentUri))); } else { if (readExternalFile(getBaseUrl(currentUri))) { getUnresolvedUris(false).add(currentUri); } } } else { // policy has not been yet passed by if (null != prefetchedRecord.unresolvedURIs) { getUnresolvedUris(false).addAll(prefetchedRecord.unresolvedURIs); } // end-if null != prefetchedRecord.unresolvedURIs addNewPolicyNeeded(currentUri, prefetchedRecord.policyModel); } } // end-if policy already processed } // end-foreach unresolved uris } final PolicySourceModelContext modelContext = PolicySourceModelContext.createContext(); for (String policyUri : urisNeeded) { final PolicySourceModel sourceModel = modelsNeeded.get(policyUri); try { sourceModel.expand(modelContext); modelContext.addModel(new URI(policyUri), sourceModel); } catch (URISyntaxException e) { LOGGER.logSevereException(e); } catch (PolicyException e) { LOGGER.logSevereException(e); } } // Start-preparation of policy map builder // iterating over all services and binding all the policies read before try { // messageSet holds the handlers for all wsdl:message elements. There // may otherwise be multiple entries for policies that are contained // by fault messages. HashSet<BuilderHandlerMessageScope> messageSet = new HashSet<BuilderHandlerMessageScope>(); for (EditableWSDLService service : context.getWSDLModel().getServices().values()) { if (getHandlers4ServiceMap().containsKey(service)) { getPolicyMapBuilder().registerHandler(new BuilderHandlerServiceScope( getPolicyURIs(getHandlers4ServiceMap().get(service),modelContext) ,getPolicyModels() ,service ,service.getName())); } // end service scope for (EditableWSDLPort port : service.getPorts()) { if (getHandlers4PortMap().containsKey(port)) { getPolicyMapBuilder().registerHandler( new BuilderHandlerEndpointScope( getPolicyURIs(getHandlers4PortMap().get(port),modelContext) ,getPolicyModels() ,port ,port.getOwner().getName() ,port.getName())); } if ( // port.getBinding may not be null, but in case ... null != port.getBinding()) { if ( // handler for binding getHandlers4BindingMap().containsKey(port.getBinding())) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerEndpointScope( getPolicyURIs(getHandlers4BindingMap().get(port.getBinding()),modelContext) ,getPolicyModels() ,port.getBinding() ,service.getName() ,port.getName())); } // endif handler for binding if ( // handler for port type getHandlers4PortTypeMap().containsKey(port.getBinding().getPortType())) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerEndpointScope( getPolicyURIs(getHandlers4PortTypeMap().get(port.getBinding().getPortType()),modelContext) ,getPolicyModels() ,port.getBinding().getPortType() ,service.getName() ,port.getName())); } // endif handler for port type // end endpoint scope for (EditableWSDLBoundOperation boundOperation : port.getBinding().getBindingOperations()) { final EditableWSDLOperation operation = boundOperation.getOperation(); final QName operationName = new QName(boundOperation.getBoundPortType().getName().getNamespaceURI(), boundOperation.getName().getLocalPart()); // We store the message and portType/operation under the same namespace as the binding/operation so that we can match them up later if ( // handler for operation scope -- by boundOperation getHandlers4BoundOperationMap().containsKey(boundOperation)) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerOperationScope( getPolicyURIs(getHandlers4BoundOperationMap().get(boundOperation),modelContext) ,getPolicyModels() ,boundOperation ,service.getName() ,port.getName() ,operationName)); } // endif handler for binding:operation scope if ( // handler for operation scope -- by operation map getHandlers4OperationMap().containsKey(operation)) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerOperationScope( getPolicyURIs(getHandlers4OperationMap().get(operation),modelContext) ,getPolicyModels() ,operation ,service.getName() ,port.getName() ,operationName)); } // endif for portType:operation scope // end operation scope final EditableWSDLInput input = operation.getInput(); if (null!=input) { EditableWSDLMessage inputMsg = input.getMessage(); if (inputMsg != null && getHandlers4MessageMap().containsKey(inputMsg)) { messageSet.add(new BuilderHandlerMessageScope( getPolicyURIs( getHandlers4MessageMap().get(inputMsg), modelContext) ,getPolicyModels() ,inputMsg ,BuilderHandlerMessageScope.Scope.InputMessageScope ,service.getName() ,port.getName() ,operationName ,null) ); } } if ( // binding op input msg getHandlers4BindingInputOpMap().containsKey(boundOperation)) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerMessageScope( getPolicyURIs(getHandlers4BindingInputOpMap().get(boundOperation),modelContext) ,getPolicyModels() ,boundOperation ,BuilderHandlerMessageScope.Scope.InputMessageScope ,service.getName() ,port.getName() ,operationName ,null)); } // endif binding op input msg if ( null != input // portType op input msg && getHandlers4InputMap().containsKey(input)) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerMessageScope( getPolicyURIs(getHandlers4InputMap().get(input),modelContext) ,getPolicyModels() ,input ,BuilderHandlerMessageScope.Scope.InputMessageScope ,service.getName() ,port.getName() ,operationName ,null)); } // endif portType op input msg // end input message scope final EditableWSDLOutput output = operation.getOutput(); if (null!=output) { EditableWSDLMessage outputMsg = output.getMessage(); if (outputMsg != null && getHandlers4MessageMap().containsKey(outputMsg)) { messageSet.add(new BuilderHandlerMessageScope( getPolicyURIs( getHandlers4MessageMap().get(outputMsg),modelContext) ,getPolicyModels() ,outputMsg ,BuilderHandlerMessageScope.Scope.OutputMessageScope ,service.getName() ,port.getName() ,operationName ,null) ); } } if ( // binding op output msg getHandlers4BindingOutputOpMap().containsKey(boundOperation)) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerMessageScope( getPolicyURIs(getHandlers4BindingOutputOpMap().get(boundOperation),modelContext) ,getPolicyModels() ,boundOperation ,BuilderHandlerMessageScope.Scope.OutputMessageScope ,service.getName() ,port.getName() ,operationName ,null)); } // endif binding op output msg if ( null != output // portType op output msg && getHandlers4OutputMap().containsKey(output)) { getPolicyMapBuilder() .registerHandler( new BuilderHandlerMessageScope( getPolicyURIs(getHandlers4OutputMap().get(output),modelContext) ,getPolicyModels() ,output ,BuilderHandlerMessageScope.Scope.OutputMessageScope ,service.getName() ,port.getName() ,operationName ,null)); } // endif portType op output msg // end output message scope for (EditableWSDLBoundFault boundFault : boundOperation.getFaults()) { final EditableWSDLFault fault = boundFault.getFault(); // this shouldn't happen ususally, // but since this scenario tested in lagacy tests, dont' fail here if (fault == null) { LOGGER.warning(PolicyMessages.WSP_1021_FAULT_NOT_BOUND(boundFault.getName())); continue; } final EditableWSDLMessage faultMessage = fault.getMessage(); final QName faultName = new QName(boundOperation.getBoundPortType().getName().getNamespaceURI(), boundFault.getName()); // We store the message and portType/fault under the same namespace as the binding/fault so that we can match them up later if (faultMessage != null && getHandlers4MessageMap().containsKey(faultMessage)) { messageSet.add( new BuilderHandlerMessageScope( getPolicyURIs(getHandlers4MessageMap().get(faultMessage), modelContext) ,getPolicyModels() ,new WSDLBoundFaultContainer(boundFault, boundOperation) ,BuilderHandlerMessageScope.Scope.FaultMessageScope ,service.getName() ,port.getName() ,operationName ,faultName) ); } if (getHandlers4FaultMap().containsKey(fault)) { messageSet.add( new BuilderHandlerMessageScope( getPolicyURIs(getHandlers4FaultMap().get(fault), modelContext) ,getPolicyModels() ,new WSDLBoundFaultContainer(boundFault, boundOperation) ,BuilderHandlerMessageScope.Scope.FaultMessageScope ,service.getName() ,port.getName() ,operationName ,faultName) ); } if (getHandlers4BindingFaultOpMap().containsKey(boundFault)) { messageSet.add( new BuilderHandlerMessageScope( getPolicyURIs(getHandlers4BindingFaultOpMap().get(boundFault), modelContext) ,getPolicyModels() ,new WSDLBoundFaultContainer(boundFault, boundOperation) ,BuilderHandlerMessageScope.Scope.FaultMessageScope ,service.getName() ,port.getName() ,operationName ,faultName) ); } } // end foreach binding operation fault msg // end fault message scope } // end foreach boundOperation in port } // endif port.getBinding() != null } // end foreach port in service } // end foreach service in wsdl // Add handlers for wsdl:message elements for (BuilderHandlerMessageScope scopeHandler : messageSet) { getPolicyMapBuilder().registerHandler(scopeHandler); } } catch(PolicyException e) { LOGGER.logSevereException(e); } // End-preparation of policy map builder LOGGER.exiting(); } // time to read possible config file and do alternative selection (on client side) @Override public void postFinished(final WSDLParserExtensionContext context) { // finally register the PolicyMap on the WSDLModel EditableWSDLModel wsdlModel = context.getWSDLModel(); PolicyMap effectiveMap; try { if(context.isClientSide()) effectiveMap = context.getPolicyResolver().resolve(new PolicyResolver.ClientContext(policyBuilder.getPolicyMap(),context.getContainer())); else effectiveMap = context.getPolicyResolver().resolve(new PolicyResolver.ServerContext(policyBuilder.getPolicyMap(), context.getContainer(),null)); wsdlModel.setPolicyMap(effectiveMap); } catch (PolicyException e) { LOGGER.logSevereException(e); throw LOGGER.logSevereException(new WebServiceException(PolicyMessages.WSP_1007_POLICY_EXCEPTION_WHILE_FINISHING_PARSING_WSDL(), e)); } try { PolicyUtil.configureModel(wsdlModel,effectiveMap); } catch (PolicyException e) { LOGGER.logSevereException(e); throw LOGGER.logSevereException(new WebServiceException(PolicyMessages.WSP_1012_FAILED_CONFIGURE_WSDL_MODEL(), e)); } LOGGER.exiting(); } /** * Reads policy reference URIs from PolicyURIs attribute and returns them * as a String array returns null if there is no such attribute. This method * will attempt to check for the attribute in every supported policy namespace. * Resulting array of URIs is concatenation of URIs defined in all found * PolicyURIs attribute version. */ private String[] getPolicyURIsFromAttr(final XMLStreamReader reader) { final StringBuilder policyUriBuffer = new StringBuilder(); for (NamespaceVersion version : NamespaceVersion.values()) { final String value = reader.getAttributeValue(version.toString(), XmlToken.PolicyUris.toString()); if (value != null) { policyUriBuffer.append(value).append(" "); } } return (policyUriBuffer.length() > 0) ? policyUriBuffer.toString().split("[\\n ]+") : null; } }