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

org.teatrove.teaservlet.TeaServletEngineImplDev Maven / Gradle / Ivy

Go to download

The TeaServlet is a template engine that works with the Tea template language.

The newest version!
/*
 *  Copyright 1997-2011 teatrove.org
 *
 *  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 org.teatrove.teaservlet;

import org.teatrove.tea.compiler.TemplateRepository;
import org.teatrove.tea.compiler.TemplateRepository.TemplateInfo;
import org.teatrove.tea.engine.Template;
import org.teatrove.tea.engine.TemplateCompilationResults;
import org.teatrove.trove.log.Log;
import org.teatrove.trove.util.PropertyMap;
import org.teatrove.trove.util.plugin.PluginContext;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author eearle
 */
public class TeaServletEngineImplDev extends TeaServletEngineImpl {

    Log mLog;
    private boolean mRecurse;

    public void startEngine(PropertyMap properties,
                            ServletContext servletContext,
                            String servletName,
                            Log log,
                            List memLog,
                            PluginContext plug) throws ServletException {
        mLog = log;

        mRecurse = properties.getBoolean("autocompile.recurse", true);

        mLog.warn("DEVELOPEMENT MODE - changed templates will be autocompiled when requested");

        super.startEngine(properties, servletContext, servletName, log, memLog, plug);
    }


    public TeaServletTransaction createTransaction(HttpServletRequest request, HttpServletResponse response, boolean lookupTemplate) throws IOException {

        TeaServletTemplateSource templateSrc = getTemplateSource();

        String templateName;
        if ((templateName = request.getPathInfo()) == null) {
            if ((templateName = request.getServletPath()) == null) {
                templateName = "/";
            }
        }

        // forge template name from request info
        int index = templateName.lastIndexOf('.');
        if (index >= 0) {
            templateName = templateName.substring(0, index);
        }
        while (templateName.startsWith("/")) {
            templateName = templateName.substring(1);
        }
        while (templateName.endsWith("/")) {
            templateName = templateName.substring(0, templateName.length() - 1);
        }
        templateName = templateName.replace('/', '.');

        try {
            Map changedTemplates = templateSrc.listTouchedTemplates();

            // if this or any template called from this template are changed, mark try to compile this template
            List toCompile = getChangedDeps(changedTemplates, templateName);

            if(changedTemplates.containsKey(templateName)) {
                toCompile.add(templateName);
            }

            if (toCompile.size()>0) {
                String[] toCompArr = (String[])toCompile.toArray(new String[toCompile.size()]);
                TemplateCompilationResults r = templateSrc.compileTemplates(null, toCompArr);

                if (r.getTemplateErrors().size() > 0) {
                    Template template = templateSrc.getTemplate("system.teaservlet.InlineCompileErrors");

                    request = new HttpServletRequestWrapper(request) {

                        public String getPathInfo() {
                            return "/system/teaservlet/InlineCompileErrors";
                        }
                    };

                    request.setAttribute("inline.reload.result", r);
                }
            }

        } catch (Exception ex) {
            mLog.error(ex);
        }

        return super.createTransaction(request, response, lookupTemplate);
    }

    private List getChangedDeps(Map changedTemplates, String templateName) {
        List changed = new ArrayList();

        if(mRecurse) {
            TemplateInfo tInfo = TemplateRepository.getInstance().getTemplateInfo(templateName);
            if(tInfo!=null) {
                String[] deps = tInfo.getDependents();
                depLoop:for (int i = 0; i < deps.length; i++) {
                    String dep = deps[i].replace('/', '.');
                    dep = dep.substring("org/teatrove/teaservlet/template/".length());

                    if(changedTemplates.containsKey(dep)) {
                        changed.add(dep);
                    }

                    changed.addAll(getChangedDeps(changedTemplates, dep));
                }
            }
        }
        return changed;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy