XML-Free Programming : Java Server and Client Development without
Post on 10-May-2015
1207 Views
Preview:
DESCRIPTION
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
Counter Example – o:XML
> Created By Martin Klang in 2002
> Object Oriented Language
> Features:
Poymorphism
Function Overloading
Exception Handling
Threads
20
Diagram from: http://www.o-xml.org/documentation/o-xml-tool-chain.html
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