Carsten Ziegeler schrieb:

[…]

Client code inside a web application:

public void parameterizeComponents(Request req, Pipeline pipeline) {
  for (Iterator i = pipeline.getComponents().iterator(); … ) {
    PipelineComponent c = (PipelineComponent) i.next();
    if (c instanceof WebappPipelineComponent) {
      WebappPipelineComponent wpc = (…) c;
      wpc.setRequest(req);
    }
  }
}

The pipeline is executed in a specific environment. The actual
pipeline object itself is oblivious of the environment information, but
the pipeline components are directly dependent on the environment.
>
Hmm, yes this would work, but :) this would make it harder to have a reusable pipeline implementation that frees my application from passing the information to the components.

Does it make a big difference if the information is passed to the pipeline or to the components? To get rid of the boilerplate loop above, the visitor pattern could be used:

public class Webapp implements PipelineEnvironment {

  public void preparePipelineForExecution() {
    // let the pipeline visit its components
    this.pipeline.setEnvironment(this);
  }

  /**
   * @see PipelineEnvironment.environmentalize(…)
   */
  public void environmentalize(PipelineComponent c) {
    if (c instanceof WebappPipelineComponent) {
      WebappPipelineComponent wpc = (…) c;
      wpc.setRequest(req);
    }
  }

}


Currently the app creates a map, passed it to the pipeline implementation and this implementation passes the map on to the components. With the approach above, I would need a custom pipeline implementation to do this.

Hmm, why would you need a custom pipeline implementation? Wouldn't this be generic enough:

public class PipelineImpl implements Pipeline {

  public void setEnvironment(PipelineEnvironment env) {
    for (Iterator i = getComponents().iterator(); … ) {
      PipelineComponent c = (…) i.next();
      env.environmentalize(c);
    }
  }

}


Furthermore there might be a lot of marker interfaces to test.

The marker interfaces wouldn't be generic, but application-specific, so there would only be one needed per application.

I imagine to use application-specific wrappers for "standard" pipeline components, e.g.

public class WebappXsltTransformerWrapper implements Transformer,
  WebappPipelineComponent {

  private XsltTransformer delegate;

  public void setRequest(Request req) {
    if (this.useRequestParams()) {
      this.delegate.setXsltParams(req.getParameterMap());
    }
  }
}

In this case the application can provide a layer of classes to adapt the standard pipeline components to the application-specific environment. The marker interface check would allow to use other components as well - they just wouldn't be "environmentalized".

-- Andreas



--
Andreas Hartmann, CTO
BeCompany GmbH
http://www.becompany.ch
Tel.: +41 (0) 43 818 57 01

Reply via email to