Apache Velocity: существует ли стандартный способ проверки правильности шаблона из командной строки? - PullRequest
6 голосов
/ 16 декабря 2009

На нашем сайте используется шаблонный язык Apache Velocity . Наша система управления контентом уже проверяет любые сгенерированные XML-документы на корректность. Перед отправкой файлов на действующий сайт нас попросили проверить документы на наличие ошибок синтаксиса Velocity.

Существует ли стандартный способ проверки правильности шаблона Velocity из командной строки?

Я готов прочитать путь к шаблону, инициализировать Velocity Engine, проанализировать шаблон и зафиксировать все ошибки , как показано на этой странице , но если есть готовый инструмент, который принимает файл конфигурации и выкладывает любые ошибки, тогда я бы лучше использовал это.


Обновление

Вот что я в итоге сделал:

package velocitysample;

import java.io.IOException;
import java.io.StringWriter;
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;

public class Main
{
   /** Define a static logger variable so that it references the Logger
    *  instance named "MyApp".
    */
    private static Logger logger = Logger.getLogger(Main.class);


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {

        /* Set up a simple log4j configuration that logs on the console. */
        BasicConfigurator.configure();


        /* Check to see that a template path was passed on the command line. */
        if (args.length != 1)
        {
            logger.fatal("You must pass the path to a template as a " +
                    "command line argument.");
            return;
        }

        /* Pull the template filename from the command line argument. */
        String fileName = args[0];

        try
        {
            Velocity.setProperty("resource.loader", "file");
            Velocity.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
            Velocity.setProperty("file.resource.loader.path", "/templates/");
            Velocity.setProperty("file.resource.loader.cache", "false");
            Velocity.setProperty("file.resource.loader.modificationCheckInterval", "0");

            Velocity.init();
        }
        catch (Exception ex)
        {
            logger.fatal("Error initializing the Veolcity engine.", ex);
            return;
        }

        boolean error = false;

        /* Create an empty Velocity context */
        VelocityContext context = new VelocityContext();

        Template template = null;

        try
        {
           template = Velocity.getTemplate(fileName);
        }
        catch( ResourceNotFoundException rnfe )
        {
           logger.error("Couldn't find the template to parse at this path: " +
                   fileName + ".", rnfe);
           error = true;
        }
        catch( ParseErrorException peex )
        {
            logger.error("Error parsing the template located at this path: " +
                    fileName + ".", peex);
            error = true;
        }
        catch( MethodInvocationException mie )
        {
            logger.error("Something invoked in the template (" + fileName +
                    ") threw an Exception while parsing.", mie);
            error = true;
        }
        catch( Exception e )
        {
            logger.error("An unexpected exception was thrown when attempting " +
                    "to parse the template: " + fileName + ".", e);
            error = true;
        }

        if (error)
        {
            return;
        }

        StringWriter sw = new StringWriter();
        try
        {
            template.merge(context, sw);
        } 
        catch (ResourceNotFoundException rnfe)
        {
            logger.error("Couldn't find the template to merge at this path: " +
                   fileName + ".", rnfe);
            error = true;
        } 
        catch (ParseErrorException peex)
        {
            logger.error("Error parsing the template at this path during merge: " +
                    fileName + ".", peex);
            error = true;
        } 
        catch (MethodInvocationException mie)
        {
            logger.error("Something invoked in the template (" + fileName +
                    ") threw an Exception while merging.", mie);
            error = true;
        } 
        catch (IOException ioe)
        {
            logger.error("Error reading the template located at this path from " +
                    "disk: " + fileName + ".", ioe);
            error = true;
        }
        catch( Exception e )
        {
            logger.error("An unexpected exception was thrown when attempting " +
                    "to merge the template: " + fileName + ".", e);
            error = true;
        }

        if (!error)
        {
            logger.info("No syntax errors detected.");
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 16 декабря 2009

Существует инструмент, распространяемый вместе с Velocity, который называется TemplateTool, который выводит все ссылки и может использоваться для проверки синтаксиса шаблона.

Однако для проверки любого шаблона необходимо правильно настроить контекст.,Так что лучшая проверка - написать свой собственный инструмент с собственным контекстом.

1 голос
/ 06 июня 2012

В декабре 2010 года кто-то опубликовал инструмент для проверки скорости. Я попробовал это, и это работает отлично. Он использует Velocity 1.6.4, но, возможно, его можно заменить на другую версию, если это необходимо.

http://code.google.com/p/velocity-validator/

1 голос
/ 01 января 2010

Чтобы выявлять синтаксические ошибки скорости, ваш подход, вероятно, лучший.

Однако он будет игнорировать недопустимые аргументы макроса и несуществующие ссылки. В Velocity 1.6 есть строгий режим, который вы можете установить, который будет генерировать исключение для плохих параметров макроса (например, неправильное число) или для плохих ссылок (например, $ abc.badMethod ()). Это предполагает, что вы заполняете контекст шаблонов, используемых в вашем инструменте тестирования, так же, как когда шаблоны используются в производстве.

...