The INTENTION  of the ignoreUnknownAssertions stuff is to be a parse time 
things.   With it set to false (which was the default in <=2.2.x ), if an 
unnown assertion was found in a policy, it would throw an exception at parse 
time.  However, that was pretty silly as you could have a policy with 
something like:

<ExactlyOne>
    <MyKnownAssertion/>
     <MyUnknownAssertion/>
</ExactlyOne>

and we COULD use the know version at runtime.  That's why the default was 
changed.   It allowed us to load/process policies with unknown assertions in 
them as long as we can normalize down to a policy that only contains known 
assertions.  


I think what you then want is an extension to that like 
"assertUnknownAssertions" that would take this a step further and create an 
InterceptorProvider for each of the unknowns as well as an interceptor that 
would then assert it.    I'm all for doing that, but it is a different 
attribute than the current attribute.   (I'm actually OK with removing the 
current attribute as, at  this point, it's relatively pointless, IMO)

More inline....


On Tuesday, September 20, 2011 6:45:33 PM Aki Yoshida wrote:

....
 
> However, when I have such a WSDL with unknown assertions, I am getting
> the policy exception at:
> Caused by: org.apache.cxf.ws.policy.PolicyException: None of the
> policy alternatives can be satisfied.
>       at
> org.apache.cxf.ws.policy.EndpointPolicyImpl.chooseAlternative(EndpointPolic
> yImpl.java:165) at
> org.apache.cxf.ws.policy.EndpointPolicyImpl.finalizeConfig(EndpointPolicyIm
> pl.java:145) at
> org.apache.cxf.ws.policy.EndpointPolicyImpl.initialize(EndpointPolicyImpl.j
> ava:141) ...
> (using 2.5.0-SNAPSHOT.)

Right.  We couldn't normalize down to a policy containing fully supported 
assertions.

 
> I thought this ignoreUnknownAssertions property could help me in this
> case. Unfortunately, it didn't and a few things that I saw puzzled me.
> 
> 1. This property is set in PolicyEngineImpl by the configuration and
> it appears that it is supposed to be passed to
> AssertionBuilderRegistryImpl where it is set to its local attribute.
> In this registry impl class, this property is later used to throw or
> not to throw an exception during assertion builder registration.
> However, this attribute passing occurs at setBus() method of
> PolicyEngineImpl at the beginning and not after
> setIgnoreUnknownAssertions() is called. So,  no matter how you set
> this property in the configuration, AssertionBuilderRegistryImpl
> always has this attribute set to its default value of true. This can
> be verified in a simple test case where you get the instance of
> AssertionBuilderRegistry from the bus and check its
> IgnoreUnknownAssertion value.

OK.   This looks like a bug.   But like I said, IMO, the attribute could be 
removed and always be "true".   Changing to false wouldn't help your case as 
it would (should, but is obviously not working correctly) cause a failure at 
parse time, not run time.  Still a failure.

 
> 2. AssertionBuilderRegistryImpl uses this attribute to decide whether
> to thrown an exception in its handleNoRegisteredBuilder method.
> However, this exception is ignored in the following
> Wsdl11AttachmentPolicyProvider's try-catch block that calls that
> method.
> 
>                         } catch (Exception policyEx) {
>                             //ignore the policy can not be built
>                             LOG.warning("Failed to build the policy '"
> + uri + "':" + policyEx.getMessage());
>                         }
> 
> So, there seems to be no real effect in setting this property to false
> or true to raise an exception.
> 
> The real exception comes from EndpointPolicyImpl's chooseAlternative
> as shown earlier, as there is no alternative assertion for those
> unknown assertions and they are not ignored during this check.
> 
> So, this thing confuses me. What is the intention of this
> ignoreUnknownAssertion property? Is it for ignoring those unknown
> assertions in such cases like I have? If so and it is not working as
> intended, can I then correct this behavior? If it is not intended for
> this purpose, can someone tell me what its intention is and if there
> is a way to ignore those unknown assertions?

There isn't a way to ignore them right now.    See above.

Another option I just thought  of would be to create a new bean that would 
take a List<QName>  (or List<String> parsed to qnames internally) that would 
register an InterceptorProvider and Interceptor to assert those into the 
policy engine.   Thus, rather than ignoring/asserting ALL unknowns, you could 
configure specifically which assertions you are OK with it ignoring/asserting.


-- 
Daniel Kulp
[email protected]
http://dankulp.com/blog
Talend - http://www.talend.com

Reply via email to