package org.jtwig.render.node.renderer;
import org.jtwig.environment.Environment;
import org.jtwig.macro.render.ImportRender;
import org.jtwig.model.tree.ImportNode;
import org.jtwig.render.RenderRequest;
import org.jtwig.render.expression.CalculateExpressionService;
import org.jtwig.renderable.Renderable;
import org.jtwig.renderable.impl.EmptyRenderable;
import org.jtwig.resource.ResourceService;
import org.jtwig.resource.exceptions.ResourceNotFoundException;
import org.jtwig.resource.metadata.ResourceMetadata;
import org.jtwig.resource.reference.ResourceReference;
import org.jtwig.util.ErrorMessageFormatter;
public class ImportNodeRender implements NodeRender<ImportNode> {
private final ImportRender importRender;
public ImportNodeRender(ImportRender importRender) {
this.importRender = importRender;
}
@Override
public Renderable render(RenderRequest renderRequest, ImportNode node) {
Environment environment = renderRequest.getEnvironment();
CalculateExpressionService calculateExpressionService = environment.getRenderEnvironment().getCalculateExpressionService();
ResourceService resourceService = environment.getResourceEnvironment().getResourceService();
String macroIdentifier = node.getAliasIdentifier().getIdentifier();
Object objectPath = calculateExpressionService.calculate(renderRequest, node.getImportExpression());
String path = environment.getValueEnvironment().getStringConverter().convert(objectPath);
ResourceReference current = renderRequest.getRenderContext().getCurrent(ResourceReference.class);
ResourceReference newReference = resourceService.resolve(current, path);
ResourceMetadata resourceMetadata = resourceService.loadMetadata(newReference);
if (resourceMetadata.exists()) {
importRender.render(renderRequest, newReference, macroIdentifier);
} else {
throw new ResourceNotFoundException(ErrorMessageFormatter.errorMessage(node.getPosition(), String.format("Resource '%s' not found", path)));
}
return EmptyRenderable.instance();
}
}