<!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>Tutorial de integração do gerador de códigos para a plataforma NetBeans 6.0, 6.1, 6.5</title> | |
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/> | |
<meta name="AUDIENCE" content="NBUSER"/> | |
<meta name="TYPE" content="ARTICLE"/> | |
<meta name="EXPIRES" content="N"/> | |
<meta name="developer" content="gwielenga@netbeans.org"/> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
<meta name="indexed" content="y"/> | |
<meta name="description" | |
content="A short guide to using the Code Generator API."/> | |
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. --> | |
<!-- Use is subject to license terms.--> | |
</head> | |
<body> | |
<h1>Tutorial de integração de geração de código</h1> | |
<p>Este tutorial mostra como escrever um módulo que integre novos itens no recurso de geração de código do NetBeans, que é exibido quando você clica em Alt-Insert em um editor.</p> | |
<p><b>Conteúdo</b></p> | |
<p><img src="../images/articles/69/netbeans-stamp7-8-9.png" class="stamp" width="114" height="114" alt="O conteúdo desta página se aplica ao NetBeans IDE 6.5, 6.7, 6.8" title="O conteúdo desta página se aplica ao NetBeans IDE 6.5, 6.7, 6.8" /></p> | |
<ul class="toc"> | |
<li><a href="#intro">Introdução à integração do gerador de código</a></li> | |
<li><a href="#creating">Criando o projeto do módulo </a></li> | |
<li><a href="#use">utilizando o assistente do Provedor de gerador de código</a></li> | |
<li><a href="#code">Codificando a integração do gerador de código</a></li> | |
<li><a href="#install">Instalando e testando a funcionalidade</a></li> | |
<li><a href="#share">Criando um binário compartilhável</a></li> | |
</ul> | |
<p><b>Para seguir este tutorial, os softwares e recursos listados na tabela seguinte são necessários.</b></p> | |
<table> | |
<tbody> | |
<tr> | |
<th class="tblheader" scope="col">Software ou recurso</th> | |
<th class="tblheader" scope="col">Versão necessária</th> | |
</tr> | |
<tr> | |
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td> | |
<td class="tbltd1">versão 6.7 ou superior</td> | |
</tr> | |
<tr> | |
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td> | |
<td class="tbltd1">Versão 6 ou<br/>versão 5</td> | |
</tr> | |
</tbody> | |
</table> | |
<p class="tips">Opcionalmente, para fins de solução de problemas, você pode <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=11179">baixar a amostra completa</a> e inspecionar os códigos-fonte.</p> | |
<h2 class="tutorial"><a name="intro"></a>Introdução à integração do gerador de código</h2> | |
<p>O recurso Gerador de código, introduzido no NetBeans IDE 6.5, consiste em uma lista de itens que aparece quando você pressiona Alt-Insert. Cada item gera um código no editor.</p> | |
<p><img src="../images/tutorials/code-generator/code-generator-5.png" alt="Resultado implantado" /></p> | |
<!-- ===================================================================================== --> | |
<h2 class="tutorial"><a name="creating"></a>Criando o projeto do módulo</h2> | |
<p>Nesta seção, usaremos um assistente para criar a estrutura de código-fonte que todo módulo NetBeans precisa. A estrutura do código-fonte consiste em determinadas pastas em locais específicos e em um conjunto de arquivos que sempre são necessários. Por exemplo, cada módulo NetBeans requer uma pasta <tt>nbproject</tt>, que contém os metadados do projeto, e um arquivo <tt>layer.xml</tt>, para registro de declaração de itens como janelas e botões da barra de ferramentas.</p> | |
<ol> | |
<li>Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Em Categorias, selecione Módulos do NetBeans. Em Projetos, selecione Módulo e clique em Próximo.</li> | |
<li>No painel Nome e localização, digite <tt>DemoCodeGenerator</tt> em Nome do projeto. Altere a Localização do projeto para qualquer diretório no computador, como <tt>c:\meusmodulos</tt>. Deixe o botão de opção Módulo independente selecionado. O painel agora deve ter esta aparência: | |
<p><img src="../images/tutorials/code-generator/code-generator-1.png" alt="Etapa 1 do assistente para Nova Projeto." /></p> | |
<p>Clique em Próximo.</p></li> | |
<li>No painel Configuração básica de módulos, digite <tt>org.netbeans.modules.demo</tt> como o Nome de base de código. Marque a caixa de verificação "Gerar camada XML" e deixe o pacote de localização e a camada XML onde estão, para que eles sejam armazenados em um pacote com o nome <tt>org/netbeans/modules/demo</tt>. O painel agora deve ter esta aparência: | |
<p><img src="../images/tutorials/code-generator/code-generator-2.png" alt="Etapa 2 do assistente para Novo projeto" /></p></li> | |
<li>Clique em Terminar.</li></ol> | |
<p> O IDE cria o projeto <tt>DemoCodeGenerator</tt>. O projeto contém todos os metadados de projeto e códigos-fonte, como o script de construção Ant do projeto. O projeto se abre no IDE. É possível ver a estrutura lógica na janela Projetos (Ctrl-1) e a estrutura de arquivos na janela Arquivos (Ctrl+2). </p> | |
<!-- ===================================================================================== --> | |
<h2><a name="use"></a>Utilizando o assistente do Provedor de gerador de código</h2> | |
<p>Nesta seção, utilizaremos um assistente para criar a classe stub e entradas de camada necessárias para começar a integração com o recurso Gerador de código.</p> | |
<ol> | |
<li>Clique com o botão direito do mouse no nó do projeto e escolha Novo > Outro. Na caixa de diálogo Novo arquivo, escolha Desenvolvimento de módulo > Gerador de código, como mostrado abaixo: | |
<p><img src="../images/tutorials/code-generator/code-generator-3.png" alt="Assistente do gerador de código." /></p> | |
</li> | |
<li>No painel Gerador de novo código, defina o seguinte: | |
<ul> | |
<li><b>Nome da classe.</b> Especifica o nome da classe do stub que o assistente gerará gerar. Digite "DemoCodeGenerator" neste campo.</li> | |
<li><b>Pacote.</b> Especifica o pacote em que a classe do stub será gerada. Selecione "org.netbeans.modules.demo" na lista suspensa.</li> | |
<li><b>Tipo MIME.</b> Especifica o tipo MIME ao qual a integração do gerador de código será aplicada. Digite "x-java" neste campo.</li> | |
<li><b>Gerar CodeGeneratorContextProvider.</b> Adiciona outros objetos à pesquisa do gerador de código. Deixe esta caixa de verificação desmarcada.</li> | |
</ul> | |
<p>Agora você deve ver o seguinte:</p> | |
<p><img src="../images/tutorials/code-generator/code-generator-4.png" alt="Modelo de pesquisa rápida" /></p> | |
</li> | |
<li>Clique em Terminar. | |
<p>A janela Projetos agora deve ter esta aparência:</p> | |
<p><img src="../images/tutorials/code-generator/code-generator-6.png" alt="Janela Projetos finais." /></p></li></ol> | |
<p>No arquivo <tt>layer.xml</tt>, você deve ver o seguinte:</p> | |
<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>A classe gerada deve ter a seguinte aparência:</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) { | |
// Good practice is not to save Lookup outside 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)); | |
} | |
} | |
/** | |
* The name which will be inserted inside Insert Code dialog | |
*/ | |
public String getDisplayName() { | |
return "Sample Generator"; | |
} | |
/** | |
* This will be invoked when user chooses this Generator from Insert Code | |
* dialog | |
*/ | |
public void invoke() { | |
} | |
}</pre> | |
<!-- ======================================================================================= --> | |
<h2><a name="code"></a>Codificando a integração do gerador de código</h2> | |
<p>Em seguida, implementaremos a API. As classes de API são as seguintes:</p> | |
<table> | |
<tbody> | |
<tr> | |
<th class="tblheader" scope="col">classe</th> | |
<th class="tblheader" scope="col">descrição</th> | |
</tr> | |
<tr> | |
<td class="tbltd1">JavaSource</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">CancellableTask</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">WorkingCopy</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">CompilationUnitTree</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">TreeMaker</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">ClassTree</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">ModifiersTree</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">VariableTree</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">TypeElement</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">ExpressionTree</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
<tr> | |
<td class="tbltd1">MethodTree</td> | |
<td class="tbltd1">Para ser feita...</td> | |
</tr> | |
</tbody> | |
</table> | |
<p>Abaixo, definiremos dependências nos módulos necessários e, em seguida, as implementaremos no seu próprio módulo.</p> | |
<div class="indent"> | |
<ol> | |
<li>Clique com o botão direito do mouse no projeto, escolha Propriedades e defina as 4 dependências a seguir no painel Bibliotecas: | |
<p><img src="../images/tutorials/code-generator/code-generator-7.png" alt="Defina dependências." /></p> | |
<p><b>Nota:</b> você gerará notar que "Biblioteca do editor 2" e "API de utilitários" foram definidas automaticamente pelo Assistente do gerador de código. Nas outras duas dependências, "Wrapper da API Javac" e "Código-fonte Java", você precisará ser capaz de gerar novos trechos de código Java através da nova integração do Gerador de código.</p></li> | |
<li>Abra a classe gerada e modifique o método <tt>invoke()</tt> como segue: | |
<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(\"Not supported yet.\") }", | |
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> | |
<li>Certifique-se de que as seguintes sentenças import sejam declaradas: | |
<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> </li> | |
</ol> | |
</div> | |
<!-- ======================================================================================= --> | |
<h2><a name="install"></a>Instalando e testando a funcionalidade</h2> | |
<p>Agora vamos instalar o módulo e usar a integração do recurso gerador de código. O IDE utiliza um script de construção Ant para construir e instalar seu módulo. O script de construção é criado quando o projeto é criado.</p> | |
<div class="indent"> | |
<ol> | |
<li>Na janela Projetos, clique com o botão direito do mouse no projeto e escolha Executar. | |
<p>Uma nova instância do IDE é iniciada e instala o módulo de integração do gerador de código. </p></li> | |
<li>Pressione Alt-Insert e você verá o novo item incluído: | |
<p><img src="../images/tutorials/code-generator/code-generator-5.png" alt="Resultado implantado" /></p></li> | |
<li>Clique em um item e o código será inserido.</li> | |
</ol> | |
</div> | |
<!-- ======================================================================================= --> | |
<h2><a name="share"></a>Criando um binário de módulo compartilhável</h2> | |
<p>Agora que o módulo está concluído, é possível permitir que ele seja utilizado por outras pessoas. Para isso, você precisa criar um arquivo "NBM" (módulo NetBeans) binário e distribuí-lo. </p> | |
<div class="indent"> | |
<ol> | |
<li>Na janela Projetos, clique com o botão direito do mouse no projeto e escolha Criar NBM. | |
<p>O arquivo NBM é criado e você pode visualizá-lo na janela Arquivos (Ctrl+-2).</p></li> | |
<li>Disponibilize-o para outras pessoas, por exemplo, através do <a href="http://plugins.netbeans.org/PluginPortal/">Portal plug-in do NetBeans</a>. O destinatário deve usar o Gerenciador de plug-ins (Ferramentas > Plug-ins) para instalá-lo.</li> | |
</ol> | |
</div> | |
<!-- ======================================================================================== --> | |
<p><br/></p> | |
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&subject=Feedback:%20Quick%20Search%20Integration%20Tutorial">Envie-nos seus comentários</a></div> | |
<p><br style="clear:both;" /></p> | |
<!-- ======================================================================================== --> | |
<h2><a name="nextsteps"></a>Próximas etapas</h2> | |
<p>Para obter mais informações sobre a criação e o desenvolvimento de módulos do NetBeans, consulte os seguintes recursos: </p> | |
<ul> | |
<li><a href="https://platform.netbeans.org/index.html">Página inicial da Plataforma NetBeans</a></li> | |
<li><a href="https://netbeans.org/download/dev/javadoc/">Lista de APIs do NetBeans (Versão de desenvolvimento atual)</a></li> | |
<li><a href="https://netbeans.org/kb/trails/platform_pt_BR.html">Outros tutoriais relacionados</a></li></ul> | |
<!-- ======================================================================================== --> | |
<!-- | |
<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> |