All Downloads are FREE. Search and download functionalities are using the official Maven repository.

spark.template.closure.ClosureTemplateEngine Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2014
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package spark.template.closure;

import com.google.common.base.Preconditions;
import com.google.template.soy.SoyFileSet;
import com.google.template.soy.tofu.SoyTofu;
import spark.ModelAndView;
import spark.TemplateEngine;

import java.util.Map;

/**
 * Google's Closure template engine for sparkjava.
 * See: https://developers.google.com/closure/templates/
 *
 * @author Prasanna Venkat https://github.com/prasannasv
 */
public class ClosureTemplateEngine extends TemplateEngine {

    private final SoyTofu soyTofu;

    /**
     * Constructs a closure template engine with the given soy file paths.
     *
     * @param soyFilePaths one or more paths to .soy files relative to /templates in the resources folder.
     * @throws IllegalArgumentException if the input is null.
     */
    public ClosureTemplateEngine(final String... soyFilePaths) {
        Preconditions.checkNotNull(soyFilePaths, "at least one path to soy file must be specified");

        SoyFileSet.Builder sfsBuilder = SoyFileSet.builder();
        for (final String soyFilePath : soyFilePaths) {
            sfsBuilder = sfsBuilder.add(ClosureTemplateEngine.class.getResource("/templates/" + soyFilePath));
        }

        soyTofu = sfsBuilder.build().compileToTofu();
    }

    /**
     * Constructs a closure template engine with a compiled tofu
     *
     * @param soyTofu the compiled SoyTofu instance
     */
    public ClosureTemplateEngine(final SoyTofu soyTofu) {
        this.soyTofu = soyTofu;
    }

    @Override
    @SuppressWarnings("unchecked")
    public String render(final ModelAndView modelAndView) {
        final String templateName = modelAndView.getViewName();

        if (modelAndView.getModel() instanceof Map) {
            final Map soyMapData = (Map) modelAndView.getModel();

            return soyTofu.newRenderer(templateName).setData(soyMapData).render();
        }

        throw new IllegalArgumentException("Expecting the model to be an instance of Map");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy