[jboss-as7-dev] Detyped and REST configuration API

Aslak Knutsen aknutsen at redhat.com
Tue Nov 30 05:41:54 EST 2010


Will the same API reach down into Deployments as well? 

Where a Deployments Descriptors are resources and are targets for partial updates?
And will give you information about the content of a deployment(servlets, ejbs, etc)?

-aslak-


----- "Brian Stansberry" <brian.stansberry at redhat.com> wrote:

> Apologies in advance for the long message. I want to kick off a 
> discussion of the detyped and REST API for domain/host/server 
> configuration. Much of the following will end up in a wiki, but I
> wanted 
> some initial discussion first.
> 
> Goals:
> 
> A "detyped" Java version of the configuration API. Detyped in the
> sense 
> that the entire model can be represented using a few general usage 
> classes on the client classpath,
> a la the jboss-meta project used in AS 5/6.
> 
> A REST version of the API. Even less strongly typed, since in the end
> 
> clients will fundamentally be consuming the model as text (xml or
> json).
> 
> Concepts:
> 
> "Addressable" Model Elements
> 
> An "addressable" model element is one that can be uniquely identified
> 
> within it's overall model.
> 
> It either:
> ** is the only element of its type under its parent element (i.e. 
> maxOccurs=1 in its schema)
> ** or has a single attribute whose value is unique among all elements
> of 
> its type under it's parent element
> 
> and it is either
> ** the child of an addressable model element
> ** or is the root element of the model
> 
> An addressable model element can easily be treated as a resource in a
> 
> REST interface. A particular element can be represented in a URL path
> 
> either via its element name or via a simple combination of its element
> 
> name and the single attribute value.
> 
> It's also easy to create a simple java object to represent the
> element's 
> address for use in the "detyped" Java API. For a draft see:
> 
> https://github.com/bstansberry/jboss-as/commit/36763f82e6d82631370adcc154193d02ddf4829c#diff-5
> https://github.com/bstansberry/jboss-as/commit/36763f82e6d82631370adcc154193d02ddf4829c#diff-3
> 
> We should strive to have the vast majority of elements in the 
> domain/host/server models be addressable. This makes it easy to have 
> highly targeted updates; e.g. a REST PUT can specify the values for a
> 
> few attributes in a single element rather than needing to describe a 
> large portion of the model. So far we have largely met this goal.
> 
> Updates via differencing:
> 
> A model update consists of a client sending a detyped representation
> of 
> a part of the model. The update will include all of that portion of
> the 
> model; both modified and unmodified properties. The server compares
> that 
> detyped representation to the current state of the model and generates
> 
> the AbstractModelUpdate objects needed to bring the model up to the 
> desired state.
> 
> See the DetypedModelElement class for a draft detyped representation
> of 
> an addressable model element:
> 
> https://github.com/bstansberry/jboss-as/commit/36763f82e6d82631370adcc154193d02ddf4829c#diff-2
> 
> At this point I used the CompositeValue class from AS 5/6 jboss-meta 
> library for representing the element's properties. That's certainly
> open 
> for discussion.
> 
> "Id-Only" Elements
> 
> The detyped representation of a part or all of the model can include 
> "id-only" elements. These represent addressable elements but only 
> include the information necessary to determine the element address,
> plus 
> a flag indicating the element is "id-only". These serve as
> placeholders 
> within a representation of a larger portion of the model. The purpose
> of 
> an id-only element is to allow the client to avoid dealing with 
> uninteresting portions of the model state, while still being aware of
> 
> their existence. They also allow the server to distinguish an update 
> that removes an element from one that doesn't modify it at all,
> without 
> forcing the client to send the entire state of the unmodified
> element.
> 
> How useful this "id-only" concept will be, I'm not sure. The main use
> 
> cases I can see are, for reads, being able to read a client-specified
> 
> number of levels of the model without having to consume the whole
> thing 
> (imagine a huge domain). For writes the main use case would be an
> update 
> that touches a few parts of the model (e.g. add an extension, the
> subsystem config for it, a new thread pool for it, a new socket
> binding 
> for it) without having to specify all the unrelated stuff in between.
> 
> 
> Issues:
> 
> Meta-information about Configuration Elements:
> 
> Where should this be stored? Basic things like the primitive types of
> 
> various properties, plus more complex things like whether changing a
> property requires a restart to take effect. The "detyped" Java version
> 
> can include a fair amount of meta-information, but this isn't readily
> available via REST. Much of this information also can be (and is)
> stored 
> in the domain model schemas themselves, but this forces clients to 
> access and interpret the schemas to obtain the information. Putting 
> things like whether a property requires restart to take effect in the
> 
> various domain model schemas would also create a tighter coupling 
> between the schemas; i.e. they should all use the same mechanism to 
> indicate this, which would imply some common included schema that 
> defines that mechanism.
> 
> Obtaining a DetypedModelElement
> 
> This seems fairly straightforward. Any AbstractModelElement that is 
> addressable should be able to expose its state as a
> DetypedModelElement.
> See AbstractAddressableModelElement for an rough implementation of
> that:
> 
> https://github.com/bstansberry/jboss-as/commit/36763f82e6d82631370adcc154193d02ddf4829c#diff-1
> 
> Determining differences and generating AbstractModelUpdate objects
> 
> If the client passes back a DetypedModelElement to the domain 
> controller, we need logic to determine the difference between that 
> detyped representation and the current model and then generate the 
> needed update objects. A possibility is to have each 
> AbstractAddressableModelElement be responsible for doing that. A
> problem 
> I've seen with that is the class hierarchy for the update classes
> versus 
> the model element classes is not clean.
> For example, a method like this in AbstractAddressableModelElement
> won't 
> work:
> 
> protected abstract void addUpdatesToMatchView(DetypedModelElement 
> updatedView, List<AbstractModelElementUpdate<?>> updates);
> 
> It won't work because not all model elements are updated via 
> AbstractModelElementUpdate; some are done via
> AbstractDomainModelUpdate, 
> some via AbstractHostModelUpdate etc.
> 
> Marshalling to from XML/JSON
> 
> The REST API requires the ability to marshall to/from whatever XML and
> 
> JSON formats we use for exchanging data with clients. JSON of course
> is
> going to be different from anything we have right now. We need to
> think 
> about the XML format. We could just provide and receive snippets that
> 
> follow the same schema we use in the domain/host/standalone.xml 
> documents themselves. However, there are problems with that. The 
> "id-only" notion described  above is not part of those schemas. Any
> Atom 
> links we include in response documents (see Chapter 9 in Bill Burke's
> 
> RESTful Java book) will violate the schema as well. As will any
> metadata 
> we decide to include. We may be better off with a more generic 
> representation that more directly maps to something like 
> DetypedModelElement.
> 
> 
> Any and all comments on this are appreciated.
> -- 
> Brian Stansberry
> Principal Software Engineer
> JBoss by Red Hat
> _______________________________________________
> jboss-as7-dev mailing list
> jboss-as7-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jboss-as7-dev



More information about the jboss-as7-dev mailing list