Hi Dan, I'm not sure we're looking at the same code... I'm looking at the PrimitiveAssertion.java at http://preview.tinyurl.com/2qtfy3.
If you look at the normalize method on line 94, you'll see that if the assertion is optional, it creates a new ExactlyOne policy component with two Alls. The first All contains the result of cloneMandatory() which constructs a clone with optional set to false. The second All is empty. This new PolicyComponent is what is returned. The non-optional assertion in the first All is what ends up being exposed to my interceptor. But my interceptor is not away of the 2nd empty All-- so it doesn't know this is really optional. Hopefully that makes a little more sense? Again, I'm also pretty unfamiliar with the normalization, so it's possible this is the intended behavior. When I get back to work on Monday I'll hack on it a little more and send along a patch if it might help-- I am developing it inside the CXF code base. Gotta go-- wife says it's time to stop working. ;) -Chris -----Original Message----- From: Dan Diephouse [mailto:[EMAIL PROTECTED] Sent: Fri 4/20/2007 5:42 PM To: [email protected] Subject: Re: Questions While Implementing MTOM Policy Hi Christopher, It sounds like a possible bug. The normalization logic looks right (for my inexperienced eyes). It only adds a second All if optional is false. Do you know where optional gets set to false? Only place I see that called is JaxbAssertionBuilder:104... I'm not sure if you're doing this in your own build or within in the CXF build, but you could possibly send a patch along and I'll try to take a peek. Or, you can take a gander at fixing normalization yourself. I'll be honest, I'm not that familiar with how normalization works yet in CXF, but I'll see if I can help. - Dan On 4/20/07, Christopher Moesel <[EMAIL PROTECTED]> wrote: > > I fit in a little more work... It's almost their, except that even > though I set my policy assertion to wsp:Optional="true", by the time it > makes it to the interceptor, the optional attribute is false. > > If I debug, I can see that when the PrimitiveAssertion is built, it > correctly sets the "optional" attribute to true. But somewhere down the > line, the assertion is "normalized" and the optional flag gets reset to > false. This appears to be happening in the PrimitiveAssertion.normalize > method. The PolicyComponent returned is an ExactlyOne that contains two > Alls. The first All has a PrimitiveAssertion with optional set to > false. The second All is empty. > > Is this the intended behavior? Is this a translation of optional=true > to an ExactlyOne with one required Assertion and one empty Assertion? > If so, how can I tell the difference between that and optional=false > from within an interceptor? > > Or does that question not even make sense? ;) > > -Chris > > -----Original Message----- > From: Christopher Moesel [mailto:[EMAIL PROTECTED] > Sent: Friday, April 20, 2007 4:16 PM > To: [email protected] > Subject: RE: Questions While Implementing MTOM Policy > > Thanks Dan-- that information has helped me get a bit further. I'm > afraid I won't be able to do any more work on it until Monday though... > I'll let you know how things are going... > > -Chris > > -----Original Message----- > From: Dan Diephouse [mailto:[EMAIL PROTECTED] > Sent: Friday, April 20, 2007 3:15 PM > To: [email protected] > Subject: Re: Questions While Implementing MTOM Policy > > Hi Christopher, > > A zip of the module or a paste of the interceptor, mtom-policy.xml file, > and > interceptor provider would be extremely helpful. > > Re question #2 - is your question how do I apply this mtom policy to my > service? I think the two mechanisms we have right now are WSDL Policy > Attachments and creating an external policy. I'm working on a third > where we > can embed it in an <endpoint>/<client> configuration. > > Here's a small example of how to load an external policy file: > > <bean class=" > org.apache.cxf.ws.policy.attachment.external.ExternalAttachmentProvider" > > > <constructor-arg ref="cxf"/> > <property name="location" > value="org/apache/cxf/systest/ws/policy/addr-external.xml"/> > </bean> > > And then the external file: > > <attachments xmlns:wsp="http://www.w3.org/2006/07/ws-policy" xmlns:wsa=" > http://www.w3.org/2005/08/addressing"> > <wsp:PolicyAttachment> > <wsp:AppliesTo> > <wsa:EndpointReference> > > <wsa:Address>http://localhost:9020/SoapContext/GreeterPort > </wsa:Address> > </wsa:EndpointReference> > </wsp:AppliesTo> > <wsp:Policy> > <wsam:Addressing xmlns:wsam=" > http://www.w3.org/2007/01/addressing/metadata"> > <wsp:Policy/> > </wsam:Addressing> > </wsp:Policy> > </wsp:PolicyAttachment> > </attachments> > > This is part of the policy system tests. How are you configuring your > service right now? Via the API? Via Spring? > - Dan > > On 4/20/07, Christopher Moesel <[EMAIL PROTECTED]> wrote: > > > > A Quick Update: > > > > I moved the bean configurations from the > > META-INF/cxf/cxf-extension-mtom-policy.xml file to my service's own > > Spring configuration file. Now I can see that my > MTOMAssertionBuilder, > > MTOMPolicyInterceptorProvider, and MTOMPolicyInterceptors are at least > > instantiated (which is further than I got before). > > > > But, the handleMessage method on my MTOMPolicyInterceptor is never > > called when I make a request to the service, so something still > doesn't > > seem to be registered right. > > > > So two questions now: > > > > 1) Why wasn't my META-INF/cxf/cxf-extension-mtom-policy.xml file > never > > loaded by the framework? > > > > 2) How do I get my service to actually build those assertions and > > intercept the messages? > > > > Thanks, > > Chris > > > > -----Original Message----- > > From: Christopher Moesel [mailto:[EMAIL PROTECTED] > > Sent: Friday, April 20, 2007 2:40 PM > > To: [email protected] > > Subject: Questions While Implementing MTOM Policy > > > > Hello, > > > > I'm trying to implement a plugin for the MTOM Policy specification. > > This is essentially a policy that states whether or not MTOM should be > > used (or is optional). I intend on contributing it back to CXF, so I > > figure I'm OK sending this to the dev list. ;) > > > > I've created a MTOMAssertionBuilder that uses PrimitiveAssertions, a > > MTOMPolicyInterceptor (that at this point just prints out if it is > > asserted), and a MTOMPolicyInterceptorProvider. > > > > I've registered the MTOMAssertionBuilder and > > MTOMPolicyInterceptorProvider in > > META-INF/cxf/cxf-extension-mtom-policy.xml and created a corresponding > > META-INF/cxf/cxf.extension file. According to the documentation, this > > is all that is needed to register them in CXF. > > > > When I try my service (that has the ws-policy and ws-mtom-policy jars > in > > its classpath), none of my MTOM policy classes seem to be called. Do > I > > need to do something else to register them with my service, or is > having > > the policy assertion in the port of my WSDL file enough? It seems I > > must be missing something important. > > > > If it would be helpful, I can zip up the module and send it along. > > > > Thanks! > > Chris > > > > > > -- > Dan Diephouse > Envoi Solutions > http://envoisolutions.com | http://netzooid.com/blog > -- Dan Diephouse Envoi Solutions http://envoisolutions.com | http://netzooid.com/blog
