public final boolean invoke(Environment env,
InvokeContext context) throws Exception {
// Check view
if (this.views != null) {
//inform the pipeline that we have a branch point
context.getProcessingPipeline().informBranchPoint();
String cocoonView = env.getView();
if (cocoonView != null) {
// Get view node
ProcessingNode viewNode = (ProcessingNode)this.views.get(cocoonView);
if (viewNode != null) {
if (getLogger().isInfoEnabled()) {
getLogger().info("Jumping to view " + cocoonView + " from serializer at " + this.getLocation());
}
return viewNode.invoke(env, context);
}
}
}
final Map objectModel = env.getObjectModel();
final ProcessingPipeline pipeline = context.getProcessingPipeline();
// Perform link translation if requested
if (objectModel.containsKey(Constants.LINK_OBJECT)) {
pipeline.addTransformer("< translator >", null, Parameters.EMPTY_PARAMETERS, Parameters.EMPTY_PARAMETERS);
}
if (objectModel.containsKey(Constants.LINK_COLLECTION_OBJECT) && env.isExternal()) {
pipeline.addTransformer("< gatherer >", null, Parameters.EMPTY_PARAMETERS, Parameters.EMPTY_PARAMETERS);
}
String type = this.serializerName;
String source = this.source.resolve(context, objectModel);
Parameters parameters = VariableResolver.buildParameters(this.parameters, context, objectModel);
Parameters hintParameters = this.pipelineHints == null
? Parameters.EMPTY_PARAMETERS
: VariableResolver.buildParameters(this.pipelineHints, context, objectModel);
String mimeType = this.mimeType.resolve(context, objectModel);
pipeline.setSerializer(type,
source,
parameters,
hintParameters,
mimeType);
// Set status code *only* if there is one - do not override status
// code if it was set elsewhere.
String statusCodeString = this.statusCode.resolve(context, objectModel);
if (statusCodeString != null) {
int statusCodeInt = DEFAULT_STATUS_CODE;
try {
statusCodeInt = Integer.parseInt(statusCodeString);
} catch (NumberFormatException e) {
getLogger().warn("Status code value '" + statusCodeString + "' is not an integer. " +
"Using " + DEFAULT_STATUS_CODE + " instead.", e);
}
if (statusCodeInt >= 0) {
env.setStatus(statusCodeInt);
}
}
if (!context.isBuildingPipelineOnly()) {
// Process pipeline
return pipeline.process(env);
}
// Return true : pipeline is finished.
return true;
}
|