- From: Norman Walsh <Norman.Walsh@Sun.COM>
- Date: Thu, 07 Sep 2006 10:21:49 -0400
- To: public-xml-processing-model-wg@w3.org
- Message-ID: <87mz9bvjsy.fsf@nwalsh.com>
/ Alex Milowski <alex@milowski.org> was heard to say:
| I've been working on my compiler and have worked through some
| terminology that I think may work well in our specification. One
| of the current problems we have is that how the
| declare-input/output/etc. work for pipelines, groups, and other
| constructs that contain steps has not been well specified in our
| current document. My hope is that this will contribute to
| helping make that more clear.
|
| Proposal:
|
| 1. We introduce the concept of a "Component Type". Then components
| can be instances. This will let us handle the "dynamic" input
| and output declarations on group, foreach, viewport, choose and
| even pipeline.
|
| A component type is essentially what the [p:]declare-component
| element defines in our current specification. What I'd like to
| add is that each instance of group, foreach, viewport, choose and
| even pipeline fabricates a component type that matches the
| signature. For pipelines, this will help us when we go to
| invoke pipelines from libraries in a step--which are then essetially
| just like invoking a component in a step.
|
| A component type is just the set of inputs ports, output ports, and
| parameters without bindings. A [p:]declare-component just defines
| a particular static component type that can be used by [p:]step in
| a pipeline.
So you're thinking of something along the following lines:
All components have a component type defined by the name of the
component and the specific set of inputs, outputs, and parameters that
it declares. Many components (e.g., xslt, xinclude, etc.) have a
static component type determined by the name, input, output, and
parameters declared in the p:declare-component for that component.
Language constructs (e.g, pipeline, for-each, group, etc.) that have
declarations as their immediate children implicitly define a component
type that matches their signature.
|
| 2. The elements [p:]group, [p:]foreach, [p:]viewport, [p:]choose and
| [p:]pipeline all contain steps and so I propose we call them
| "step containers".
I had sort of hoped to avoid making a point of the distinction between
"step container" steps and "ordinary steps". But looking at the
constraints that we have to describe on port bindings, I think you may
be right.
| Every "step container" is also a step and
| has a component type that is generated by the [p:]declare-input,
| [p:]declare-output, and [p:]declare-parameter elements present or
| inferred contained in their declaration.
|
| When a step container is invoked or when its inputs/outputs are
| bound, they act just like a step in that there is a component type
| that defines the inputs and output available and those must be
| bound in the "normal" ways.
But they aren't bound in the "normal" ways, they're simultaneously
declared and bound in the declare-input/declare-output statements.
However, I agree that we need to say that all of the declared inputs
and outputs must be bound, just as they must be bound in the
invocation of a "normal" component.
| 3. Step containers also bind their inputs to the output of other
| steps. We must constrain the reference port to be an output port
| of an ancestor or sibling step in the document. That constraint
| is not present in the current document as far as I can see.
I think you're right about it not being explicit in the document yet.
I believe that the constraint is:
The declare-inputs (whether implicit or explicit, which is a
separable question) of a step component must be bound to the output
port of some preceding step or the declared-input port of some
ancestor step.
| 4. Step containers bind their output port "internally" to the output
| of some step that they contain. I think we should call that the
| "output source". Then we can say the step container produces
| outputs on their declared output ports from the output source
| identified on the output port declaration.
|
| The reference in the output source can only be to direct children
| steps in the step container. Step containers cannot refer to
| ancestor or sibling step's outputs nor to outputs within other
| step containers.
Do we need to define output source? Can't we just say that the
declare-output statements in a step container must be bound to the
output port of a step that is a direct child of the step container?
(If they're bound to an output port at all, they may just be "here"
documents or static hrefs.)
| 5. Some steps inside step containers bind their input ports to the
| inputs declared on the step container. This is the one place
| where we reference inputs rather than outputs. To make this
| make sense, I suggest we call such references "input references".
| Only direct children of a step container can refer to step
| container inputs.
I think the constraints on inputs on steps within a step container are
the same as the constraints on the input to the container itself: the
inputs of a step in a step container must be bound to the output port
of some preceding step or the declared-input port of some ancestor
step container.
| What this means is that at the conceptual level, when you are
| "drawing" the flow graph of all the input/output connections
| between steps, there are some special interpretations for
| step containers. Since a step container is also a step, from
| the perspective of the rest of the pipeline, everything is
| exact the same in that inputs point to outputs.
|
| In the case of a step inside a step container, if the target
| step of an input binding is the step container, the port name
| must point to an input of the step container as this is an
| "input reference".
|
| For the step container to produce an output, the step container
| must inspect its output sources for the step (or steps in
| the case of choose) that may produce its output.
|
| One of the good things about this is that everything is uniform
| from the pipeline-as-a-step-container through all the rest of
| our pipeline constructs. We'll need to carefully define
| what it means to be "a child step" as we have some cases where
| the XML has wrapper elements as in choose or try/catch.
|
| Thoughts?
I think it's a good direction.
Be seeing you,
norm
--
Norman Walsh
XML Standards Architect
Sun Microsystems, Inc.
Received on Thursday, 7 September 2006 14:21:45 UTC