/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package org.apache.cxf.ws.policy.attachment.external; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.cxf.service.model.BindingFaultInfo; import org.apache.cxf.service.model.BindingMessageInfo; import org.apache.cxf.service.model.BindingOperationInfo; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.service.model.InterfaceInfo; import org.apache.cxf.service.model.MessageInfo.Type; import org.apache.cxf.service.model.ServiceInfo; public class URIDomainExpression implements DomainExpression { private final Wsdl11XPointer wsdl11XPointer; public URIDomainExpression(final String uriContext) { wsdl11XPointer = new Wsdl11XPointer(uriContext); } @Override public boolean appliesTo(ServiceInfo si) { if (si == null) { return false; } if (wsdl11XPointer.matchesWsdl(si.getTargetNamespace())) { return true; } if ((si.getName() != null) && wsdl11XPointer.matchesService(si.getTargetNamespace(), si.getName().getLocalPart())) { return true; } return (si.getInterface() != null) && (si.getInterface().getName() != null) && wsdl11XPointer.matchesPortType(si.getTargetNamespace(), si.getInterface().getName().getLocalPart()); } @Override public boolean appliesTo(EndpointInfo ei) { if (ei == null) { return false; } return (ei.getService() != null) && (ei.getService().getName() != null) && (ei.getName() != null) && wsdl11XPointer.matchesPort(ei.getService().getTargetNamespace(), ei.getService().getName().getLocalPart(), ei.getName().getLocalPart()); } @Override public boolean appliesTo(BindingOperationInfo boi) { if (boi == null) { return false; } if ((boi.getBinding() != null) && (boi.getBinding().getName() != null) && wsdl11XPointer.matchesBinding( boi.getBinding().getName().getNamespaceURI(), boi.getBinding().getName().getLocalPart())) { return true; } if ((boi.getName() != null) && (boi.getBinding() != null) && (boi.getBinding().getName() != null) && wsdl11XPointer.matchesBindingOperation( boi.getBinding().getName().getNamespaceURI(), boi.getBinding().getName().getLocalPart(), boi.getName().getLocalPart())) { return true; } return (boi.getOperationInfo() != null) && (boi.getOperationInfo().getInterface() != null) && (boi.getOperationInfo().getInterface().getName() != null) && (boi.getOperationInfo().getName() != null) && wsdl11XPointer.matchesPortTypeOperation( boi.getOperationInfo().getInterface().getName().getNamespaceURI(), boi.getOperationInfo().getInterface().getName().getLocalPart(), boi.getOperationInfo().getName().getLocalPart()); } @Override public boolean appliesTo(BindingMessageInfo bmi) { if (bmi == null) { return false; } if ((bmi.getMessageInfo() != null) && (bmi.getMessageInfo().getName() != null) && wsdl11XPointer.matchesMessage( bmi.getMessageInfo().getName().getNamespaceURI(), bmi.getMessageInfo().getName().getLocalPart())) { return true; } if (checkBindingOperationInOut(bmi)) { return true; } return checkPortTypeOperationInOut(bmi); } @Override public boolean appliesTo(BindingFaultInfo bfi) { if ((bfi == null) || (bfi.getFaultInfo() == null) || (bfi.getBindingOperation() == null)) { return false; } if (checkBindingOperationFault(bfi)) { return true; } return checkPortTypeOperationFault(bfi); } private boolean checkBindingOperationInOut(BindingMessageInfo bmi) { if ((bmi.getMessageInfo() != null) && (bmi.getMessageInfo().getName() != null) && (bmi.getBindingOperation() != null) && (bmi.getBindingOperation().getName() != null) && (bmi.getBindingOperation().getBinding() != null) && (bmi.getBindingOperation().getBinding().getName() != null)) { if ((Type.INPUT == bmi.getMessageInfo().getType()) && wsdl11XPointer.matchesBindingOperationInput( bmi.getMessageInfo().getName().getNamespaceURI(), bmi.getBindingOperation().getBinding().getName().getLocalPart(), bmi.getBindingOperation().getName().getLocalPart())) { return true; } if ((Type.OUTPUT == bmi.getMessageInfo().getType()) && wsdl11XPointer.matchesBindingOperationOutput( bmi.getMessageInfo().getName().getNamespaceURI(), bmi.getBindingOperation().getBinding().getName().getLocalPart(), bmi.getBindingOperation().getName().getLocalPart())) { return true; } } return false; } private boolean checkPortTypeOperationInOut(BindingMessageInfo bmi) { InterfaceInfo ini = null; if ((bmi.getBindingOperation() != null) && (bmi.getBindingOperation().getOperationInfo() != null)) { ini = bmi.getBindingOperation().getOperationInfo().getInterface(); } if ((ini != null) && (ini.getName() != null) && (bmi.getMessageInfo() != null) && (bmi.getBindingOperation() != null) && (bmi.getBindingOperation().getName() != null)) { if ((Type.INPUT == bmi.getMessageInfo().getType()) && wsdl11XPointer.matchesPortTypeOperationInput( ini.getName().getNamespaceURI(), ini.getName().getLocalPart(), bmi.getBindingOperation().getName().getLocalPart())) { return true; } if ((Type.OUTPUT == bmi.getMessageInfo().getType()) && wsdl11XPointer.matchesPortTypeOperationOutput( ini.getName().getNamespaceURI(), ini.getName().getLocalPart(), bmi.getBindingOperation().getName().getLocalPart())) { return true; } } return false; } private boolean checkPortTypeOperationFault(BindingFaultInfo bfi) { InterfaceInfo ini = null; if ((bfi.getBindingOperation() != null) && (bfi.getBindingOperation().getOperationInfo() != null)) { ini = bfi.getBindingOperation().getOperationInfo().getInterface(); } return (ini != null) && (ini.getName() != null) && (bfi.getBindingOperation().getName() != null) && (bfi.getFaultInfo().getFaultName() != null) && wsdl11XPointer.matchesPortTypeOperationFault( ini.getName().getNamespaceURI(), ini.getName().getLocalPart(), bfi.getBindingOperation().getName().getLocalPart(), bfi.getFaultInfo().getFaultName().getLocalPart()); } private boolean checkBindingOperationFault(BindingFaultInfo bfi) { return (bfi.getFaultInfo() != null) && (bfi.getFaultInfo().getFaultName() != null) && (bfi.getBindingOperation().getName() != null) && (bfi.getBindingOperation().getBinding() != null) && (bfi.getBindingOperation().getBinding().getName() != null) && wsdl11XPointer.matchesBindingOperationFault( bfi.getFaultInfo().getFaultName().getNamespaceURI(), bfi.getBindingOperation().getBinding().getName().getLocalPart(), bfi.getBindingOperation().getName().getLocalPart(), bfi.getFaultInfo().getFaultName().getLocalPart()); } public static class Wsdl11XPointer { private static final String SINGLE_PATH = "\\(([^\\)]*)\\)$"; private static final String DOUBLE_PATH = "\\(([^/]*)/([^\\)]*)\\)$"; private static final String TRIPPLE_PATH = "\\(([^/]*)/([^/]*)/([^\\)]*)\\)$"; private static final Pattern PATTERN_DEFINITIONS = Pattern.compile("^wsdl11.definitions\\(\\)$"); private static final Pattern PATTERN_PORT_TYPE = Pattern.compile("^wsdl11.portType" + SINGLE_PATH); private static final Pattern PATTERN_PORT_TYPE_OPERATION = Pattern.compile("^wsdl11.portTypeOperation" + DOUBLE_PATH); private static final Pattern PATTERN_PORT_TYPE_OPERATION_INPUT = Pattern.compile("^wsdl11.portTypeOperation.input" + DOUBLE_PATH); private static final Pattern PATTERN_PORT_TYPE_OPERATION_OUTPUT = Pattern.compile("^wsdl11.portTypeOperation.output" + DOUBLE_PATH); private static final Pattern PATTERN_PORT_TYPE_OPERATION_FAULT = Pattern.compile("^wsdl11.portTypeOperation.fault" + TRIPPLE_PATH); private static final Pattern PATTERN_MESSAGE = Pattern.compile("^wsdl11.message" + SINGLE_PATH); private static final Pattern PATTERN_MESSAGE_PART = Pattern.compile("^wsdl11.messagePart" + DOUBLE_PATH); private static final Pattern PATTERN_SERVICE = Pattern.compile("^wsdl11.service" + SINGLE_PATH); private static final Pattern PATTERN_PORT = Pattern.compile("^wsdl11.port" + DOUBLE_PATH); private static final Pattern PATTERN_BINDING = Pattern.compile("^wsdl11.binding" + SINGLE_PATH); private static final Pattern PATTERN_BINDING_OPERATION = Pattern.compile("^wsdl11.bindingOperation" + DOUBLE_PATH); private static final Pattern PATTERN_BINDING_OPERATION_INPUT = Pattern.compile("^wsdl11.bindingOperation.input" + DOUBLE_PATH); private static final Pattern PATTERN_BINDING_OPERATION_OUTPUT = Pattern.compile("^wsdl11.bindingOperation.output" + DOUBLE_PATH); private static final Pattern PATTERN_BINDING_OPERATION_FAULT = Pattern.compile("^wsdl11.bindingOperation.fault" + TRIPPLE_PATH); private final String targetNamespace; private final String wsdl11Pointer; public Wsdl11XPointer(final String uriContext) { if ((uriContext == null) || uriContext.isEmpty()) { throw new IllegalArgumentException( "External policy attachment URI element cannot be empty"); } int pos = uriContext.indexOf('#'); if (pos != -1) { targetNamespace = uriContext.substring(0, pos); wsdl11Pointer = uriContext.substring(pos + 1); } else { targetNamespace = ""; wsdl11Pointer = uriContext; } } boolean matchesWsdl(String wsdlTargetNamespace) { Matcher matcher = PATTERN_DEFINITIONS.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher); } boolean matchesPortType(String wsdlTargetNamespace, String portType) { Matcher matcher = PATTERN_PORT_TYPE.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, portType); } boolean matchesPortTypeOperation(String wsdlTargetNamespace, String portType, String operation) { Matcher matcher = PATTERN_PORT_TYPE_OPERATION.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, portType, operation); } boolean matchesPortTypeOperationInput(String wsdlTargetNamespace, String portType, String operation) { Matcher matcher = PATTERN_PORT_TYPE_OPERATION_INPUT.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, portType, operation); } boolean matchesPortTypeOperationOutput(String wsdlTargetNamespace, String portType, String operation) { Matcher matcher = PATTERN_PORT_TYPE_OPERATION_OUTPUT.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, portType, operation); } boolean matchesPortTypeOperationFault(String wsdlTargetNamespace, String portType, String operation, String fault) { Matcher matcher = PATTERN_PORT_TYPE_OPERATION_FAULT.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, portType, operation, fault); } boolean matchesMessage(String wsdlTargetNamespace, String message) { Matcher matcher = PATTERN_MESSAGE.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, message); } boolean matchesMessagePart(String wsdlTargetNamespace, String message, String part) { Matcher matcher = PATTERN_MESSAGE_PART.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, message, part); } boolean matchesService(String wsdlTargetNamespace, String service) { Matcher matcher = PATTERN_SERVICE.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, service); } boolean matchesPort(String wsdlTargetNamespace, String service, String port) { Matcher matcher = PATTERN_PORT.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, service, port); } boolean matchesBinding(String wsdlTargetNamespace, String binding) { Matcher matcher = PATTERN_BINDING.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, binding); } boolean matchesBindingOperation(String wsdlTargetNamespace, String binding, String operation) { Matcher matcher = PATTERN_BINDING_OPERATION.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, binding, operation); } boolean matchesBindingOperationInput(String wsdlTargetNamespace, String binding, String operation) { Matcher matcher = PATTERN_BINDING_OPERATION_INPUT.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, binding, operation); } boolean matchesBindingOperationOutput(String wsdlTargetNamespace, String binding, String operation) { Matcher matcher = PATTERN_BINDING_OPERATION_OUTPUT.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, binding, operation); } boolean matchesBindingOperationFault(String wsdlTargetNamespace, String binding, String operation, String fault) { Matcher matcher = PATTERN_BINDING_OPERATION_FAULT.matcher(wsdl11Pointer); return matches(wsdlTargetNamespace, matcher, binding, operation, fault); } private boolean matches(String wsdlTargetNamespace, Matcher matcher, String... args) { if (!targetNamespace.equals(wsdlTargetNamespace) || !matcher.matches()) { return false; } for (int i = 0; i < args.length; i++) { String matcherGroup = matcher.group(i + 1); if ((matcherGroup == null) || (!matcherGroup.equals(args[i]))) { return false; } } return true; } } }