/* * 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.policy.AlternativeSelector; import com.sun.xml.internal.ws.api.policy.PolicyResolver; import com.sun.xml.internal.ws.api.policy.ValidationProcessor; import com.sun.xml.internal.ws.policy.AssertionSet; import com.sun.xml.internal.ws.policy.EffectivePolicyModifier; import com.sun.xml.internal.ws.policy.Policy; import com.sun.xml.internal.ws.policy.PolicyAssertion; import com.sun.xml.internal.ws.policy.PolicyException; import com.sun.xml.internal.ws.policy.PolicyMap; import com.sun.xml.internal.ws.policy.spi.PolicyAssertionValidator.Fitness; import com.sun.xml.internal.ws.resources.PolicyMessages; import javax.xml.ws.WebServiceException; /** * This default implementation runs the policy validators on the server side and * selects a policy alternative on the client side. * * @author Rama Pulavarthi * @author Fabian Ritzmann */ public class DefaultPolicyResolver implements PolicyResolver { public PolicyMap resolve(ServerContext context) { PolicyMap map = context.getPolicyMap(); if(map != null) validateServerPolicyMap(map); return map; } public PolicyMap resolve(ClientContext context) { PolicyMap map = context.getPolicyMap(); if(map != null) map = doAlternativeSelection(map); return map; } /** * Checks if the PolicyMap has only single alternative in the scope. * * @param policyMap * PolicyMap that needs to be validated. */ private void validateServerPolicyMap(PolicyMap policyMap) { try { final ValidationProcessor validationProcessor = ValidationProcessor.getInstance(); for (Policy policy : policyMap) { // TODO: here is a good place to check if the actual policy has only one alternative... for (AssertionSet assertionSet : policy) { for (PolicyAssertion assertion : assertionSet) { Fitness validationResult = validationProcessor.validateServerSide(assertion); if (validationResult != Fitness.SUPPORTED) { throw new PolicyException(PolicyMessages.WSP_1015_SERVER_SIDE_ASSERTION_VALIDATION_FAILED( assertion.getName(), validationResult)); } } } } } catch (PolicyException e) { throw new WebServiceException(e); } } /** * Selects a best alternative if there are multiple policy alternatives. * * @param policyMap * @return */ private PolicyMap doAlternativeSelection(PolicyMap policyMap) { final EffectivePolicyModifier modifier = EffectivePolicyModifier.createEffectivePolicyModifier(); modifier.connect(policyMap); try { AlternativeSelector.doSelection(modifier); } catch (PolicyException e) { throw new WebServiceException(e); } return policyMap; } }