ACCELEO: создание файла по пути в зависимости от структуры модели

В преобразовании модели Acceleo в текст я хотел бы создать файл для класса UML, согласованный с пакетами, содержащими класс (пространство имен класса в модели UML). Проблема, с которой я сталкиваюсь, заключается в том, что я должен делать это в строке, поскольку этого требует команда [file], поэтому я пытаюсь что-то вроде этого

[file ((c.allOwningPackages().name.->sep('/')).concat(c.name.concat('.hpp')),false,'UTF-8')]

но я получаю эту ошибку на concat:

 Cannot find operation (concat(String)) for the type (OclAny)

Каков правильный способ сделать это?


person Andrea Sindico    schedule 07.07.2012    source источник


Ответы (1)


Не обязательно делать это в той же строке, что и блок файла. Два обычных способа выполнить то, что вы пытаетесь сделать, это

  • вложить блок файла в блок let или
  • извлечь логику в другой шаблон или запрос.

Для вашего примера b) даст что-то вроде:

[template public myMainTemplate(c : uml::Class)]
    [file (getpackage(c), false, 'UTF-8')]
        ...
    [/file]
[/template]

[template private getPackage(c : uml::Class) post(trim())]
    [c.ancestors()->reverse()->sep('/')->including(c.name.concat('.hpp'))/]
[/template]

Обратите внимание на использование «->в том числе» вместо «.concat» для коллекций, что является причиной появления сообщения об ошибке. Конечно, это было только для того, чтобы иметь все внутри одного единственного выражения. Это может быть более читабельно как:

[template private getPackage(c : uml::Class) post(trim())]
    [c.ancestors()->reverse()->sep('/')/]/[c.name/].hpp
[/template]
person Kellindil    schedule 09.07.2012
comment
Спасибо. Однако операция c.ancestors()-›reverse() не дает мне значимого результата. Я использовал c.allOwningPackages().name-›sep('/') и работает так, как вы предложили. Ключ заключался в том, чтобы поместить все, что мне нужно, в другой шаблон, я не знаю, почему я думал, что невозможно вызвать шаблон в блоке файла :) еще раз спасибо - person Andrea Sindico; 12.07.2012