xml free programming - brazil

37
Programação livre de XML : Desenvolvimento de servidor e cliente em Java sem <> Stephen Chin Java Evangelist, Oracle s [email protected] tweet: @steveonjava Translation By: Marcelo Quinta @mrquinta

Upload: stephen-chin

Post on 15-Jan-2015

6.647 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: XML Free Programming - Brazil

Programação livre de XML : Desenvolvimento de servidor e cliente em Java sem <>

Stephen ChinJava Evangelist, [email protected]: @steveonjava

Translation By:Marcelo Quinta @mrquinta

Page 2: XML Free Programming - Brazil

Nosso plano

> Rápida (Engraçada) história dos colchetes <>> Programação livre de XML

1. Configuração dentro no código2. Transferência de dados modela o domínio3. Design de linguagem de programação para humanos

> Aplicação dos palestrantes do JavaOne <Demo>

2

Page 3: XML Free Programming - Brazil

Figura A – Os <> vistos na Virginia, 1922Fonte: Library of Congress, Prints and Photographs Collection – Public Domainhttp://www.flickr.com/photos/pingnews/434444310/

3

> > >

Page 4: XML Free Programming - Brazil

Figura B - Tri-Angle Brackets das BermudasFonte: NOAA National Ocean Service – CC licensedhttp://www.flickr.com/photos/usoceangov/4276194691/sizes/o/in/photostream/

4>>>

Page 5: XML Free Programming - Brazil

Figura C – Tim Bray, Co-Fundador do XMLFonte: Linux.comhttp://www.linux.com/archive/feature/133149

5

>>>>

Page 6: XML Free Programming - Brazil

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

Page 7: XML Free Programming - Brazil

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

Page 8: XML Free Programming - Brazil

Metas do projeto por aplicação

Publicação Configuração Transferência de dados Programação

Utilizável via internet Importante N/A Importante N/A

Larga variedade de apps Aceitável Negativo N/A N/A

Compatível com SGML Importante Negativo Negativo Negativo

Processável por computador Importante Importante Importante Importante

Sem funcionalidades opcionais Importante Importante Importante Importante

Legível por humanos Importante Importante Aceitável Importante

Projeto rápido Importante N/A N/A N/A

Espec formal e concisa Importante Importante Important N/A

Fácil criar documentos Importante Importante N/A Importante

Marcação verbosa Negativo Negativo Negativo Negativo

8

Page 9: XML Free Programming - Brazil

9

Princípio 1

Configuração dentro do código

Page 10: XML Free Programming - Brazil

Deixar o XML é difícil!

10

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

Page 11: XML Free Programming - Brazil

@WebServlet(“/hello”)public class HelloServlet extends HttpServlet {

public void doGet(HttpServletRequest reqHttpServletResponse res) {

. . .}

<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

Page 12: XML Free Programming - Brazil

XMLcomo uma exceção

Não uma regra

Page 13: XML Free Programming - Brazil

Anotações do Java EE 6

> @Stateless> @Path> @WebServlet> @Inject> @Named> @Entity

13

Page 14: XML Free Programming - Brazil

Mas há esperança!

14

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

Page 15: XML Free Programming - Brazil

Comparação do Canoo Web Test

XML

<project default="test"> <target name="test"> <webtest        name="Google WebTest Search">    <invoke url="http://www.google.com/ncr" />    <verifyTitle text="Google" />    <setInputField name="q" value="WebTest" />    <clickButton label="I'm Feeling Lucky" />    <verifyTitle text="Canoo WebTest" />  </webtest> </target></project>

Groovy Builder

class SimpleTest extends WebtestCase { void testWebtestOnGoogle() {  webtest("Google WebTest Search") {   invoke "http://www.google.com/ncr"   verifyTitle "Google"   setInputField name: "q", value: "WebTest"   clickButton "I'm Feeling Lucky"   verifyTitle "Canoo WebTest"  } }}

15

Page 16: XML Free Programming - Brazil

16

Princípio 2

A transferência de dados modela o domínio

Page 17: XML Free Programming - Brazil

<?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.addressmanager/" xmlns: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:LocationInfo[3]">…

Page 18: XML Free Programming - Brazil

<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 via qualified attribute names on any complex type referencing them. -->…

Page 19: XML Free Programming - Brazil

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

Page 20: XML Free Programming - Brazil

Sintaxe do JSON em um slide

20Images courtesy: http://www.json.org/

Page 21: XML Free Programming - Brazil

Amostra do JAX-RS

21

@Stateless@Path("sezzion")public class SezzionFacadeREST extends AbstractFacade<Sezzion> { @PersistenceContext private EntityManager em;

@POST@Consumes({"application/json", "application/xml"}) public void create(Sezzion entity) { super.create(entity); }

@GET @Produces({"application/json", "application/xml"}) public List<Sezzion> findAll() { return super.findAll(); }

@GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Sezzion> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); }

Page 22: XML Free Programming - Brazil

22

Princípio 3

Projetar linguagens de programação para humanos

Page 23: XML Free Programming - Brazil

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 Threads

Diagram from: http://www.o-xml.org/documentation/o-xml-tool-chain.html

Page 24: XML Free Programming - Brazil

Substituição de String - o:XML vs. Java<?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>

class 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(); }}

24

16 Linhas461 Caracteres

14 Linhas319 Caracteres

Page 25: XML Free Programming - Brazil

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>

Page 26: XML Free Programming - Brazil

Equivalente em Java

class 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

Page 27: XML Free Programming - Brazil

Java simples

class Replace { public String replace(String input, String from, String to) { return input.replaceAll(from, to) }}

27

Page 28: XML Free Programming - Brazil

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

Page 29: XML Free Programming - Brazil

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(); }}

Page 30: XML Free Programming - Brazil

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();}

Page 31: XML Free Programming - Brazil

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") } }}

Page 32: XML Free Programming - Brazil

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) } } }}

Page 33: XML Free Programming - Brazil

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} } }}

Page 34: XML Free Programming - Brazil

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

Page 35: XML Free Programming - Brazil

35

Aplicação finalizada

Page 36: XML Free Programming - Brazil

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

36

</>

Assine a petição hoje!

Page 37: XML Free Programming - Brazil

37

Stephen [email protected]: @steveonjava

Obrigado!

Desconto especial de 40% para o JustJava. Entre em apress.com e digite o código PJVF73