EffectiveAlternativeSelectorpublic class EffectiveAlternativeSelector extends Object Contains static methods for policy alternative selection. Given policy map is changed so that
each effective policy contains at most one policy alternative. Uses domain
specific @see com.sun.xml.ws.policy.spi.PolicySelector
to find out whether particular policy assertion is actually supported. |
Fields Summary |
---|
private static final com.sun.xml.ws.policy.privateutil.PolicyLogger | LOGGER |
Methods Summary |
---|
public static final void | doSelection(EffectivePolicyModifier modifier)Does the selection for policy map bound to given modifier
final PolicyMap map = modifier.getMap();
final AssertionValidationProcessor validationProcessor = AssertionValidationProcessor.getInstance();
for (PolicyMapKey mapKey : map.getAllServiceScopeKeys()) {
final Policy oldPolicy = map.getServiceEffectivePolicy(mapKey);
modifier.setNewEffectivePolicyForServiceScope(mapKey, selectBestAlternative(oldPolicy, validationProcessor));
}
for (PolicyMapKey mapKey : map.getAllEndpointScopeKeys()) {
final Policy oldPolicy = map.getEndpointEffectivePolicy(mapKey);
modifier.setNewEffectivePolicyForEndpointScope(mapKey, selectBestAlternative(oldPolicy, validationProcessor));
}
for (PolicyMapKey mapKey : map.getAllOperationScopeKeys()) {
final Policy oldPolicy = map.getOperationEffectivePolicy(mapKey);
modifier.setNewEffectivePolicyForOperationScope(mapKey, selectBestAlternative(oldPolicy, validationProcessor));
}
for (PolicyMapKey mapKey : map.getAllInputMessageScopeKeys()) {
final Policy oldPolicy = map.getInputMessageEffectivePolicy(mapKey);
modifier.setNewEffectivePolicyForInputMessageScope(mapKey, selectBestAlternative(oldPolicy, validationProcessor));
}
for (PolicyMapKey mapKey : map.getAllOutputMessageScopeKeys()) {
final Policy oldPolicy = map.getOutputMessageEffectivePolicy(mapKey);
modifier.setNewEffectivePolicyForOutputMessageScope(mapKey, selectBestAlternative(oldPolicy, validationProcessor));
}
for (PolicyMapKey mapKey : map.getAllFaultMessageScopeKeys()) {
final Policy oldPolicy = map.getFaultMessageEffectivePolicy(mapKey);
modifier.setNewEffectivePolicyForFaultMessageScope(mapKey, selectBestAlternative(oldPolicy, validationProcessor));
}
| private static Policy | selectBestAlternative(Policy policy, AssertionValidationProcessor validationProcessor)
AssertionSet bestAlternative = null;
AlternativeFitness bestAlternativeFitness = AlternativeFitness.UNEVALUATED;
for (AssertionSet alternative : policy) {
AlternativeFitness alternativeFitness = (alternative.isEmpty()) ? AlternativeFitness.SUPPORTED_EMPTY : AlternativeFitness.UNEVALUATED;
for ( PolicyAssertion assertion : alternative ) {
final Fitness assertionFitness = validationProcessor.validateClientSide(assertion);
switch(assertionFitness) {
case UNKNOWN:
case UNSUPPORTED:
case INVALID:
LOGGER.warning(LocalizationMessages.WSP_0075_PROBLEMATIC_ASSERTION_STATE(assertion.getName(), assertionFitness));
break;
default:
break;
}
alternativeFitness = alternativeFitness.combine(assertionFitness);
}
if (bestAlternativeFitness.compareTo(alternativeFitness) < 0) {
// better alternative found
bestAlternative = alternative;
bestAlternativeFitness = alternativeFitness;
}
if (bestAlternativeFitness == AlternativeFitness.SUPPORTED) {
// all assertions supported by at least one selector
break;
}
}
switch (bestAlternativeFitness) {
case INVALID:
throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0053_INVALID_CLIENT_SIDE_ALTERNATIVE()));
case UNKNOWN:
case UNSUPPORTED:
case PARTIALLY_SUPPORTED:
LOGGER.warning(LocalizationMessages.WSP_0019_SUBOPTIMAL_ALTERNATIVE_SELECTED(bestAlternativeFitness));
break;
default:
break;
}
Collection<AssertionSet> alternativeSet = null;
if (bestAlternative != null) {
// return a policy containing just the picked alternative
alternativeSet = new LinkedList<AssertionSet>();
alternativeSet.add(bestAlternative);
}
return Policy.createPolicy(policy.getName(), policy.getId(), alternativeSet);
|
|