Скорость с использованием #parse, где файл не существует - PullRequest
4 голосов
/ 14 июля 2009

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

Мой вопрос: Как проверить, существует ли файл перед его разбором?

Таким образом, в этом примере файл default.user.properties может на законном основании не существовать, а если этого не произойдет, остальная часть файла не будет проанализирована.

#parse("./default.user.properties")

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

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 23 марта 2011

Только что сделал это с пружиной и скоростью:

У меня возникли проблемы со скоростью, с которой я смог обработать свой обработчик событий, в конце концов, указав его в XML-файле сервлета:

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="WEB-INF/templates"/>
        <property name="velocityPropertiesMap">
            <map>
                <entry key="eventhandler.include.class"><value>com.velocity.events.OptionalIncludeEventHandler</value></entry>
            </map>
        </property>
    </bean>

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

Сам класс прост, довольно вопиющий отрыв от существующего класса скорости "org.apache.velocity.app.event.implementIncludeNotFound". Существующая реализация скорости проверяет наличие файла и, если его нет, возвращает настраиваемую альтернативу (по умолчанию: notfound.vm).

Mine точно такой же, за исключением того, что возвращает ноль, если файл не существует, в результате чего анализатор пропускает эту директиву include / parse:

public class OptionalIncludeEventHandler implements IncludeEventHandler, RuntimeServicesAware {

    private RuntimeServices rs;

    @Override
    public void setRuntimeServices(RuntimeServices rs) {
        this.rs = rs;
    }

    @Override
    public String includeEvent(String includeResourcePath, String currentResourcePath, String directiveName) {
        return rs.getLoaderNameForResource(includeResourcePath) != null ? includeResourcePath : null;
    }

}

Работает как шарм.

Надеюсь, это полезно.

1 голос
/ 13 декабря 2010

Решение, которое я использовал, заключается в создании служебного метода для проверки существования шаблона, т.е.

public synchronized boolean templateExists(String templateFilename) {
    Boolean templateExists = this.templateExistsCache.get(templateFilename);
    if (templateExists != null) {
        return templateExists;
    }
    String absoluteFilename = this.request.getSession().getServletContext().getRealPath(
            "/WEB-INF/templates/" + templateFilename);
    File templateFile = new File(absoluteFilename);
    templateExists = templateFile.exists();
    this.templateExistsCache.put(templateFilename, templateExists);
    return templateExists;
}

private Map<String, Boolean> templateExistsCache = new HashMap<String, Boolean>();

от

https://github.com/okohll/agileBase/blob/master/gtpb_server/src/com/gtwm/pb/model/manageData/ViewTools.java

1 голос
/ 14 июля 2009

Новый тип обработчика событий «IncludeEventHandler». Это позволяет вам, разработчику, определить класс (реализующий IncludeEventHandler), который будет вызываться каждый раз при оценке #parse или #include. Цель вашего обработчика событий - проверить, существует ли шаблон, и установить флаг ошибки для вызывающего кода, если нет. Проверьте документацию для получения дополнительной информации, хотя я сам ее не проверял

...