public boolean invoke(Environment env,
InvokeContext context) throws Exception {
final boolean infoEnabled = getLogger().isInfoEnabled();
Map objectModel = env.getObjectModel();
// Setup aggregator
ProcessingPipeline processingPipeline = context.getProcessingPipeline();
processingPipeline.setGenerator("< aggregator >", null, Parameters.EMPTY_PARAMETERS, Parameters.EMPTY_PARAMETERS);
ContentAggregator aggregator = (ContentAggregator) processingPipeline.getGenerator();
aggregator.setRootElement(this.element.resolve(context, objectModel),
this.nsURI.resolve(context, objectModel),
this.nsPrefix.resolve(context, objectModel));
// Get actual parts, potentially filtered by the view
Part[] actualParts;
String cocoonView = env.getView();
if (cocoonView == null) {
// Keep all parts
actualParts = this.allParts;
} else {
// Are there some parts that match this view ?
actualParts = (Part[])this.viewParts.get(cocoonView);
// If not, keep all parts
if (actualParts == null) {
actualParts = this.allParts;
}
}
// Add parts
for (int i = 0; i < actualParts.length; i++) {
Part part = actualParts[i];
if (part != null) {
aggregator.addPart(
part.source.resolve(context, objectModel),
part.element.resolve(context, objectModel),
part.nsURI.resolve(context, objectModel),
part.stripRoot.resolve(context, objectModel),
part.nsPrefix.resolve(context, objectModel)
);
}
}
// Bug #7196 : Some parts matched the view: jump to that view
if (actualParts != this.allParts) {
ProcessingNode viewNode = (ProcessingNode)this.viewNodes.get(cocoonView);
if (viewNode != null) {
if (infoEnabled) {
getLogger().info("Jumping to view '" + cocoonView + "' from aggregate part at " + this.getLocation());
}
return viewNode.invoke(env, context);
}
}
// Check aggregate-level view
if (cocoonView != null && this.viewNodes != null) {
ProcessingNode viewNode = (ProcessingNode)this.viewNodes.get(cocoonView);
if (viewNode != null) {
if (infoEnabled) {
getLogger().info("Jumping to view '" + cocoonView + "' from aggregate at " + this.getLocation());
}
return viewNode.invoke(env, context);
}
}
// Return false to continue sitemap invocation
return false;
}
|