001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     bstefanescu
011 */
012package org.nuxeo.ecm.automation.core.rendering;
013
014import java.io.File;
015import java.io.IOException;
016import java.io.StringReader;
017import java.io.StringWriter;
018import java.io.Writer;
019import java.net.MalformedURLException;
020import java.net.URL;
021import java.util.Map;
022
023import org.nuxeo.ecm.platform.rendering.api.RenderingException;
024import org.nuxeo.ecm.platform.rendering.api.ResourceLocator;
025import org.nuxeo.ecm.platform.rendering.fm.FreemarkerEngine;
026import org.nuxeo.runtime.api.Framework;
027import org.nuxeo.runtime.services.resource.ResourceService;
028
029import freemarker.core.Environment;
030import freemarker.template.Template;
031import freemarker.template.TemplateException;
032
033/**
034 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
035 */
036public class FreemarkerRender extends FreemarkerEngine implements Renderer {
037
038    public FreemarkerRender() {
039        setResourceLocator(new ResourceLocator() {
040            @Override
041            public URL getResourceURL(String key) {
042                try {
043                    if (key.startsWith(Renderer.TEMPLATE_PREFIX)) {
044                        return Framework.getService(ResourceService.class).getResource(
045                                key.substring(Renderer.TEMPLATE_PREFIX.length()));
046                    } else {
047                        return new URL(key);
048                    }
049                } catch (MalformedURLException e) {
050                    return null;
051                }
052            }
053
054            @Override
055            public File getResourceFile(String key) {
056                return null;
057            }
058        });
059    }
060
061    public void renderContent(String content, Object ctx, Writer writer) throws IOException, TemplateException {
062        StringReader reader = new StringReader(content);
063        Template tpl = new Template("@inline", reader, getConfiguration(), "UTF-8");
064        Environment env = tpl.createProcessingEnvironment(ctx, writer, getObjectWrapper());
065        env.process();
066    }
067
068    @Override
069    public String render(String uriOrContent, Map<String, Object> root) throws RenderingException, TemplateException,
070            IOException {
071        if (root.get("Document") != null) {
072            // mvel wrapper not supported in freemarker
073            root.put("Document", root.get("This"));
074        }
075        StringWriter result = new StringWriter();
076        if (uriOrContent.startsWith(Renderer.TEMPLATE_PREFIX)) {
077            render(uriOrContent, root, result);
078        } else {
079            renderContent(uriOrContent, root, result);
080        }
081        return result.getBuffer().toString();
082    }
083}