RE: Implicit output ports and p:declare-step

> I can see several options:
> 
> 1. We say that the implicitly created port is named "result".

Definitely better than having an anonymous port. It would also make it
possible to address the results of other compound steps (not just
p:declare-step) that have no explicit output ports:

<p:group name="foo">
  <p:identity/>
</p:group>

<p:identity>
  <p:input port="source">
    <p:pipe step="foo" port="result"/>
  </p:input>
</p:identity>

But still not sure we should go that route (creating implicit primary
output ports).

> 
> 2. We say that it's your bug, you fix it. Either by making
>    the port name explicit or by adding an identity step.
> 
>     <px:fred name="myproc"/>
>     <p:identity name="myproc-identity"/>
>     <p:store href="fred-output.xml"/>
> 
>     <p:identity>
>       <p:input port="source">
>         <p:pipe step="myproc-identity" port="result"/>
>       </p:input>
>     </p:identity>

Would that be declaring victory, or admitting defeat? I am still trying
to understand whether the implicit primary output port in p:declare-step
is a feature, or a bug. If we don't change anything, we probably should
make it more explicit to the users that they should be aware of yet
another (weird?|great?) feature when writing pipelines.

> 
> 3. We say that the rules about defaulting output ports don't apply to
>    p:declare-step.

That was my initial opinion, but that might be too strict, or too big a
change at this moment.
Now I lean more towards option 1 - if we are going to change anything,
this one seems to be simple enough, and it would actually add something
to the language (you can always address the output of compound steps
with no explicit output ports)

> 
> Choice 2 is the only one that requires no changes to the spec.
> 
> But now consider how implementations interface with pipelines. Mostly,
> I think, implementors (and APIs) are going to want to use port names.
> XML Calabash, for example, has -i/port/ and -o/port/ options for
> binding inputs and outputs. As long as port names are uniformly
> available, we can have a clean port-name based interface.

That is how I discovered the problem. I ran a pipeline with no output
ports using our command-line interface, and to my surprise, I saw output
on stdout. But if you want to, let's say, redirect the primary output
port, you can't because it has no name.

In our API, it is less of an issue. When you run a pipeline in Calumet,
you get a PipelineOutput object that provides you with access to all
output ports of the pipeline, also indicating which one is primary. So
in the case of a pipeline with no explicit output ports, you will still
be able to address the implicit port.


Regards,
Vojtech

Received on Thursday, 25 June 2009 06:55:13 UTC