{"id":32,"date":"2010-04-14T18:59:16","date_gmt":"2010-04-14T21:59:16","guid":{"rendered":"http:\/\/www.javaframework.org\/portal\/2010\/04\/14\/o-que-programao-orientada-a-aspectos\/"},"modified":"2010-04-14T19:07:45","modified_gmt":"2010-04-14T22:07:45","slug":"o-que-programao-orientada-a-aspectos","status":"publish","type":"post","link":"https:\/\/www.javaframework.org\/portal\/2010\/04\/14\/o-que-programao-orientada-a-aspectos\/","title":{"rendered":"O que &eacute; Programa&ccedil;&atilde;o Orientada a Aspectos?"},"content":{"rendered":"<p>Esse foi um trabalho apresendado por R\u00f3gel Garcia a disciplina de Desenvolvimento de Sistemas Distribu\u00eddos 2, do Curso de Ci\u00eancia da Computa\u00e7\u00e3o \u2013 8o. per\u00edodo, da Universidade FUMEC \u2013 FACE, sob orienta\u00e7\u00e3o do professor Fl\u00e1vio Lapper no ano de 2005. O intuito do trabalho \u00e9 conhe\u00e7er o paradgma de programa\u00e7\u00e3o orientado a aspectos ou AOP.<\/p>\n<p> <!--more-->  <\/p>\n<h3><font size=\"5\">1 Orienta\u00e7\u00e3o a Aspectos<\/font><\/h3>\n<p>&#160;<\/p>\n<p>Todas as aplica\u00e7\u00f5es possuem diversas funcionalidades, algumas fazem parte do n\u00facleo (prim\u00e1rias) e outras d\u00e3o suporte as funcionalidades presentes no n\u00facleo e geralmente se repetem em diversos m\u00f3dulos (secund\u00e1rias). Em uma aplica\u00e7\u00e3o comercial as funcionalidades do n\u00facleo s\u00e3o as regras de neg\u00f3cios e as secund\u00e1rias s\u00e3o, por exemplo, logging e autoriza\u00e7\u00e3o. A programa\u00e7\u00e3o orientada a objetos \u00e9 a metodologia de programa\u00e7\u00e3o mais utilizado para implementar funcionalidades prim\u00e1rias, mas ela n\u00e3o \u00e9 suficiente para cobrir<i> <\/i>as funcionalidades secund\u00e1rias, especialmente em aplica\u00e7\u00f5es complexas. Essas funcionalidades secund\u00e1rias s\u00e3o definidas pelo termo <i>crosscuting concerns<\/i>. A orienta\u00e7\u00e3o a objetos cria um acoplamento entre funcionalidades principais e os <i>crosscuting concerns<\/i> que n\u00e3o \u00e9 desejado, uma vez que a adi\u00e7\u00e3o ou modifica\u00e7\u00e3o dessas funcionalidades secund\u00e1rias implicam em mudan\u00e7as no n\u00facleo da aplica\u00e7\u00e3o. <\/p>\n<p><a href=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image_thumb.png\" width=\"520\" height=\"217\" \/><\/a> <\/p>\n<p>O acoplamento da regra de neg\u00f3cios com as funcionalidades secund\u00e1rias, implica em mudan\u00e7as no n\u00facleo caso ocorra alguma altera\u00e7\u00e3o nas funcionalidades secund\u00e1rias<\/p>\n<p>AOP \u00e9 uma nova metodologia que prov\u00ea a separa\u00e7\u00e3o dos <i>crosscuting concerns <\/i>introduzindo uma nova unidade de modulariza\u00e7\u00e3o, o aspecto. Com AOP voc\u00ea implementa os <i>crosscuting concerns <\/i>em aspectos ao inv\u00e9s de mescl\u00e1-los nos m\u00f3dulos principais. Os m\u00f3dulos principais e os secund\u00e1rios s\u00e3o implementados separadamente. Um compilador especial monta o sistema final combinando os m\u00f3dulos principais e os secund\u00e1rios<i> <\/i>num processo chamado <i>weaving<\/i> (tecelagem), da\u00ed d\u00e1-se o nome de <i>weaver<\/i> (tecel\u00e3o) ao compilador. O resultado \u00e9 que a AOP modulariza as funcionalidades secund\u00e1rias, possibilitando a cria\u00e7\u00e3o de um sistema que \u00e9 mais f\u00e1cil de implementar e manter.     <\/p>\n<table cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"37\"><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><a href=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image1.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image_thumb1.png\" width=\"584\" height=\"200\" \/><\/a> <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"11\"><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><a href=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image2.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image_thumb2.png\" width=\"657\" height=\"515\" \/><\/a> <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"center\"><font size=\"1\">Diferen\u00e7a na constru\u00e7\u00e3o dos m\u00f3dulos entre <em>Orienta\u00e7\u00e3o a Objetos<\/em> e <em>Orienta\u00e7\u00e3o a Aspectos<\/em><\/font><\/p>\n<p>A separa\u00e7\u00e3o dos m\u00f3dulos ainda possibilita a reutiliza\u00e7\u00e3o dos m\u00f3dulos secund\u00e1rios em v\u00e1rios m\u00f3dulos principais. Os m\u00f3dulos secund\u00e1rios s\u00e3o escritos apenas uma vez, e mesclado quantas vezes for necess\u00e1rio nos m\u00f3dulos principais. Isso sem nenhuma altera\u00e7\u00e3o no n\u00facleo da aplica\u00e7\u00e3o.<\/p>\n<p>Existem v\u00e1rias implementa\u00e7\u00f5es de AOP para v\u00e1rias linguagens de programa\u00e7\u00e3o, inclusive em Java. AspectJ \u00e9 a implementa\u00e7\u00e3o AOP para Java mais utilizada e que tem mais suporte, por isso utilizaremos ela nesse trabalho, al\u00e9m disso a sintaxe estendida do AspectJ o torna uma das implementa\u00e7\u00f5es AOP mais poderosas que existe.<\/p>\n<p><b>     <br \/><\/b><\/p>\n<h3><font size=\"5\">2 Elementos da Orienta\u00e7\u00e3o a Aspectos<\/font><\/h3>\n<p>&#160;<\/p>\n<p>Assim como na Orienta\u00e7\u00e3o a objetos, a Orienta\u00e7\u00e3o a Aspectos possui os seus pr\u00f3prios conceitos. <\/p>\n<h4><a name=\"_Toc122083519\">Crosscuting concern<\/a><\/h4>\n<p>Crosscuting concern \u00e9 o termo que define partes do sistema que s\u00e3o aplicaveis em v\u00e1rios locais. Autentica\u00e7\u00e3o \u00e9 uma funcionalidade que aperece em v\u00e1rios m\u00f3dulos do sistema, logo, autentica\u00e7\u00e3o \u00e9 um crosscuting concern. Crosscuting tamb\u00e9m \u00e9 o termo dado ao processo de adicionar c\u00f3digo extra a um determinado m\u00f3dulo.<\/p>\n<h4><a name=\"_Toc122083520\">Weaving<\/a><\/h4>\n<p>Processo onde \u00e9 feita a mesclagem dos m\u00f3dulos do sistema de acordo com os aspectos encontrados. O weaving \u00e9 como uma outra etapa da compila\u00e7\u00e3o. Weaving rules s\u00e3o as regras que devem ser aplicadas durante essa fase da compila\u00e7\u00e3o.<\/p>\n<h4><a name=\"_Toc122083521\">Join point<\/a><\/h4>\n<p>Um join point (ponto de mesclagem) \u00e9 um ponto identific\u00e1vel do fluxo de um programa. Pode ser uma chamada de m\u00e9todo ou a configura\u00e7\u00e3o do valor de uma vari\u00e1vel. Variadas implementa\u00e7\u00f5es da orienta\u00e7\u00e3o a aspectos suportam variados tipos de join point. <\/p>\n<h4><a name=\"_Toc122083522\">Pointcut<\/a><\/h4>\n<p>Um pointcut \u00e9 uma constru\u00e7\u00e3o que seleciona join points. Depois de capturar um join point \u00e9 poss\u00edvel especificar as regras de <i>weaving<\/i> nesses join points, como executar determinada a\u00e7\u00e3o antes ou depois da execu\u00e7\u00e3o desse join point. Um pointcut pode selecionar um join point que \u00e9 uma chamada para um m\u00e9todo por exemplo. Pointcuts especificam as regras de mesclagem (onde devem ser feitas as mesclagens), e join points s\u00e3o as situa\u00e7\u00f5es que satisfazem essas regras. Podemos criar um pointcut para todos os m\u00e9todos chamados checar, o pointcut definiu a regra: m\u00e9todos chamados checar. Cada m\u00e9todo chamado checar ser\u00e1 um join point desse pointcut. <\/p>\n<p><font size=\"3\"><font face=\"Courier New\"><strong><font color=\"#800080\">pointcut<\/font><\/strong> hello() : <strong><font color=\"#800080\">execution<\/font><\/strong> (* Hello.*(..));<\/font><\/font><\/p>\n<h4><a name=\"_Toc122083523\">Advice<\/a><\/h4>\n<p>Um advice \u00e9 o c\u00f3digo a ser executado em um join point que foi selecionado por um pointcut. Um advice pode ser executado antes, depois ou em volta de um join point. Um pointcut selecionar\u00e1 os join points e o advice cont\u00e9m o c\u00f3digo que ser\u00e1 executado em cada join point.<\/p>\n<p><font size=\"3\"><font face=\"Courier New\"><strong><font color=\"#800080\">after<\/font><\/strong>() : hello() {<\/font><\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(<font color=\"#000080\">&quot;Hello Aspect&quot;<\/font>);<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">}<\/font><\/p>\n<h4><a name=\"_Toc122083524\">Introduction<\/a><\/h4>\n<p>Introductions s\u00e3o instru\u00e7\u00f5es que modificam a estrutura de interfaces, classes e aspectos. Elas podem adicionar vari\u00e1veis membros ou m\u00e9todos e at\u00e9 mesmo mudar a hierarquia dessas entidades. <\/p>\n<p><font size=\"3\"><font face=\"Courier New\"><strong><font color=\"#800080\">declare parents<\/font><\/strong>: Account <font color=\"#800080\"><strong>implements<\/strong> <\/font>BankingEntity;<\/font><\/font><\/p>\n<h4><a name=\"_Toc122083525\">Compile-time detection<\/a><\/h4>\n<p>Compile-time detections s\u00e3o utilizadas para criar warnings e errors em determinados padr\u00f5es de uso de APIs.<\/p>\n<p><font size=\"3\"><font face=\"Courier New\"><strong><font color=\"#800080\">declare warning<\/font><\/strong> : <strong><font color=\"#800080\">call<\/font><\/strong>(void Persistence.save(Object))<\/font><\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">: <font color=\"#000080\">&quot;Consider using Persistence.saveOptimized()&quot;<\/font>;<\/font><\/p>\n<p><b><i>       <br \/><\/i><\/b><\/p>\n<h4><a name=\"_Toc122083526\">Aspect<\/a><\/h4>\n<p>O aspect (aspecto) \u00e9 o ponto central da Orienta\u00e7\u00e3o a Aspectos, assim como uma classe \u00e9 o ponto central em orienta\u00e7\u00e3o a objetos. Nele s\u00e3o declarados e implementados os c\u00f3digos que expressam as regras de mesclagem das funcionalidades. Pointcuts, advices, introductions e declara\u00e7\u00f5es s\u00e3o combinados em aspectos. Al\u00e9m dos elementos da Orienta\u00e7\u00e3o a Aspecto, um aspecto tamb\u00e9m pode conter m\u00e9todos e vari\u00e1veis membros assim como nas classes Java. <\/p>\n<p align=\"center\"><a href=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image3.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/www.javaframework.org\/portal\/wp-content\/uploads\/2010\/04\/image_thumb3.png\" width=\"575\" height=\"484\" \/><\/a> <font size=\"1\">Esquema mostrando o relacionamento entre uma classe e um aspecto<\/font><\/p>\n<p>Existem outras implementa\u00e7\u00f5es de Orienta\u00e7\u00e3o a Aspectos para Java que podem n\u00e3o ter a sintaxe extendida do AspectJ e por isso utiliza classes e m\u00e9todos normais para cria\u00e7\u00e3o dos aspectos, mas ainda assim os conceitos s\u00e3o v\u00e1lidos.<\/p>\n<p><b>     <br \/><\/b><\/p>\n<h3><font size=\"5\">3 Hello World<\/font><\/h3>\n<p>&#160;<\/p>\n<p>Criaremos ent\u00e3o o Hello World, utilizando AspectJ. Criaremos uma classe Hello com um m\u00e9todo sayHello que imprimir\u00e1 \u2018Hello\u2019 na sa\u00edda padr\u00e3o. Depois criaremos um aspecto que conter\u00e1 um <i>pointcut<\/i> que selecionar\u00e1 o <i>join point <\/i>que ser\u00e1 a execu\u00e7\u00e3o do m\u00e9todo sayHello da classe Hello, criaremos um <i>advice<\/i> que imprimir\u00e1 \u2018World\u2019 ap\u00f3s o <i>join point <\/i>definido previamente.<\/p>\n<p><font size=\"3\"><font face=\"Courier New\"><strong><font color=\"#800080\">public class<\/font><\/strong> Hello {<\/font><\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160; <strong><font color=\"#800080\">public void<\/font><\/strong> sayHello(){<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.print(<font color=\"#0000ff\">&quot;Hello&quot;<\/font>);<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160; }<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">}<\/font><\/p>\n<p>Ao executarmos o m\u00e9todo sayHello ser\u00e1 impresso na tela:<\/p>\n<p><strong><font size=\"4\" face=\"Courier New\">Hello<\/font><\/strong><\/p>\n<p>Criaremos ent\u00e3o, o aspecto que estender\u00e1 a funcionalidade do sayHello:<\/p>\n<p><font size=\"3\"><font face=\"Courier New\"><strong><font color=\"#800080\">public aspect<\/font><\/strong> AspectHello {<\/font><\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160; <font color=\"#008000\">\/\/ pointcut que seleciona como join point a execu\u00e7\u00e3o do m\u00e9todo<\/font><\/font><\/p>\n<p><font color=\"#008000\" size=\"3\" face=\"Courier New\">&#160;&#160;&#160; \/\/ sayHello da classe Hello<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160; <strong><font color=\"#800080\">pointcut<\/font><\/strong> world(): <strong><font color=\"#800080\">execution<\/font><\/strong> (public void Hello.sayHello());<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160; <font color=\"#008000\">\/\/ advice que ser\u00e1 executado ap\u00f3s cada join point selecionado <\/font><\/font><\/p>\n<p><font color=\"#008000\" size=\"3\" face=\"Courier New\">&#160;&#160;&#160; \/\/ pelo pointcut world()<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160; <strong><font color=\"#800080\">after<\/font><\/strong>() <strong><font color=\"#800080\">returning<\/font><\/strong>: world() {<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(<font color=\"#000080\">&quot; World&quot;<\/font>);<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">&#160;&#160;&#160; }<\/font><\/p>\n<p><font size=\"3\" face=\"Courier New\">}<\/font><\/p>\n<p>Ap\u00f3s fazer o weaving e executar o m\u00e9todo Hello.sayHello() a sa\u00edda do programa ser\u00e1:<\/p>\n<p><strong><font size=\"4\" face=\"Courier New\">Hello World<\/font><\/strong><\/p>\n<h3><font size=\"5\">4 Vantagens da Orienta\u00e7\u00e3o a Aspectos<\/font><\/h3>\n<p>&#160;<\/p>\n<p>A Orienta\u00e7\u00e3o a Aspectos traz novas dificuldades a programa\u00e7\u00e3o, mesmo porque \u00e9 uma nova metodologia, e tudo que \u00e9 novo requer um tempo de aprendizado. Mas a Orienta\u00e7\u00e3o a Aspectos oferece vantagens que cobrem esse tipo de problema:<\/p>\n<p>\u00b7 Responsabilidades mais transparentes de cada m\u00f3dulo: cada m\u00f3dulo \u00e9 respons\u00e1vel apenas pelas tarefas destinadas ao pr\u00f3prio m\u00f3dulo. Os m\u00f3dulo s\u00e3o mais independentes. <\/p>\n<p>\u00b7 Modulariza\u00e7\u00e3o mais alta: As responsabilidades s\u00e3o melhor definidas em cada m\u00f3dulo, os m\u00f3dulos tem baixo acoplamento entre si.<\/p>\n<p>\u00b7 Evolu\u00e7\u00e3o do sistema mais facilitada: O baixo acoplamento possibilita que altera\u00e7\u00f5es no sistema sejam feitas sem altera\u00e7\u00e3o do n\u00facleo<\/p>\n<p>\u00b7 Decis\u00f5es de design podem ser tomadas com mais atraso: Devido ao baixo acoplamento n\u00e3o \u00e9 necess\u00e1rio pensar em todos os problemas no in\u00edcio do desenvolvimento do sistema<\/p>\n<p>\u00b7 Mais reusabilidade do c\u00f3digo: Os m\u00f3dulos podem ser mais reaproveitados devido a alta coes\u00e3o e baixo acoplamento<\/p>\n<p>\u00b7 Sistemas mais f\u00e1ceis de desenvolver e manter: Os aspectos tornam a integra\u00e7\u00e3o das partes do sistema um modulo separado, o que traz mais facilidade no desenvolvimento<\/p>\n<p>\u00b7 Custos reduzidos de introdu\u00e7\u00e3o de novas funcionalidades: Novas funcionalidades podem ser introduzidas criando aspectos, n\u00e3o sendo necess\u00e1rio alterar o n\u00facleo para adicionar tais funcionalidades<\/p>\n<p><b>     <br \/><\/b><\/p>\n<h3><font size=\"5\">5 Conclus\u00e3o<\/font><\/h3>\n<p>&#160;<\/p>\n<p>A Orienta\u00e7\u00e3o a Aspectos \u00e9 uma nova metodologia de programa\u00e7\u00e3o. A Orienta\u00e7\u00e3o a Aspectos n\u00e3o \u00e9 um substituto a orienta\u00e7\u00e3o a objetos e sim um complemento. Um novo n\u00edvel de modulariza\u00e7\u00e3o \u00e9 alcan\u00e7ado, a diminui\u00e7\u00e3o do acoplamento dos m\u00f3dulos possibilita mais facilidade de manuten\u00e7\u00e3o, maior reaproveitamento do c\u00f3digo e maior organiza\u00e7\u00e3o do sistema. Apesar de ser uma nova metodologia a orienta\u00e7\u00e3o a aspectos j\u00e1 \u00e9 est\u00e1 madura o suficiente para ser utilizada na produ\u00e7\u00e3o de sistemas, j\u00e1 tem documenta\u00e7\u00e3o e suporte de ferramentas suficiente. Assim como hoje a orienta\u00e7\u00e3o a objetos \u00e9 a maneira mais aceita para desenvolvimento dos m\u00f3dulos do sistema, a orienta\u00e7\u00e3o a aspectos ser\u00e1 o padr\u00e3o de integra\u00e7\u00e3o desses m\u00f3dulos.<\/p>\n<p><font size=\"5\"><\/font><\/p>\n<h5>Screen casts mostrando a utiliza\u00e7\u00e3o de aspectos junto com a IDE eclipse<\/h5>\n<p><b>Exemplo de logging<\/b>    <br \/><a href=\"http:\/\/www.javaframework.org\/portal\/arquivos\/log.htm\">http:\/\/www.javaframework.org\/portal\/arquivos\/log.htm<\/a>    <br \/><b>Exemplo de uso de anota\u00e7\u00f5es para marcar um par\u00e2metro de um m\u00e9todo como obrigat\u00f3rio<\/b>    <br \/><a href=\"http:\/\/www.javaframework.org\/portal\/arquivos\/req.htm\">http:\/\/www.javaframework.org\/portal\/arquivos\/req.htm<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esse foi um trabalho apresendado por R\u00f3gel Garcia a disciplina de Desenvolvimento de Sistemas Distribu\u00eddos 2, do Curso de Ci\u00eancia da Computa\u00e7\u00e3o \u2013 8o. per\u00edodo, da Universidade FUMEC \u2013 FACE, sob orienta\u00e7\u00e3o do professor Fl\u00e1vio Lapper no ano de 2005. O intuito do trabalho \u00e9 conhe\u00e7er o paradgma de programa\u00e7\u00e3o orientado a aspectos ou AOP.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[32,27,33,17,29,24,14,30,31,28],"class_list":["post-32","post","type-post","status-publish","format-standard","hentry","category-artigos","tag-advice","tag-aop","tag-aspect","tag-compilador","tag-crosscuting","tag-eclipse","tag-java","tag-join-point","tag-pointcut","tag-weaving"],"_links":{"self":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/32","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/comments?post=32"}],"version-history":[{"count":3,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/32\/revisions"}],"predecessor-version":[{"id":35,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/32\/revisions\/35"}],"wp:attachment":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/media?parent=32"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/categories?post=32"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/tags?post=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}