xml-free programming : java server and client development without

Post on 10-May-2015

1.206 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

XML-Free Programming : Java Server and Client Development without at JavaOne 2011

TRANSCRIPT

XML-Free Programming : Java Server and Client Development Without <>

Stephen Chin Chief Agile Methodologist, GXS

steveonjava@gmail.com

tweet: @steveonjava

Arun Gupta Oracle Corporation

arun.p.gupta@oracle.com

tweet: @arungupta

Meet the Presenters

Stephen Chin

Motorcyclist

Family Man

Arun Gupta

Marathoner

Community Guy

Our Plan

> Quick (Humorous) History of Angle Brackets

> XML-Free Programming

1. Configuration Lives with the Code

2. Data Transfer Models the Domain

3. Design Programming Languages for Humans

> JavaOne Speakers Application <Demo>

3

Exhibit A – Angle Bracket Sighting in Virginia, 1922

Source: Library of Congress, Prints and Photographs Collection – Public Domain

http://www.flickr.com/photos/pingnews/434444310/

4

Exhibit B - Bermuda Tri-Angle Brackets

Source: NOAA National Ocean Service – CC licensed

http://www.flickr.com/photos/usoceangov/4276194691/sizes/o/in/photostream/

5

Exhibit C – Tim Bray, Co-Founder of XML

Source: Linux.com

http://www.linux.com/archive/feature/133149

6

History of XML

> Based on Standard Generalized Markup Language (SGML)

> Created by a W3C working group of eleven members

> Version History:

XML 1.0 (1998) – Widely adopted with 5 subsequent revisions

XML 1.1 (2004) – Limited adoption

7

XML Design Goals (a.k.a. problems with SGML)

1. Usable Over the Internet

2. Support a Wide Variety of Applications

3. Compatible with SGML

4. Easy to Write Programs to Process XML Documents

5. Minimum Number of Optional Features

6. Documents Should be Human-Legible and Reasonably Clear

7. Design Should be Prepared Quickly

8. Design Should be Formal and Concise

9. Documents Should be Easy to Create

10. Terseness in Markup is of Minimal Importance 8

Design Goals Per Application

Publishing Configuration Data Transfer Programming

Usable Over Internet Important N/A Important N/A

Wide Variety of Applications Acceptable Negative N/A N/A

Compatible With SGML Important Negative Negative Negative

Computer Processable Important Important Important Important

No Optional Features Important Important Important Important

Human-Legible Important Important Acceptable Important

Design Completed Quickly Important N/A N/A N/A

Formal and Concise Spec Important Important Important N/A

Easy to Create Documents Important Important N/A Important

Markup Can be Verbose Negative Negative Negative Negative

9

Tenet 1

Configuration Lives with the Code

10

Letting Go of XML is Hard!

11

This is not intended as a replacement for Spring's XML format.

Rod Johnson on Spring’s Annotations-based Configuration “A Java configuration option for Spring,” 11/28/06

Java EE 6 Annotations

> @Stateless

> @Path

> @WebServlet

> @Inject

> @Named

> @Entity

12

But There is Hope!

13

You can have a Groovy DSL … it is as short as can be.

Dierk Koenig on Canoo Web Test “Interview with Dierk Koenig,” ThirstyHead.com 6/3/2009

Canoo Web Test Comparison

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

14

Tenet 2

Data Transfer Models the Domain

15

JavaScript Object Notation (JSON)

> Matches Relational/Object-Oriented Structures

> Easy to Read and Write

> Simple to Parse and Generate

> Familiar to Programmers of the C-family of languages:

C, C++, C#, Java, JavaScript, Perl, Python, etc.

> Very Simple Specification

16

JSON Syntax in a Slide

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

JAX-RS Sample

18

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

}

Tenet 3

Design Programming Languages for Humans

19

String Replacement in 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();

}

}

21

16 Lines

461 Characters

14 Lines

319 Characters

String Replacement in 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>

22

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

}

}

23

Simple Java

class Replace {

public String replace(String input, String from, String to) {

return input.replaceAll(from, to)

}

}

24

JavaFX 2.0

> Powerful graphics, animation, and media capabilities

> Deploys in the browser or on desktop

> Includes builders for declarative construction

> Alternative languages can also be used for simpler UI creation

GroovyFX

ScalaFX

Visage

25

26

Hello JavaOne (Java Version) 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(); } }

27

Hello JavaOne (Builder Version) 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(); }

28

Hello JavaOne (GroovyFX Version) 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")

}

}

}

29

Hello JavaOne (ScalaFX Version) 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)

}

}

}

}

30

Hello JavaOne (Visage Version) 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}

}

}

}

JavaOne Speakers Application

> End-to-end application with no XML coding

> Server written using JavaEE 6 annotations

> Data transfer uses JSON

> Client written in JavaFX 2.0

31

Finished Application

32

Support the Freedom From XML Petition

http://steveonjava.com/freedom-from-xml/

Provide Non-XML Alternatives For:

> Declarative Programming

> Configuration

> Data Transfer

33

</>

Sign the Petition Today!

34

Stephen Chin steveonjava@gmail.com

tweet: @steveonjava

Arun Gupta arun.p.gupta@oracle.com

tweet: @arungupta

top related