xml free programming - brazil

Post on 15-Jan-2015

6.647 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

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

Stephen ChinJava Evangelist, Oraclestephen.chin@oracle.comtweet: @steveonjava

Translation By:Marcelo Quinta @mrquinta

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

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

3

> > >

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

4>>>

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

5

>>>>

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

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

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

9

Princípio 1

Configuração dentro do código

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

@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

XMLcomo uma exceção

Não uma regra

Anotações do Java EE 6

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

13

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

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

16

Princípio 2

A transferência de dados modela o domínio

<?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]">…

<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. -->…

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

Sintaxe do JSON em um slide

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

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

22

Princípio 3

Projetar linguagens de programação para humanos

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

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

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>

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

Java simples

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

27

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

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

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

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

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

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

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

Aplicação finalizada

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!

37

Stephen Chinstephen.chin@oracle.comtweet: @steveonjava

Obrigado!

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

top related