xml free programming - brazil
DESCRIPTION
TRANSCRIPT
Programação livre de XML : Desenvolvimento de servidor e cliente em Java sem <>
Stephen ChinJava Evangelist, [email protected]: @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 [email protected]: @steveonjava
Obrigado!
Desconto especial de 40% para o JustJava. Entre em apress.com e digite o código PJVF73