001/*
002 * (C) Copyright 2006-2009 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Jean-Marc Orliaguet, Chalmers
018 *
019 * $Id$
020 */
021
022package org.nuxeo.theme.webengine.fm.extensions;
023
024import java.io.BufferedReader;
025import java.io.IOException;
026import java.io.StringReader;
027import java.net.URL;
028import java.util.Map;
029
030import org.apache.commons.logging.Log;
031import org.apache.commons.logging.LogFactory;
032import org.nuxeo.ecm.webengine.WebEngine;
033import org.nuxeo.ecm.webengine.model.WebContext;
034import org.nuxeo.theme.models.InfoPool;
035import org.nuxeo.theme.themes.ThemeException;
036import org.nuxeo.theme.themes.ThemeManager;
037
038import freemarker.core.Environment;
039import freemarker.ext.beans.BeansWrapper;
040import freemarker.template.Template;
041import freemarker.template.TemplateDirectiveBody;
042import freemarker.template.TemplateDirectiveModel;
043import freemarker.template.TemplateException;
044import freemarker.template.TemplateModel;
045import freemarker.template.TemplateModelException;
046
047/**
048 * @author <a href="mailto:jmo@chalmers.se">Jean-Marc Orliaguet</a>
049 */
050public class NXThemesFragmentDirective implements TemplateDirectiveModel {
051
052    private static final Log log = LogFactory.getLog(NXThemesFragmentDirective.class);
053
054    final String templateEngine = "freemarker";
055
056    @SuppressWarnings("unchecked")
057    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
058            throws TemplateException, IOException {
059
060        if (loopVars.length != 0) {
061            throw new TemplateModelException("This directive doesn't allow loop variables.");
062        }
063        if (body != null) {
064            throw new TemplateModelException("Didn't expect a body");
065        }
066
067        WebContext ctx = WebEngine.getActiveContext();
068        if (ctx == null) {
069            throw new IllegalStateException("Not In a Web Context");
070        }
071
072        env.setVariable("nxthemesInfo", BeansWrapper.getDefaultInstance().wrap(InfoPool.getInfoMap()));
073
074        Map<String, String> attributes = Utils.getTemplateDirectiveParameters(params);
075        final URL elementUrl = new URL(String.format("nxtheme://element/%s/%s/%s/%s", attributes.get("engine"),
076                attributes.get("mode"), templateEngine, attributes.get("uid")));
077
078        String rendered = "";
079        try {
080            rendered = ThemeManager.renderElement(elementUrl);
081        } catch (ThemeException e) {
082            log.error("Element rendering failed: " + e.getMessage());
083            return;
084        }
085        StringReader sr = new StringReader(rendered);
086        BufferedReader reader = new BufferedReader(sr);
087        Template tpl = new Template(elementUrl.toString(), reader, env.getConfiguration(),
088                env.getTemplate().getEncoding());
089
090        try {
091            env.include(tpl);
092        } catch (TemplateException | IOException e) {
093            log.error("Rendering of Freemarker template failed: \n" + rendered, e);
094        } finally {
095            reader.close();
096            sr.close();
097        }
098
099    }
100
101}