XML Free Programming - Brazil

7,614 views

Published on

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
7,614
On SlideShare
0
From Embeds
0
Number of Embeds
5,299
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

XML Free Programming - Brazil

  1. 1. Programação livre de XML : Desenvolvimento deservidor e cliente em Java sem <> Stephen Chin Java Evangelist, Oracle stephen.chin@oracle.com Translation By: tweet: @steveonjava Marcelo Quinta @mrquinta
  2. 2. Nosso plano> Rápida (Engraçada) história dos colchetes <>> Programação livre de XML 1. Configuração dentro no código 2. Transferência de dados modela o domínio 3. Design de linguagem de programação para humanos> Aplicação dos palestrantes do JavaOne <Demo> 2
  3. 3. Figura A – Os <> vistos na Virginia, 1922Fonte: Library of Congress, Prints and Photographs Collection – Public Domainhttp://www.flickr.com/photos/pingnews/434444310/ 3
  4. 4. Figura B - Tri-Angle Brackets das BermudasFonte: NOAA National Ocean Service – CC licensedhttp://www.flickr.com/photos/usoceangov/4276194691/sizes/o/in/photostream/ 4
  5. 5. Figura C – Tim Bray, Co-Fundador do XMLFonte: Linux.comhttp://www.linux.com/archive/feature/133149 5
  6. 6. História do XML> Baseado no Standard Generalized Markup Language (SGML)> Criado por um grupo de trabalho da W3C com onze membros Histórico de versões:  XML 1.0 (1998) – Largamente adotado, com 5 revisões subsequentes  XML 1.1 (2004) – Adoção limitada 6
  7. 7. Objetivos do projeto XML (a.k.a. problemas com SGML)1. Utilizável na internet2. Suportar uma larga variedade de aplicações3. Compatível com SGML4. Facilidade de escrever programas para processar documentos XML5. Mínimo número de funcionalidades opcionais6. Documentos devem ser legíveis por humanos e razoavelmente limpos7. Projeto deve ser preparado rapidamente8. Projeto deve ser formal e conciso9. Documentos devem ser fáceis de criar10. Concisão na marcação é de importância mínima 7
  8. 8. Metas do projeto por aplicação Publicação Configuração Transferência de dados ProgramaçãoUtilizável via internet Importante N/A Importante N/ALarga variedade de apps Aceitável Negativo N/A N/ACompatível com SGML Importante Negativo Negativo NegativoProcessável por computador Importante Importante Importante ImportanteSem funcionalidades opcionais Importante Importante Importante ImportanteLegível por humanos Importante Importante Aceitável ImportanteProjeto rápido Importante N/A N/A N/AEspec formal e concisa Importante Importante Important N/AFácil criar documentos Importante Importante N/A ImportanteMarcação verbosa Negativo Negativo Negativo Negativo 8
  9. 9. Princípio 1Configuração dentro docódigo 9
  10. 10. Deixar o XML é difícil! Isso não é entendido como uma substituição ao formato de XML do Spring Rod Johnson sobre Configurações do Spring baseadas em annotations “A Java configuration option for Spring,” 11/28/06 10
  11. 11. <web-app> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>myservlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> ...</web-app> web.xml @WebServlet(“/hello”) public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req HttpServletResponse res) { ... }
  12. 12. XMLcomo uma exceção Não uma regra
  13. 13. Anotações do Java EE 6> @Stateless> @Path> @WebServlet> @Inject> @Named> @Entity 13
  14. 14. Mas há esperança! Você pode ter uma DSL Groovy… ela é tão curta quanto possível Dierk Koenig no Canoo Web Test “Interview with Dierk Koenig,” ThirstyHead.com 6/3/2009 14
  15. 15. Comparação do Canoo Web Test XML Groovy Builder<project default="test"> class SimpleTest extends WebtestCase { <target name="test"> void testWebtestOnGoogle() { <webtest webtest("Google WebTest Search") { name="Google WebTest Search"> invoke "http://www.google.com/ncr" <invoke url="http://www.google.com/ncr" /> verifyTitle "Google" <verifyTitle text="Google" /> setInputField name: "q", value: "WebTest" <setInputField name="q" value="WebTest" /> clickButton "Im Feeling Lucky" <clickButton label="Im Feeling Lucky" /> verifyTitle "Canoo WebTest" <verifyTitle text="Canoo WebTest" /> } </webtest> } </target> }</project> 15
  16. 16. Princípio 2A transferência de dadosmodela o domínio 16
  17. 17. <?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xmlns:ns5="http://www.themindelectric.com/package/com.esri.is.services.glue.v2.addressxmlns:ns6="http://www.themindelectric.com/package/com.esri.is.services.common.v2/"xmlns:ns7="http://www.themindelectric.com/package/com.esri.is.services.common.v2.geom/ <soap:Body> <n:findAddressesResponse xmlns:n="v2"> <Result href="#id0"/> </n:findAddressesResponse> <id0 id="id0" soapenc:root="0" xsi:type="ns5:AddressManagerInfo"> <results href="#id1"/> <numSuccessful xsi:type="xsd:int">1</numSuccessful> <numUnsuccessful xsi:type="xsd:int">1</numUnsuccessful> <numCandidateMatches xsi:type="xsd:int">1</numCandidateMatches> </id0> <id1 id="id1" soapenc:root="0" xsi:type="soapenc:Array" soapenc:arrayType="ns6:Loc…
  18. 18. <xs:schema targetNamespace="http://schemas.xmlsoap.org/soap/envelope/"><!-- Envelope, header and body --><xs:element name="Envelope" type="tns:Envelope"/><xs:complexType name="Envelope"><xs:sequence><xs:element ref="tns:Header" minOccurs="0"/><xs:element ref="tns:Body" minOccurs="1"/><xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/</xs:sequence><xs:anyAttribute namespace="##other" processContents="lax"/></xs:complexType><xs:element name="Header" type="tns:Header"/><xs:complexType name="Header"><xs:sequence><xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/</xs:sequence><xs:anyAttribute namespace="##other" processContents="lax"/></xs:complexType><xs:element name="Body" type="tns:Body"/><xs:complexType name="Body"><xs:sequence><xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/></xs:sequence><xs:anyAttribute namespace="##any" processContents="lax"><xs:annotation><xs:documentation> Prose in the spec does not specify that attributes are allowed on the Body element</xs:documentation></xs:annotation></xs:anyAttribute></xs:complexType><!-- Global Attributes. The following attributes are intended to be usable viaqualified attribute names on any complex type referencing them. -->…
  19. 19. JavaScript Object Notation (JSON)> Combina estruturas relacionais/orientadas a objetos> Fácil de ler e escrever> Simples para análise (parse) e geração> Familiar aos programadores de linguagens baseadas em C:  C, C++, C#, Java, JavaScript, Perl, Python, etc.> Especificação muito simples. 19
  20. 20. Sintaxe do JSON em um slide Images courtesy: http://www.json.org/ 20
  21. 21. Amostra do JAX-RS@Stateless @GET@Path("sezzion") @Produces({"application/json", "application/xml"})public class SezzionFacadeREST extends public List<Sezzion> findAll() {AbstractFacade<Sezzion> { return super.findAll(); @PersistenceContext } private EntityManager em; @GET@POST @Path("{from}/{to}")@Consumes({"application/json", "application/xml"}) @Produces({"application/xml", "application/json"}) public void create(Sezzion entity) { public List<Sezzion> findRange(@PathParam("from") Integer super.create(entity); from, @PathParam("to") Integer to) { } return super.findRange(new int[]{from, to}); } 21
  22. 22. Princípio 3Projetar linguagens deprogramação para humanos 22
  23. 23. Contra-exemplo – o:XML> Criada por Martin Klang em 2002> Linguagem orientada a objetos> Funcionalidades:  Polimorfismo  Sobrecarga de funções  Tratamento de exceções Diagram from: http://www.o-xml.org/documentation/o-xml-tool-chain.html  Threads 23
  24. 24. Substituição de String - o:XML vs. Java<?xml-stylesheethref="../xsl/default.xsl" type="text/xsl"?> class Replace {<program> public String replace(String input, String from, String to) { <o:function name="ex:replace"> StringBuilder result = new StringBuilder(); <o:param name="input" type="String"/> int last = 0; <o:param name="from" type="String"/> int index = 0; <o:param name="to" type="String"/> while ((index = input.indexOf(from, last)) != -1) { <o:do> result.append(input.substring(last, index)); 16 Linhas <o:variable name="result"/> 14 Linhas result.append(to); <o:while test="contains($input, $from)"> last = index + from.length() 461 Caracteres <o:set result="concat($result, substring-before($input,$from), $to)"/> } 319 Caracteres result.append(input.substring(last)); <o:set input="substring-after($input, $from)"/> return result.toString(); </o:while> } <o:return select="concat($result, $input)"/> } </o:do> </o:function></program> 24
  25. 25. Substituição de String em o:XML<?xml-stylesheethref="../xsl/default.xsl" type="text/xsl"?><program> <o:function name="ex:replace"> <o:param name="input" type="String"/> <o:param name="from" type="String"/> <o:param name="to" type="String"/> <o:do> <o:variable name="result"/> <o:while test="contains($input, $from)"> <o:set result="concat($result, substring-before($input, $from), $to)"/> <o:set input="substring-after($input, $from)"/> </o:while> <o:return select="concat($result, $input)"/> </o:do> </o:function></program> 25
  26. 26. Equivalente em Javaclass Replace { public String replace(String input, String from, String to) { StringBuilder result = new StringBuilder(); int last = 0; int index = 0; while ((index = input.indexOf(from, last)) != -1) { result.append(input.substring(last, index)); result.append(to); last = index + from.length() } result.append(input.substring(last)); return result.toString(); }} 26
  27. 27. Java simplesclass Replace { public String replace(String input, String from, String to) { return input.replaceAll(from, to) }} 27
  28. 28. JavaFX 2.0> Gráficos, animação e trato com mídia poderosos> Roda no navegador ou no desktop> Inclui construtores para desenvolvimento declarativo> Linguagens alternativas também podem ser usadas para criação de interfaces mais simples  GroovyFX  ScalaFX  Visage 28
  29. 29. Hello JavaOne (Versão Java)public class HelloJavaOne extends Application { public static void main(String[] args) { launch(HelloJavaOne.class, args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello JavaOne"); Group root = new Group(); Scene scene = new Scene(root, 400, 250, Color.ALICEBLUE); Text text = new Text(); text.setX(105); text.setY(120); text.setFont(new Font(30)); text.setText("Hello JavaOne"); root.getChildren().add(text); primaryStage.setScene(scene); primaryStage.show(); }} 29
  30. 30. Hello JavaOne (Versão Builder)public void start(Stage primaryStage) { primaryStage.setTitle("Hello JavaOne"); primaryStage.setScene(SceneBuilder.create() .width(400) .height(250) .fill(Color.ALICEBLUE) .root( GroupBuilder.create().children( TextBuilder.create() .x(105) .y(120) .text("Hello JavaOne") .font(new Font(30)) .build() ).build() ) .build()); primaryStage.show();} 30
  31. 31. Hello JavaOne (Versão GroovyFX )GroovyFX.start { primaryStage -> def sg = new SceneGraphBuilder() sg.stage( title: Hello JavaOne, show: true) { scene( fill: aliceblue, width: 400, height: 250) { text( x: 105, y: 120, text: "Hello JavaOne" font: "30pt") } }} 31
  32. 32. Hello JavaOne (Versão ScalaFX)object HelloJavaOne extends JFXApp { stage = new Stage { title = "Hello JavaFX" width = 400 height = 250 scene = new Scene { fill = BLUE Text { x = 105 y = 120 text = "Hello JavaOne" font = Font(size: 30) } } }} 32
  33. 33. Hello JavaOne (Versão Visage)Stage { title: "Hello JavaOne" width: 400 height: 250 scene: Scene { fill: BLUE content: Text { x: 105 y: 120 text: "Hello JavaOne" font: Font {size: 30pt} } }} 33
  34. 34. Aplicação dos palestrantes do JavaOne> Aplicação fim-a-fim sem XML> Servidor desenvolvidos com anotações do Java 6> Transferência de dados usa JSON> Cliente escrito em JavaFX 2.0 34
  35. 35. Aplicação finalizada 35
  36. 36. Dê suporte a petição “Liberdade do XML” </>http://steveonjava.com/freedom-from-xml/Prover alternativas não-XML para:> Programação declarativa> Configuração> Transferência de dados Assine a petição hoje! 36
  37. 37. Obrigado! Stephen Chin stephen.chin@oracle.com tweet: @steveonjavaDesconto especial de 40% para o JustJava.Entre em apress.com e digite o código PJVF73 37

×