Статьи

Использование Xpand в мастерах Eclipse

В ESE у меня была хорошая беседа с Крисом (на самом деле, у меня было много хороших чатов с большим количеством хороших людей — было довольно сложно посетить любую из сессий), который сказал мне, что он изучает движки шаблонов. , Я оставляю на ваше усмотрение делать какие-либо предположения о том, почему он заинтересован в шаблонизаторах Мне довелось знать, по крайней мере, три движка шаблонов: Velocity (который я имел удовольствие использовать в мои активные дни на AndroMDA.org), механизм шаблона, erhm, …, используемый в PDE ( однажды я исправил ошибку, которая приводила к был вызван этим движком) и — как вы уже догадались — Xpand (на котором я являюсь коммиттером).

Итак, я дал небольшую демонстрацию Xtext и Xpand, чтобы показать Крису, как легко создавать (основанные на модели) шаблоны генерации кода. Xpand поставляется с красивым редактором, который делает редактирование шаблонов приятным — он имеет подсветку кода, навигацию по гиперссылкам, осведомленность о модели и другие достоинства редактора.

Вместо того, чтобы рассказывать, как это работает, только Крису, вот краткое руководство о том, как написать собственный шаблон Xpand и использовать его в мастере. Чтобы сделать пример более реалистичным, я решил реализовать мастер, который создает файл Ant build.xml для простого проекта (чего нет в Eclipse, AFAIK). Итак, поехали.

Предпосылки:

Как это сделать

  1. Загрузите и установите необходимые компоненты.
  2. Создайте новый проект плагина с именем «de.peterfriese.antwizard»
  3. Добавить Мастер создания файлов в проект. Я использовал Мастер пользовательских плагинов, чтобы начать работу.
  4. Очистите страницу мастера и добавьте несколько полей для имени проекта, исходной папки и двоичной папки.
  5. Мы хотим перенести значения, введенные в этом мастере, в наш шаблон, поэтому нам нужно создать модель Ecore, которая описывает нашу модель данных.
    antwizard_metamodel

  6. Добавьте org.eclipse.emf и org.eclipse.emf.edit к зависимостям вашего плагина.
  7. Создайте genmodel и позвольте EMF сгенерировать код модели для вас.
  8. Добавьте код в мастер, который передает значения из полей ввода в вашу модель. Можно подумать об использовании привязки данных для этого, я пока что использовал прямой подход read’n’write:
    public boolean performFinish() {
        final String containerName = page.getContainerName();
        final String srcDirName = page.getSrcDirName();
        final String binDirName = page.getBinDirName();
        // ...
    }
    private BuildSpecification createModel(IProject project, String srcDirName,
        String binDirName) {
        BuildSpecification buildSpecification = BuildspecificationFactory.eINSTANCE.createBuildSpecification();
        Project projectSpecification = BuildspecificationFactory.eINSTANCE.createProject();
        projectSpecification.setName(project.getName());
        projectSpecification.setBinaryFolder(binDirName);
        projectSpecification.setSourceFolder(srcDirName);
        buildSpecification.setProject(projectSpecification);
        return buildSpecification;
    }
  9. Создайте шаблон Xpand de.peterfriese.antwizard / src / template / BuildTemplate.xpt :

     

    Шаблон файла Ant

    Если вам интересно, как получить эти забавные символы: убедитесь, что мы создали этот файл с помощью редактора Xpand — в нем есть помощь по коду (CTRL + пробел) для этих символов.

  10. Создайте файл Xtend de.peterfriese.antwizard / src / template / GeneratorExtensions.ext :

     

    Расширения файлов Ant

  11. Добавьте org.eclipse.xpand , org.eclipse.xtend и org.eclipse.xtend.typesystem.emf к зависимостям вашего плагина.
  12. Наконец, нам нужно предоставить некоторый код для вызова генератора:
    private void generate(BuildSpecification buildSpec, IProgressMonitor monitor) throws CoreException {
    
        // get project root folder as absolute file system path
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        IResource resource = root.findMember(new Path(buildSpec.getProject().getName()));
        String containerName = resource.getLocation().toPortableString();
    
        // configure outlets
        OutputImpl output = new OutputImpl();
        Outlet outlet = new Outlet(containerName);
        outlet.setOverwrite(true);
        output.addOutlet(outlet);
    
        // create execution context
        Map globalVarsMap = new HashMap();
        XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(output, null, globalVarsMap, null, null);
        EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() {
            @Override
            protected EPackage[] allPackages() {
                return new EPackage[] { BuildspecificationPackage.eINSTANCE, EcorePackage.eINSTANCE };
            }
        };
        execCtx.registerMetaModel(metamodel);
    
        // generate
        XpandFacade facade = XpandFacade.create(execCtx);
        String templatePath = "template::BuildTemplate::main";
        facade.evaluate(templatePath, buildSpec);
    
        // refresh the project to get external updates:
        resource.refreshLocal(IResource.DEPTH_INFINITE, monitor);
    }

Это оно!

Принимая это за спин

  1. Запустите рабочую среду времени выполнения, выбрав de.peterfriese.antwizard / META-INF / MANIFEST.MF и вызвав Run As -> Eclipse Application.
  2. Создайте новый проект Java в рабочей области времени выполнения.
  3. Вызовите ваш мастер, выбрав Файл -> Создать -> Другие … -> Ant -> Файл сборки Ant из существующего проекта.
  4. Введите необходимую информацию (название проекта, исходная папка, папка binariy)
  5. После нажатия на финиш , вы должны получить новый Ant-файл для вашего проекта:

     

    Ant файл

  6. Наслаждайтесь!

Вы можете скачать проект здесь . Отзывы и комментарии приветствуются!

 

С http://www.peterfriese.de