Главная » XSLT » Генерация кода заглушки обработчика сообщения

0

Задача

Требуется сгенерировать скелет обработчика сообщения.

Решение

Следующая таблица стилей создает простой скелет обработчика. Она прини­мает на входе имя процесса и генерирует код заглушки.

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.1" xmlns:xsl="http://www,w3.org/1999/XSL/Transform"> <xsl:output method="text"/>

<!— Определяет, для какого процесса генерировать обработчики сообщений —> <xsl:param name="process"/>

<!– Определяет, для каких сообщений генерировать обработчики. –> <!– Специальное значение %ALL% означает "для всех сообщений" –> <xsl:param name="message" select=" ‘%ALL%’ "/>

<!– Каталог, в котором создаются выходные файлы –> <xsl:variable name="message-dir" select=" ‘messages’ "/> <xsl:variable name="directory-sep" select=" ‘/’ "/> <xsl:variable name="include-ext" select=" ‘.h’ "/>

<xsl:template match="MessageRepository"> <xsl:choose>

<xsl:when test="$message=’%ALL%’" > <xsl:apply-templates

select="Messages/Message[Receivers/ProcessRef = $process]"/> </xsl:when> <xsl:otherwise>

<xsl:apply-templates

select="Messages/Message[Receivers/ProcessRef = $process and

Name=$message]"/>

</xsl:otherwise> </xsl:choose> </xsl:template>

<xsl:template match="Message"> <xsl:document href="{concat(Name,’.h’)}"> <xsl:call-template name="makeHeader"/>

</xsl:document>

<xsl:document href="{concat(Name,’.cpp’)}">

<xsl:call-template name="makeSource"/> </xsl:document> </xsl:template>

<xsl:template name="makeHeader"> #ifndef <xsl:value-of select="Name"/>_h #define <xsl:value-of select="Name"/>_h

#include &lt;transport/MessageHandler.h&gt; // Опережающие объявления

class <xsl:value-of select="DataTypeName"/> ;

/*!TODO: Вставить сюда дополнительные опережающие объявления.*/

class <xsl:value-of select="Name"/> : public MessageHandler {

public:

<xsl:value-of select="Name"/>(const <xsl:value-of

select="DataTypeName"/>&amp; data) ; bool process( ) ; private:

const <xsl:value-of select="DataTypeName"/>&amp; m_Data ; } ;

#endif

</xsl:template>

<xsl:template name="makeSource"> #include &lt;messages/<xsl:value-of select="Name"/>.h&gt;

/*!TODO: Вставить сюда дополнительные директивы include.*/

<xsl:value-of select="Name"/>::<xsl:value-of select="Name"/>(const <xsl:value-of select="DataTypeName"/>&amp; data) : m_Data(data)

{ }

bool <xsl:value-of select="Name"/>::process( )

{

/*!TODO: Вставить сюда код обработчика. */ return true;

</xsl:template> </xsl:stylesheet>

Эта таблица стилей генерирует заголовочный и исходный файл для каждого обрабатываемого ей сообщения. Результат показан в примерах 12.1 и 12.2.

Пример 12.1. AddStockOrder.h

#ifndef ADD_STOCK_ORDER_h #define ADD_STOCK_ORDER_h

#include <transport/MessageHandler.h>

// Опережающие объявления class AddStockOrderData ;

/*!TODO: Вставить сюда дополнительные опережающие объявления.*/

class ADD_STOCK_ORDER : public MessageHandler {

public:

ADD_STOCK_ORDER(const AddStockOrderData& data) ; bool process( ) ; private:

const AddStockOrderData& m_Data ;

} ;

#endif

Пример 12.2. AddStockOrder.cpp

#include <messages/ADD_STOCK_ORDER.h>

/*!TODO: Вставить сюда дополнительные директивы include.*/

ADD_STOCK_ORDER::ADD_STOCK_ORDER(const AddStockOrderData& data) : m_Data(data)

{ }

bool ADD_STOCK_ORDER::process( )

{

/*!TODO: Вставить сюда код обработчика. */ return true;

Обсуждение

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

Инструменты, генерирующие код с участками TODO (СДЕЛАТЬ), часто назы­вают мастерами. Приведенный выше мастер генерации обработчиков сообщений – очень простой пример такой программы. Некоторые коммерческие мастера генери­руют структуру всего приложения. Неясно, потянет ли XSLT создание мастеров такого масштаба. Но для простых генераторов заглушек в случае, когда исходные данные представлены в формате XML, XSLT лучше многих других языков, вклю­чая и Perl. Многие фанатики Perl не согласятся с последним утверждением, так как обработку XML они рассматривают просто как разновидность обработки текста (а всем известно, что язык Perl удерживает неоспоримое первенство в этой области). Однако можно привести веские аргументы в пользу того, обработка XML – это не столько обработка текста, сколько деревьев, содержащих текстовые узлы. А с пре­образованиями деревьев XSLT справляется куда ловчее, чем Perl. Но Perl и XSLT можно использовать и совместно, взяв лучшее от того и другого. Такой подход опи­сан в главе 14. Там же представлено расширение XSLT, с помощью которого можно устранить многословность, свойственную генераторам кода на чистом XSLT.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии