<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml"> | |
<head> | |
<!-- -*- xhtml -*- --> | |
<title>Учебный курс по интеграции генератора кода для платформы NetBeans 6.0, 6.1, 6.5</title> | |
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
<meta name="AUDIENCE" content="NBUSER"> | |
<meta name="TYPE" content="ARTICLE"> | |
<meta name="EXPIRES" content="N"> | |
<meta name="developer" content="gwielenga@netbeans.org"> | |
<meta name="indexed" content="y"> | |
<meta name="description" | |
content="A short guide to using the Nodes API."> | |
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. --> | |
<!-- Use is subject to license terms.--> | |
</head> | |
<body> | |
<h1>Учебный курс по интеграции генератора кода</h1> | |
<p>В этом руководстве показан способ написания модуля, интегрирующего новые элементы в функцию генерации кода NetBeans, которая вызывается сочетанием клавиш Alt+Insert в редакторе. | |
<p><b>Содержание</b></p> | |
<img src="../images/articles/68/netbeans-stamp-65-67-68.gif" class="stamp" width="114" height="114" alt="Содержимое на этой странице относится к среде IDE NetBeans 6.5, 6.7, 6.8" title="Содержимое на этой странице относится к среде IDE NetBeans 6.5, 6.7, 6.8"> </p> | |
<ul class="toc"> | |
<li><a href="#intro">Введение в интеграцию генератора кода</a></li> | |
<li><a href="#creating">Создание проекта модуля</a></li> | |
<li><a href="#use">Использование диалогового окна "Поставщик генератора кода"</a></li> | |
<li><a href="#code">Написание кода интеграции генератора кода</a></li> | |
<li><a href="#install">Установка и ознакомление с функциональными возможностями</a></li> | |
<li><a href="#share">Создание совместно используемого исполняемого файла</a></li> | |
</ul> | |
<p><b>Для работы с этим руководством требуется программное обеспечение и ресурсы, перечисленные в следующей таблице.</b></p> | |
<table> | |
<tbody> | |
<tr> | |
<th class="tblheader" scope="col">Программное обеспечение или ресурс</th> | |
<th class="tblheader" scope="col">Требуемая версия</th> | |
</tr> | |
<tr> | |
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">Среда IDE NetBeans</a></td> | |
<td class="tbltd1">версия 6.5 или выше </td> | |
</tr> | |
<tr> | |
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Комплект для разработчика на языке Java (JDK)</a></td> | |
<td class="tbltd1">версия 6 или<br/>версия 5</td> | |
</tr> | |
</tbody> | |
</table> | |
<p class="tips">Дополнительно, в целях поиска и устранения ошибок, можно <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=11179">загрузить готовый пример</a> и изучить исходный код. | |
<h2 class="tutorial"><a name="intro"></a>Введение в интеграцию генератора кода</h2> | |
<p>Функция "генератор кода", которая впервые появилась в среде IDE NetBeans 6.5, состоит из списка позиций, выводимых при нажатии Alt+Insert. Каждая позиция вызывает генерацию кода в редакторе. | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-5.png" alt="Развернутый результат"> | |
<!-- ===================================================================================== --> | |
<h2 class="tutorial"><a name="creating"></a>Создание проекта модуля</h2> | |
<p>В этом разделе используется мастер для создания структуры исходного кода, требуемого любым модулем NetBeans. Эта структура исходного кода состоит из ряда папок в особых местах и набора файлов, которые требуются в любом случае. Например, для каждого модуля NetBeans требуется папка <tt>nbproject</tt>, в которой хранятся метаданные проекта, а также файл <tt>layer.xml</tt>, в котором объявляется регистрация таких элементов как кнопки панелей управления и окна. | |
<ol> | |
<li>Выберите "File" > "New Project" (Ctrl+Shift+N). В разделе "Категории" выберите параметр "Модули NetBeans". В области "Проекты" выберите "Модуль" и нажмите кнопку "Далее".</li> | |
<li>На панели "Имя и расположение" в поле "Имя проекта" введите <tt>DemoCodeGenerator</tt>. В поле "Расположение проекта" укажите любой каталог на компьютере, например <tt>c:\mymodules</tt>. Оставьте переключатель "Отдельный модуль" выбранным. Панель должна выглядеть следующим образом: | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-1.png" alt="Действие 1 мастера создания проекта"> | |
<p>Нажмите кнопку "Далее". | |
<li>На панели "Основные настройки модуля" введите <tt>org.netbeans.modules.demo</tt> в поле "Основа кодового имени". Установите флажок "Создать слой XML" и оставьте местоположение локализуемого файла ресурсов и слоя XML по умолчанию; при этом они будут храниться в пакете с именем <tt>org/netbeans/modules/demo</tt>. Панель должна выглядеть следующим образом: | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-2.png" alt="Действие 2 мастера создания проекта"> | |
<li>Нажмите кнопку "Готово". </ol> | |
<p> В среде IDE создается проект <tt>DemoCodeGenerator</tt>. Проект содержит все исходные файлы и метаданные проекта, например, сценарий сборки проекта Ant. Проект откроется в среде IDE. Логическую структуру проекта можно просмотреть в окне "Проекты" (Ctrl+1), а структуру его файлов – в окне "Файлы" (Ctrl+2). | |
<br /> | |
<!-- ===================================================================================== --> | |
<h2><a name="use"></a>Использование диалогового окна "Поставщик генератора кода"</h2> | |
<p>В этом разделе с помощью мастера будет создан класс заглушки и сущности слоя, необходимые для начала интеграции с функцией генератора кода. | |
<ol> | |
<li>Щелкните узел проекта правой кнопкой мыши и выберите команду "Создать > Прочее". В диалоговом окне "Новый файл" выберите "Разработка модулей > Генератор кода", как показано ниже: | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-3.png" alt="Мастер генератора кода."> | |
</li> | |
<li>Установите следующие значения на панети "Новый генератор кода": | |
<p><ul> | |
<li><b>Имя класса.</b> Имя класса для заглушки, генерируемой мастером. Введите в это поле значение "DemoCodeGenerator". | |
<li><b>Пакет.</b> Пакет, в котором будет создан класс заглушки. Выберите в раскрывающемся списке пункт "org.netbeans.modules.demo". | |
<li><b>Тип MIME.</b> Тип MIME, к которому применяется интеграция генератора кода. Введите в это поле значение "x-java". | |
<li><b>Создать CodeGeneratorContextProvider.</b> Добавление дополнительных объектов к поиску генератора кода. Не устанавливайте этот флажок. | |
</ul> | |
<p>На экране должны быть представлены следующие параметры: | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-4.png" alt="Шаблон быстрого поиска"> | |
<li>Нажмите кнопку "Готово". | |
<p><p>Окно "Проекты" должно выглядеть следующим образом: | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-6.png" alt="Итоговое окно "Проекты". "></ol> | |
<p>В файле <tt>layer.xml</tt> должен содержаться следующий текст: | |
<pre><filesystem> | |
<folder name="Editors"> | |
<folder name="text"> | |
<folder name="x-java"> | |
<folder name="CodeGenerators"> | |
<file name="org-netbeans-modules-demo-DemoCodeGenerator$Factory.instance"/> | |
</folder> | |
</folder> | |
</folder> | |
</folder> | |
</filesystem></pre> | |
<p>Сгенерированный класс должен выглядеть следующим образом: | |
<pre>public class DemoCodeGenerator implements CodeGenerator { | |
JTextComponent textComp; | |
/** | |
* | |
* @param context containing JTextComponent and possibly other items | |
* registered by {@link CodeGeneratorContextProvider} | |
*/ | |
private DemoCodeGenerator(Lookup context) { | |
// Не рекомендуется сохранять Lookup снаружи ctor | |
textComp = context.lookup(JTextComponent.class); | |
} | |
public static class Factory implements CodeGenerator.Factory { | |
public List<? extends CodeGenerator> create(Lookup context) { | |
return Collections.singletonList(new DemoCodeGenerator(context)); | |
} | |
} | |
/** | |
* Имя, вставляемое в диалоговое окно "Вставить код" | |
*/ | |
public String getDisplayName() { | |
return "Sample Generator"; | |
} | |
/** | |
* Эта функция вызывается при выборе этого генератора в диалоговом окне "Вставить код" | |
*/ | |
public void invoke() { | |
} | |
}</pre> | |
<br /> | |
<!-- ======================================================================================= --> | |
<h2><a name="code"></a>Написание кода интеграции генератора кода</h2> | |
<p>Далее необходимо реализовать интерфейс API. Используются следующие классы интерфейса API:</p> | |
<table> | |
<tbody> | |
<tr> | |
<th class="tblheader" scope="col">Класс</th> | |
<th class="tblheader" scope="col">Описание</th> | |
</tr> | |
<tr> | |
<td class="tbltd1">JavaSource</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">CancellableTask</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">WorkingCopy</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">CompilationUnitTree</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">TreeMaker</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">ClassTree</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">ModifiersTree</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">VariableTree</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">TypeElement</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">ExpressionTree</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">MethodTree</td> | |
<td class="tbltd1">Определяется позднее</td> | |
</tr> | |
</tbody> | |
</table> | |
<p><p>Ниже указываются зависимости требуемых модулей, которые затем реализуются в собственном модуле. | |
<div class="indent"> | |
<ol> | |
<li>Щелкните правой кнопкой мыши проект, выберите "Свойства", а затем укажите следующие 4 зависимости на панели "Библиотеки": | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-7.png" alt="Установка зависимостей." /> | |
<p><b>Примечание.</b> Обратите внимание, что "Библиотека редактора 2" and "API утилит" уже установлены автоматически мастером генерации кода. Оставшиеся две зависимости – "Javac API Wrapper" and "Исходные файлы Java" – потребуются для генерации новых фрагментов кода Java с помощью созданной интеграции генератора кода. | |
<li>Откройте созданный класс. | |
<li>Измените метод <tt>invoke()</tt> следующим образом: | |
<pre>public void invoke() { | |
try { | |
Document doc = textComp.getDocument(); | |
JavaSource javaSource = JavaSource.forDocument(doc); | |
CancellableTask task = new CancellableTask<WorkingCopy>() { | |
public void run(WorkingCopy workingCopy) throws IOException { | |
workingCopy.toPhase(Phase.RESOLVED); | |
CompilationUnitTree cut = workingCopy.getCompilationUnit(); | |
TreeMaker make = workingCopy.getTreeMaker(); | |
for (Tree typeDecl : cut.getTypeDecls()) { | |
if (Tree.Kind.CLASS == typeDecl.getKind()) { | |
ClassTree clazz = (ClassTree) typeDecl; | |
ModifiersTree methodModifiers = | |
make.Modifiers(Collections.<Modifier>singleton(Modifier.PUBLIC), | |
Collections.<AnnotationTree>emptyList()); | |
VariableTree parameter = | |
make.Variable(make.Modifiers(Collections.<Modifier>singleton(Modifier.FINAL), | |
Collections.<AnnotationTree>emptyList()), | |
"arg0", | |
make.Identifier("Object"), | |
null); | |
TypeElement element = workingCopy.getElements().getTypeElement("java.io.IOException"); | |
ExpressionTree throwsClause = make.QualIdent(element); | |
MethodTree newMethod = | |
make.Method(methodModifiers, | |
"writeExternal", | |
make.PrimitiveType(TypeKind.VOID), | |
Collections.<TypeParameterTree>emptyList(), | |
Collections.singletonList(parameter), | |
Collections.<ExpressionTree>singletonList(throwsClause), | |
"{ throw new UnsupportedOperationException(\"Не поддерживается.\") }", | |
null); | |
ClassTree modifiedClazz = make.addClassMember(clazz, newMethod); | |
workingCopy.rewrite(clazz, modifiedClazz); | |
} | |
} | |
} | |
public void cancel() { | |
} | |
}; | |
ModificationResult result = javaSource.runModificationTask(task); | |
result.commit(); | |
} catch (Exception ex) { | |
Exceptions.printStackTrace(ex); | |
} | |
}</pre> | |
<li>Убедитесь в том, что определены следующие выражения импорта: | |
<pre>import com.sun.source.tree.AnnotationTree; | |
import com.sun.source.tree.ClassTree; | |
import com.sun.source.tree.CompilationUnitTree; | |
import com.sun.source.tree.ExpressionTree; | |
import com.sun.source.tree.MethodTree; | |
import com.sun.source.tree.ModifiersTree; | |
import com.sun.source.tree.Tree; | |
import com.sun.source.tree.TypeParameterTree; | |
import com.sun.source.tree.VariableTree; | |
import java.io.IOException; | |
import java.util.Collections; | |
import java.util.List; | |
import javax.lang.model.element.Modifier; | |
import javax.lang.model.element.TypeElement; | |
import javax.lang.model.type.TypeKind; | |
import javax.swing.text.Document; | |
import javax.swing.text.JTextComponent; | |
import org.netbeans.api.java.source.CancellableTask; | |
import org.netbeans.api.java.source.JavaSource; | |
import org.netbeans.api.java.source.JavaSource.Phase; | |
import org.netbeans.api.java.source.ModificationResult; | |
import org.netbeans.api.java.source.TreeMaker; | |
import org.netbeans.api.java.source.WorkingCopy; | |
import org.netbeans.spi.editor.codegen.CodeGenerator; | |
import org.netbeans.spi.editor.codegen.CodeGeneratorContextProvider; | |
import org.openide.util.Exceptions; | |
import org.openide.util.Lookup;</pre> | |
</ol> | |
</div> | |
<!-- ======================================================================================= --> | |
<h2><a name="install"></a>Установка и ознакомление с функциональными возможностями</h2> | |
<p>Теперь установим модуль и воспользуемся функцией интеграции генератора кода. Для построения и установки модуля в среде IDE используется сценарий построения Ant. При создании проекта автоматически создается сценарий построения.</p> | |
<div class="indent"> | |
<ol> | |
<li>В окне "Проекты" щелкните проект правой кнопкой мыши и выберите "Выполнить". | |
<p><p>Запускается новый экземпляр среды IDE, и выполняется установка модуля интеграции генератора кода. | |
<li>Нажмите Alt+Insert; в списке появится новый элемент: | |
<p><p align="left"><img border="1" src="../images/tutorials/code-generator/code-generator-5.png" alt="Развернутый результат"> | |
<li>Щелкните этот элемент, и будет выполнена вставка кода. | |
</ol> | |
</div> | |
<br /> | |
<!-- ======================================================================================= --> | |
<h2><a name="share"></a>Создание совместно используемого исполняемого файла модуля</h2> | |
<p>Готовый модуль можно предоставить для использования другими разработчиками. Для этого необходимо создать и распространить двоичный файл "NBM" (модуль NetBeans). | |
<div class="indent"> | |
<ol> | |
<li>В окне "Проекты" щелкните проект правой кнопкой мыши и выберите "Создать NBM". | |
<p><p>Создается файл NBM, который можно просмотреть в окне "Файлы" (Ctrl+2). | |
<li>Чтобы предоставить этот файл для использования другим разработчикам, можно, например, воспользоваться <a href="http://plugins.netbeans.org/PluginPortal/">порталом подключаемых модулкй NetBeans</a>. Для установки модуля получатель должен воспользоваться диспетчером подключаемых модулей ("Сервис > Подключаемые модули"). | |
</ol> | |
</div> | |
<!-- ======================================================================================== --> | |
<br> | |
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&subject=Feedback:%20Quick%20Search%20Integration%20Tutorial">Мы ждем ваших отзывов</a></div> | |
<br style="clear:both;" /> | |
<!-- ======================================================================================== --> | |
<h2><a name="nextsteps"></a>Что дальше?</h2> | |
<p>Дополнительные сведения о создании и разработке модулей NetBeans приведены в следующих ресурсах: | |
<ul> | |
<li><a href="https://platform.netbeans.org/index.html">Домашнаяя страница платформы NetBeans</a></li> | |
<li><a href="https://netbeans.org/download/dev/javadoc/">Список интерфейсов API среды NetBeans (текущая версия разработки)</a></li> | |
<li><a href="https://netbeans.org/kb/trails/platform_ru.html">Другие связанные руководства</a></li></ul> | |
</p> | |
<hr><p><p> | |
<!-- ======================================================================================== --> | |
<!-- | |
<h2><a name="version"></a>Versioning </h2> | |
<p> | |
<table width="76%" border="1"> | |
<tbody> | |
<tr> | |
<td> | |
<div align="left"><b>Version</b></div> | |
</td> | |
<td> | |
<div align="left"><b>Date</b></div> | |
</td> | |
<td> | |
<div align="left"><b>Changes</b></div> | |
</td> | |
</tr> | |
<tr> | |
<td> | |
1 | |
</td> | |
<td> | |
19 July 2008 | |
</td> | |
<td> | |
Initial version. | |
</td> | |
</tr> | |
</tbody> | |
</table> | |
--> | |
</body> | |
</html> |