You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cxf.apache.org by Andrea Smyth <an...@iona.com> on 2007/05/14 11:06:44 UTC
CXF Extensions for Spring XML
Hi all,
I was looking at some of our BeanDefinitionParsers and configuration
schemas and noticed there are some problems:
1. Schema validation is currently disabled - and turning it on requires
a number of changes to existing configuration files on the one hand but
also to code (BeanDefinitionParsers).
These are mainly due to the fact that stringified QNames are not legal
bean ids as per
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - they
are of type xsd:ID not xsd:string.
The workaround for plain bean elements is simple, just use the name
attribute instead. But that is not possible for elements in the
http://cxf.apache.org/transports/http/configuration namespace (conduit,
destination etc) or in the http://cxf.apache.org/jaxws namespace
(endpoint, server, client), as no name attribute is defined for these
elements.
Finally, some elements (rmManager) are of a type that has no id
attribute define at all, but on the other hand the resp. parsers assume
that there is a non null id.
2. Some elements, e.g. endpoint, server, client in the
http://cxf.apache.org/jaxws namespace are of a type that extends
beans:identifiedType, i.e. have an id attribute of type xsd:ID.
Others, e.g. conduit, destination in the
http://cxf.apache.org/transports/http/configuration namespace do not
extend beans:identifiedType but instead have an id attribute added
manually as: <xs:attribute name="id" type="xs:string"
use="required"/>. This type inconsistency is very confusing: in some
case the ids can be stringified QNames, but in others they can't.
3. The same set of attributes seem to be defined repeatedly for the
different elements in the http://cxf.apache.org/jaxws namespace - in
fact its hard to see where the elements endpoint, server, and client
actually differ. The schema should use an attribute group or inheritance
to highlight what they have in common (this should be component
specific, i.e. include "binding", "executor", "features" but exclude
"abstract") More importantly, there is a lot of duplicate code in the
BeanDefinitionParsers for these elements which should be removed.
4. Question: Do we really need both an "abstract" and an
"createdFromAPI" attribute in the endpoint, server and client elements
in the http://cxf.apache.org/jaxws namespace? From what I have seen,
they are used synonymously, and in that case I would much prefer the use
of "abstract" as this is commonly understood by Spring users, but I may
have overlooked something.
5. To avoid the inconsistencies w.r.t the presence and type of an id
attribute, we should make it a policy that all types extend
beans:identifiedType. And all types use the same attribute group (a
subset of the beans:beanAttributes group) including the "abstract" and
"name" attributes at a minimum. This group should be defined in the
common package along with the (CXF) AbstractBeanDefinitionParser, which
should also handle the attributes in a common way for all types, e.g.
use the value of the name attribute as an alternative to an id attribute.
6. I don't like the way the id of the bus bean is making its way all
into the code now - it's bad enough that it is repeated everywhere in
the xml files (<property name="bus" ref="cxf"/>) but worse that numerous
BeanDefinitionParsers make use of that bean name too - they could at
least use a String constant.
7. Extensibility: To avoid having to change schema and bean definition
parser in addition to the actual runtime component whenever I want to
inject a new property into it, I would like custom elements to accept
child elements and attributes from the beans namespace, and have them
handled in the same way they are handled for beans elements, e.g. allow
something like
<wsrm:rmManager>
<wsrm:sourcePolicy .../>
<!-- new, and possibly only for development/test purposes -->
<beans:property name="store" ref="txStore"/>
</wsrm:manager>
<beans id="txStore"
class="org.apache.cxf.ws.rm.persistence.jdbc.RMTxStore"/>
I am not sure of this is feasible, but as it stands using custom xml is
not very flexible at all - never mind the amount of (repetitive!) code
required for each extension which amounts to a lot more than was ever
necessary in the property editors based approach. While I don't want to
go back to these, I do believe that there are some problems in mixing
the "custom xml for configuration" approach with "plain Spring xml for
wiring". E.g. parameterise NamespaceHandlers, BeanDefinitionParsers and
spring.schemas, spring.handlers and simply have ONE properties or xml
file per module based on which the schema locations, namespace handlers,
parsers etc are registered dynamically.
8. Schema validation must be enabled as soon as possible, IMO before 2.0
final as it will be very helpful for users writing their configuration
files. At the very least existing Spring xml files should be fixed to
pass an optional validation step.
Andrea.
Re: CXF Extensions for Spring XML
Posted by Andrea Smyth <an...@iona.com>.
Looks like we are agreeing on all of the points :) - I'll see what I
can fit in over the next couple of days.
On the point of extending wsdl:tExtensibilityElement. some ideas below ...
Dan Diephouse wrote:
> Hola, comments inline....
>
> On 5/14/07, Andrea Smyth <an...@iona.com> wrote:
>
>>
>> Hi all,
>>
>> I was looking at some of our BeanDefinitionParsers and configuration
>> schemas and noticed there are some problems:
>>
>> 1. Schema validation is currently disabled - and turning it on requires
>> a number of changes to existing configuration files on the one hand but
>> also to code (BeanDefinitionParsers).
>> These are mainly due to the fact that stringified QNames are not legal
>> bean ids as per
>> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - they
>> are of type xsd:ID not xsd:string.
>> The workaround for plain bean elements is simple, just use the name
>> attribute instead. But that is not possible for elements in the
>> http://cxf.apache.org/transports/http/configuration namespace (conduit,
>> destination etc) or in the http://cxf.apache.org/jaxws namespace
>> (endpoint, server, client), as no name attribute is defined for these
>> elements.
>
>
>
> I was trying to get this reenabled a couple weeks ago and the major
> problem
> was with the beans extending the wsdl:tExtensibilityElement. Spring
> really
> didn't like that. We shouldn't have to extend the
> wsdl:tExtensibilityElement
> now as we have a WSDL schema which allows elements anywhere. However,
> I went
> down this route and ran into a problem with WSDL4J. It expects all the
> extensibility elements to extend ExtensibilityElement. Anyone know a way
> around this? Could we just make those elements extend
> ExtensibilityElement
> in Java, but not extend wsdl:tExtensibilityElement in the code?
Beans for which we define a schema and provide a bean definition parse
should never have to extend wsdl:tExtensibilityElement - only types that
are used as attributes/child elements of such beans should. Also, for
those beans we would NOT use JAXB to generate a class from which the
implementation inherits: we don't want attributes such as "abstract",
"id", "name" make their way into component code.
Many components already have their getters/setters for configurable
properties coded manually instead of inheriting them from a JAXB
generated class. And since we don't generate custom getters/setters any
more there is not much advantage of inheriting from a generated bean.
Andrea.
Re: CXF Extensions for Spring XML
Posted by Dan Diephouse <da...@envoisolutions.com>.
Hola, comments inline....
On 5/14/07, Andrea Smyth <an...@iona.com> wrote:
>
> Hi all,
>
> I was looking at some of our BeanDefinitionParsers and configuration
> schemas and noticed there are some problems:
>
> 1. Schema validation is currently disabled - and turning it on requires
> a number of changes to existing configuration files on the one hand but
> also to code (BeanDefinitionParsers).
> These are mainly due to the fact that stringified QNames are not legal
> bean ids as per
> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - they
> are of type xsd:ID not xsd:string.
> The workaround for plain bean elements is simple, just use the name
> attribute instead. But that is not possible for elements in the
> http://cxf.apache.org/transports/http/configuration namespace (conduit,
> destination etc) or in the http://cxf.apache.org/jaxws namespace
> (endpoint, server, client), as no name attribute is defined for these
> elements.
I was trying to get this reenabled a couple weeks ago and the major problem
was with the beans extending the wsdl:tExtensibilityElement. Spring really
didn't like that. We shouldn't have to extend the wsdl:tExtensibilityElement
now as we have a WSDL schema which allows elements anywhere. However, I went
down this route and ran into a problem with WSDL4J. It expects all the
extensibility elements to extend ExtensibilityElement. Anyone know a way
around this? Could we just make those elements extend ExtensibilityElement
in Java, but not extend wsdl:tExtensibilityElement in the code?
Finally, some elements (rmManager) are of a type that has no id
> attribute define at all, but on the other hand the resp. parsers assume
> that there is a non null id.
Yeah, we should definitely be creating an ID automatically in this case.
2. Some elements, e.g. endpoint, server, client in the
> http://cxf.apache.org/jaxws namespace are of a type that extends
> beans:identifiedType, i.e. have an id attribute of type xsd:ID.
> Others, e.g. conduit, destination in the
> http://cxf.apache.org/transports/http/configuration namespace do not
> extend beans:identifiedType but instead have an id attribute added
> manually as: <xs:attribute name="id" type="xs:string"
> use="required"/>. This type inconsistency is very confusing: in some
> case the ids can be stringified QNames, but in others they can't.
I didn't realize the id was an xsd:ID. We should definitely fix this!
3. The same set of attributes seem to be defined repeatedly for the
> different elements in the http://cxf.apache.org/jaxws namespace - in
> fact its hard to see where the elements endpoint, server, and client
> actually differ. The schema should use an attribute group or inheritance
> to highlight what they have in common (this should be component
> specific, i.e. include "binding", "executor", "features" but exclude
> "abstract") More importantly, there is a lot of duplicate code in the
> BeanDefinitionParsers for these elements which should be removed.
+1 to collapsing some of this stuff. See my other email in the "Determining
the features..." thread for info on why there is both an endpoint & server.
4. Question: Do we really need both an "abstract" and an
> "createdFromAPI" attribute in the endpoint, server and client elements
> in the http://cxf.apache.org/jaxws namespace? From what I have seen,
> they are used synonymously, and in that case I would much prefer the use
> of "abstract" as this is commonly understood by Spring users, but I may
> have overlooked something.
Yes, unfortunately we do. There are 2 distinct use cases:
1. createdFromAPI="true" - here we need to automatically change the ID and
append ".jaxws-client" or ".jaxws-endpoint" to the ID. Otherwise the
<jaxws:client> and <jaxws:endpoint> would have the same ID. We can't use
abstract="true" because...
2. Parent/child relationships - in this case, abstract="true" simply means
we want to inherit from the parent bean at some point. We don't want to
change the ID in #1, because that would highly confusing for the user.
They'd end up writing something like this where the IDs didn't match:
<jaxws:endpoint id="myParentBean" .../>
<jaxws:endpoint id="foo" parent="myParentBean.jaxws-endpoint" .../>
5. To avoid the inconsistencies w.r.t the presence and type of an id
> attribute, we should make it a policy that all types extend
> beans:identifiedType. And all types use the same attribute group (a
> subset of the beans:beanAttributes group) including the "abstract" and
> "name" attributes at a minimum. This group should be defined in the
> common package along with the (CXF) AbstractBeanDefinitionParser, which
> should also handle the attributes in a common way for all types, e.g.
> use the value of the name attribute as an alternative to an id attribute.
>
>
+1!!!
6. I don't like the way the id of the bus bean is making its way all
> into the code now - it's bad enough that it is repeated everywhere in
> the xml files (<property name="bus" ref="cxf"/>) but worse that numerous
> BeanDefinitionParsers make use of that bean name too - they could at
> least use a String constant.
+1
7. Extensibility: To avoid having to change schema and bean definition
> parser in addition to the actual runtime component whenever I want to
> inject a new property into it, I would like custom elements to accept
> child elements and attributes from the beans namespace, and have them
> handled in the same way they are handled for beans elements, e.g. allow
> something like
>
> <wsrm:rmManager>
> <wsrm:sourcePolicy .../>
> <!-- new, and possibly only for development/test purposes -->
> <beans:property name="store" ref="txStore"/>
> </wsrm:manager>
> <beans id="txStore"
> class="org.apache.cxf.ws.rm.persistence.jdbc.RMTxStore"/>
>
> I am not sure of this is feasible, but as it stands using custom xml is
> not very flexible at all
This is probably possible.
- never mind the amount of (repetitive!) code
> required for each extension which amounts to a lot more than was ever
> necessary in the property editors based approach. While I don't want to
> go back to these, I do believe that there are some problems in mixing
> the "custom xml for configuration" approach with "plain Spring xml for
> wiring". E.g. parameterise NamespaceHandlers, BeanDefinitionParsers and
> spring.schemas, spring.handlers and simply have ONE properties or xml
> file per module based on which the schema locations, namespace handlers,
> parsers etc are registered dynamically.
We can definitely fix the repetitive code problem. Thats mostly my fault.
However, I'm not sure if we can get rid of the spring.schemas/handlers and
NamespaceHandlers needed for each module. How exactly would you propose
getting rid of those?
8. Schema validation must be enabled as soon as possible, IMO before 2.0
> final as it will be very helpful for users writing their configuration
> files. At the very least existing Spring xml files should be fixed to
> pass an optional validation step.
>
> +1 if we can make it work. As I mentioned above, I ran into major issues
with WSDL4J in an attempt to make this work.
- Dan
--
Dan Diephouse
Envoi Solutions
http://envoisolutions.com | http://netzooid.com/blog