JDOM: How It Works, and How It Opened the Java Process by Jason Hunter O'Reilly Open Source Convention 2001 July, 2001.

Slides:



Advertisements
Similar presentations
XML-XSL Introduction SHIJU RAJAN SHIJU RAJAN Outline Brief Overview Brief Overview What is XML? What is XML? Well Formed XML Well Formed XML Tag Name.
Advertisements

J0 1 Marco Ronchetti - Web architectures – Laurea Specialistica in Informatica – Università di Trento Java XML parsing.
Advanced XSLT. Branching in XSLT XSLT is functional programming –The program evaluates a function –The function transforms one structure into another.
What is XML? a meta language that allows you to create and format your own document markups a method for putting structured data into a text file; these.
1 XSLT – eXtensible Stylesheet Language Transformations Modified Slides from Dr. Sagiv.
An Introduction to XML Based on the W3C XML Recommendations.
XML 6.3 DTD 6. XML and DTDs A DTD (Document Type Definition) describes the structure of one or more XML documents. Specifically, a DTD describes:  Elements.
Java + XML = JDOM by Jason Hunter and Brett McLaughlin XML DevCon November, 2000.
Document Type Definitions
Review Writing XML  Style  Common errors 1XML Technologies David Raponi.
Introduction to XLink Transparency No. 1 XML Information Set W3C Recommendation 24 October 2001 (1stEdition) 4 February 2004 (2ndEdition) Cheng-Chia Chen.
31 Signs That Technology Has Taken Over Your Life: #6. When you go into a computer store, you eavesdrop on a salesperson talking with customers -- and.
DT211/3 Internet Application Development
Fonts and colors Times New Roman “quotes” Trebuchet "quotes" yellow blue pink green violet.
29-Jun-15 JAXB Java Architecture for XML Binding.
1 HTML’s Transition to XHTML. 2 XHTML is the next evolution of HTML Extensible HTML eXtensible based on XML (extensible markup language) XML like HTML.
Document Type Definitions. XML and DTDs A DTD (Document Type Definition) describes the structure of one or more XML documents. Specifically, a DTD describes:
Introduction to XML This material is based heavily on the tutorial by the same name at
Chapter 13 XML Concept of XML Simple Example of XML XML vs. HTML in Syntax XML Structure DTD and CDATA Sections Concept of SAX Processing Download and.
Java + XML = JDOM by Jason Hunter and Brett McLaughlin co-creators of JDOM Mountain View Java User's Group April 26, 2000.
Pemrograman Berbasis WEB XML part 2 -Aurelio Rahmadian- Sumber: w3cschools.com.
Introduction to XML cs3505. References –I got most of this presentation from this site –O’reilly tutorials.
XML eXtensible Markup Language by Darrell Payne. Experience Logicon / Sterling Federal C, C++, JavaScript/Jscript, Shell Script, Perl XML Training XML.
1 XML at a neighborhood university near you Innovation 2005 September 16, 2005 Kwok-Bun Yue University of Houston-Clear Lake.
CREATED BY ChanoknanChinnanon PanissaraUsanachote
1Computer Sciences Department Princess Nourah bint Abdulrahman University.
XML and its applications: 4. Processing XML using PHP.
Representing Web Data: XML CSI 3140 WWW Structures, Techniques and Standards.
XP New Perspectives on XML, 2 nd Edition Tutorial 10 1 WORKING WITH THE DOCUMENT OBJECT MODEL TUTORIAL 10.
Files and Streams. Java I/O File I/O I/O streams provide data input/output solutions to the programs. A stream can represent many different kinds of sources.
Java + XML = JDOM by Jason Hunter and Brett McLaughlin Enterprise Java O’Reilly Conference March, 2001.
What is XML?  XML stands for EXtensible Markup Language  XML is a markup language much like HTML  XML was designed to carry data, not to display data.
Processing of structured documents Spring 2002, Part 2 Helena Ahonen-Myka.
XML Parsers Overview  Types of parsers  Using XML parsers  SAX  DOM  DOM versus SAX  Products  Conclusion.
Electronic Commerce COMP3210 Session 4: Designing, Building and Evaluating e-Commerce Initiatives – Part II Dr. Paul Walcott Department of Computer Science,
Intro to XML Originally Presented by Clifford Lemoine Modified by Box.
XML A web enabled data description language 4/22/2001 By Mark Lawson & Edward Ryan L’Herault.
XSLT Kanda Runapongsa Dept. of Computer Engineering Khon Kaen University.
Softsmith Infotech XML. Softsmith Infotech XML EXtensible Markup Language XML is a markup language much like HTML Designed to carry data, not to display.
WEB BASED DATA TRANSFORMATION USING XML, JAVA Group members: Darius Balarashti & Matt Smith.
IS432 Semi-Structured Data Lecture 2: DTD Dr. Gamal Al-Shorbagy.
Java 5 Part 1 CSE301 University of Sunderland Harry Erwin, PhD.
Java + XML = JDOM by Jason Hunter with Brett McLaughlin Sun HQ Briefing January, 2001.
Introduction to XML This presentation covers introductory features of XML. What XML is and what it is not? What does it do? Put different related technologies.
Web Technologies COMP6115 Session 4: Adding a Database to a Web Site Dr. Paul Walcott Department of Computer Science, Mathematics and Physics University.
C# and Windows Programming XML Processing. 2 Contents Markup XML DTDs XML Parsers DOM.
XML and Database.
XML Study-Session: Part III
AxKit A member of the Apache XML project Ryan Maslyn Kyle Bechtel.
This PowerPoint is based on slides from: Jason Hunter and Brett McLaughlin.
COSC617 Project XML Tools Mark Liu Sanjay Srivastava Junping Zhang.
COMP9321 Web Application Engineering Semester 2, 2015 Dr. Amin Beheshti Service Oriented Computing Group, CSE, UNSW Australia Week 4 1COMP9321, 15s2, Week.
When we create.rtf document apart from saving the actual info the tool saves additional info like start of a paragraph, bold, size of the font.. Etc. This.
1 Introduction JAXP. Objectives  XML Parser  Parsing and Parsers  JAXP interfaces  Workshops 2.
XML CORE CSC1310 Fall XML DOCUMENT XML document XML document is a convenient way for parsers to archive data. In other words, it is a way to describe.
7-Mar-16 Simple API XML.  SAX and DOM are standards for XML parsers-- program APIs to read and interpret XML files  DOM is a W3C standard  SAX is an.
Jackson, Web Technologies: A Computer Science Perspective, © 2007 Prentice-Hall, Inc. All rights reserved Chapter 7 Representing Web Data:
XML Introduction to XML Extensible Markup Language.
Lecture Transforming Data: Using Apache Xalan to apply XSLT transformations Marc Dumontier Blueprint Initiative Samuel Lunenfeld Research Institute.
Product Training Program
XML Parsers Overview Types of parsers Using XML parsers SAX DOM
Unit 4 Representing Web Data: XML
Java XML IS
Intro to XML.
XML QUESTIONS AND ANSWERS
Chapter 7 Representing Web Data: XML
XML Parsers Overview Types of parsers Using XML parsers SAX DOM
XML: eXtensible Markup Language
(Computer fundamental Lab)
XML and Web Services (II/2546)
Presentation transcript:

JDOM: How It Works, and How It Opened the Java Process by Jason Hunter O'Reilly Open Source Convention 2001 July, 2001

Introductions Jason Hunter Author of "Java Servlet Programming, 2nd Edition" (O'Reilly) 2nd Edition" (O'Reilly)

What is JDOM? JDOM is a way to represent an XML document for easy and efficient reading, manipulation, and writingJDOM is a way to represent an XML document for easy and efficient reading, manipulation, and writing –Straightforward API –Lightweight and fast –Java-optimized Despite the name similarity, it's not build on DOM or modeled after DOMDespite the name similarity, it's not build on DOM or modeled after DOM –Although it integrates well with DOM and SAX An open source project with an Apache-style licenseAn open source project with an Apache-style license –1200 developers on jdom-interest (high traffic) –1050 lurkers on jdom-announce (low traffic)

The JDOM Philosophy JDOM should be straightforward for Java programmersJDOM should be straightforward for Java programmers –Use the power of the language (Java 2) –Take advantage of method overloading, the Collections APIs, reflection, weak references –Provide conveniences like type conversions JDOM should hide the complexities of XML wherever possibleJDOM should hide the complexities of XML wherever possible –An Element has content, not a child Text node with content –Exceptions should contain useful error messages –Give line numbers and specifics, use no SAX or DOM specifics

More JDOM Philosophy JDOM should integrate with DOM and SAXJDOM should integrate with DOM and SAX –Support reading and writing DOM documents and SAX events –Support runtime plug-in of any DOM or SAX parser –Easy conversion from DOM/SAX to JDOM –Easy conversion from JDOM to DOM/SAX JDOM should stay current with the latest XML standardsJDOM should stay current with the latest XML standards –DOM Level 2, SAX 2.0, XML Schema JDOM does not need to solve every problemJDOM does not need to solve every problem –It should solve 80% of the problems with 20% of the effort –We think we got the ratios to 90% / 10%

Scratching an Itch JAXP wasn’t aroundJAXP wasn’t around –Needed parser independence in DOM and SAX –Had user base using variety of parsers –Now integrates with JAXP 1.1 –Expected to be part of JAXP version.next Why not use DOM:Why not use DOM: –Same API on multiple languages, defined using IDL –Foreign to the Java environment, Java programmer –Fairly heavyweight in memory Why not use SAX:Why not use SAX: –No document modification, random access, or output –Fairly steep learning curve to use correctly

JDOM Reading and Writing (No Arithmetic)

Package Structure JDOM consists of five packagesJDOM consists of five packages org.jdom org.jdom.adapters org.jdom.input org.jdom.output org.jdom.transform

The org.jdom Package These classes represent an XML document and XML constructs:These classes represent an XML document and XML constructs: –Attribute –CDATA –Comment –DocType –Document –Element –EntityRef –Namespace –ProcessingInstruction –( PartialList ) –( Verifier ) –(Assorted Exceptions)

The org.jdom.input Package Classes for reading XML from existing sources:Classes for reading XML from existing sources: –DOMBuilder –SAXBuilder Also, outside contributions in jdom-contrib:Also, outside contributions in jdom-contrib: –ResultSetBuilder –SpitfireBuilder New support for JAXP-based inputNew support for JAXP-based input –Allows consistency across applications –Builders pick up JAXP information and user automatically –Sets stage for JAXP version.next

The org.jdom.output Package Classes for writing XML to various forms of output:Classes for writing XML to various forms of output: –DOMOutputter –SAXOutputter –XMLOutputter Also, outside contributions in jdom-contrib:Also, outside contributions in jdom-contrib: –JTreeOutputter

org.jdom.transform TRaX is now supported in org.jdom.transformTRaX is now supported in org.jdom.transform –Supports XSLT transformations –Defines Source and Result interfaces –JDOMSource –JDOMResult

General Program Flow Normally XML Document -> SAXBuilder -> XMLOutputterNormally XML Document -> SAXBuilder -> XMLOutputter DOM Node(s) JDOM Document SAXBuilder DOMBuilder XMLOutputter SAXOutputter DOMOutputter XML Document Direct Build

The Document class Documents are represented by the org.jdom.Document classDocuments are represented by the org.jdom.Document class –A lightweight object holding a DocType, ProcessingInstruction s, a root Element, and Comment s It can be constructed from scratch:It can be constructed from scratch: Or it can be constructed from a file, stream, or URL:Or it can be constructed from a file, stream, or URL: Document doc = new Document( new Element("rootElement")) SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(url);

JDOM vs DOM Here's two ways to create a simple new document:Here's two ways to create a simple new document: Document doc = new Document( new Element("rootElement").setText("This is a root element")); Document myDocument = new org.apache.xerces.dom.DocumentImpl(); // Create the root node and its text node, // using the document as a factory Element root = myDocument.createElement("myRootElement"); Text text = myDocument.createText( "This is a root element"); // Put the nodes into the document tree root.appendChild(text); myDocument.appendChild(root);

The Build Process A Document can be constructed using any build toolA Document can be constructed using any build tool –The SAX build tool uses a SAX parser to create a JDOM document Current builders are SAXBuilder and DOMBuilderCurrent builders are SAXBuilder and DOMBuilder –org.jdom.input.SAXBuilder is fast and recommended –org.jdom.input.DOMBuilder is useful for reading an existing DOM tree –A builder can be written that lazily constructs the Document as needed –Other contributed builder: ResultSetBuilder

Builder Classes Builders have optional parameters to specify implementation classes and whether document validation should occur.Builders have optional parameters to specify implementation classes and whether document validation should occur. Not all DOM parsers have the same APINot all DOM parsers have the same API –Xerces, XML4J, Project X, Oracle –The DOMBuilder adapterClass implements org.jdom.adapters.DOMAdapter –Implements standard methods by passing through to an underlying parser –Adapters for all popular parsers are provided –Future parsers require just a small adapter class Once built, documents are not tied to their build toolOnce built, documents are not tied to their build tool SAXBuilder(String parserClass, boolean validate); DOMBuilder(String adapterClass, boolean validate);

The Output Process A Document can be written using any output toolA Document can be written using any output tool –org.jdom.output.XMLOutputter tool writes the document as XML –org.jdom.output.SAXOutputter tool generates SAX events –org.jdom.output.DOMOutputter tool creates a DOM document –Any custom output tool can be used To output a Document as XML:To output a Document as XML: For pretty-output, pass optional parametersFor pretty-output, pass optional parameters –Two-space indent, add new lines XMLOutputter outputter = new XMLOutputter(); outputter.output(doc, System.out); outputter = new XMLOutputter(" ", true); outputter.output(doc, System.out);

In-and-Out import java.io.*; import org.jdom.*; import org.jdom.input.*; import org.jdom.output.*; public class InAndOut { public static void main(String[] args) { // Assume filename argument String filename = args[0]; try { // Build w/ SAX and JAXP, no validation SAXBuilder b = new SAXBuilder(); // Create the document Document doc = b.build(new File(filename)); // Output as XML to screen XMLOutputter outputter = new XMLOutputter(); outputter.output(doc, System.out); } catch (Exception e) { e.printStackTrace(); }

JDOM Core Functionality

The DocType class A Document may have a DocTypeA Document may have a DocType This specifies the DTD of the documentThis specifies the DTD of the document –It's easy to read and write <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " DocType docType = doc.getDocType(); System.out.println("Element: " + docType.getElementName()); System.out.println("Public ID: " + docType.getPublicID()); System.out.println("System ID: " + docType.getSystemID()); doc.setDocType( new DocType("html", "-//W3C...", "

The Element class A Document has a root Element :A Document has a root Element : Get the root as an Element object:Get the root as an Element object: An Element represents something like An Element represents something like –Has access to everything from the open to the closing –Has access to everything from the open to the closing Gotta fit servlets in somewhere! Element webapp = doc.getRootElement();

Playing with Children An element may contain child elementsAn element may contain child elements getChild() may return null if no child existsgetChild() may return null if no child exists getChildren() returns an empty list if no children existgetChildren() returns an empty list if no children exist // Get a List of direct children as Elements List allChildren = element.getChildren(); out.println("First kid: " + ((Element)allChildren.get(0)).getName()); // Get all direct children with a given name List namedChildren = element.getChildren("name"); // Get the first kid with a given name Element kid = element.getChild("name"); // Namespaces are supported as we'll see later

Playing with Grandchildren Grandkids can be retrieved easily:Grandkids can be retrieved easily: Just watch out for a NullPointerException !Just watch out for a NullPointerException ! Enlightenment String manager = root.getChild("gui").getChild("window-manager").getChild("name").getTextTrim();

Managing the Population Children can be added and removed through List manipulation or convenience methods:Children can be added and removed through List manipulation or convenience methods: List allChildren = element.getChildren(); // Remove the fourth child allChildren.remove(3); // Remove all children named "jack" allChildren.removeAll( element.getChildren("jack")); element.removeChildren("jack"); // Add a new child allChildren.add(new Element("jane")); element.addContent(new Element("jane")); // Add a new child in the second position allChildren.add(1, new Element("second"));

JDOM vs DOM Moving elements is easy in JDOM but tricky in DOMMoving elements is easy in JDOM but tricky in DOM You need to call importNode() when moving between different documentsYou need to call importNode() when moving between different documents There's also an elt.detach() optionThere's also an elt.detach() option Element movable = new Element("movableRootElement"); parent1.addContent(movable); // place parent1.removeContent(movable); // remove parent2.addContent(movable); // add Element movable = doc1.createElement("movable"); parent1.appendChild(movable); // place parent1.removeChild(movable); // remove parent2.appendChild(movable); // add // This causes an error! Incorrect document!

Making Kids Elements are constructed directly, no factory method neededElements are constructed directly, no factory method needed Some prefer a nesting shortcut, possible since addContent() returns the Element on which the child was added:Some prefer a nesting shortcut, possible since addContent() returns the Element on which the child was added: A subclass of Element can be made, already containing child elementsA subclass of Element can be made, already containing child elements Element element = new Element("kid"); Document doc = new Document( new Element("family").addContent(new Element("mom")).addContent(new Element("dad").addContent("kidOfDad"))); root.addContent(new FooterElement());

Ensuring Well-Formedness The Element constructor (and all other object constructors) check to make sure the element is legalThe Element constructor (and all other object constructors) check to make sure the element is legal –i.e. the name doesn't contain inappropriate characters The add and remove methods also check document structureThe add and remove methods also check document structure –An element may only exist at one point in the tree –Only one value can be returned by getParent() –No loops in the graph are allowed –Exactly one root element must exist

Making the Making the This code constructs the seen previously:This code constructs the seen previously: Document doc = new Document( new Element("linux-config").addContent(new Element("gui").addContent(new Element("window-manager").addContent(new Element("name").setText("Enlightenment")).addContent(new Element("version").setText("0.16.2")) ) );

Getting Element Attributes Elements often contain attributes:Elements often contain attributes: Attributes can be retrieved several ways:Attributes can be retrieved several ways: getAttribute() may return null if no such attribute existsgetAttribute() may return null if no such attribute exists String value = table.getAttributeValue("width"); // Get "border" as an int try { value = table.getAttribute("border").getIntValue(); } catch (DataConversionException e) { } // Passing default values was removed // Good idea or not?

Setting Element Attributes Element attributes can easily be added or removedElement attributes can easily be added or removed // Add an attribute table.addAttribute("vspace", "0"); // Add an attribute more formally table.addAttribute( new Attribute("name", "value")) // Remove an attribute table.removeAttribute("border"); // Remove all attributes table.getAttributes().clear();

Reading Element Content Elements can contain text content:Elements can contain text content: The text content is directly available:The text content is directly available: Whitespace must be preserved but often isn't needed, so we have a shortcut for removing extra whitespace:Whitespace must be preserved but often isn't needed, so we have a shortcut for removing extra whitespace: A cool demo String content = element.getText(); // Remove surrounding whitespace // Trim internal whitespace to one space element.getTextNormalize();

Writing Element Content Element text can easily be changed:Element text can easily be changed: Special characters are interpreted correctly:Special characters are interpreted correctly: But you can also create CDATA:But you can also create CDATA: CDATA reads the same as normal, but outputs as CDATA.CDATA reads the same as normal, but outputs as CDATA. // This blows away all current content element.setText("A new description"); element.setText(" content"); element.addContent( new CDATA(" content"));

JDOM Advanced Topics

Mixed Content Sometimes an element may contain comments, text content, and childrenSometimes an element may contain comments, text content, and children Text and children can be retrieved as always:Text and children can be retrieved as always: This keeps the standard uses simpleThis keeps the standard uses simple Some text Some child String text = table.getTextTrim(); Element tr = table.getChild("tr");

Reading Mixed Content To get all content within an Element, use getMixedContent()To get all content within an Element, use getMixedContent() –Returns a List containing Comment, String, ProcessingInstruction, CDATA, and Element objects List mixedContent = table.getMixedContent(); Iterator i = mixedContent.iterator(); while (i.hasNext()) { Object o = i.next(); if (o instanceof Comment) { // Comment has a toString() out.println("Comment: " + o); } else if (o instanceof String) { out.println("String: " + o); } else if (o instanceof Element) { out.println("Element: " + ((Element)o).getName()); } // etc }

Manipulating Mixed Content The list of mixed content provides direct control over all the element's content.The list of mixed content provides direct control over all the element's content. List mixedContent = table.getMixedContent(); // Add a comment at the beginning mixedContent.add( 0, new Comment("Another comment")) // Remove the comment mixedContent.remove(0); // Remove everything mixedContent.clear();

XML Namespaces Namespaces are a DOM Level 2 additionNamespaces are a DOM Level 2 addition Namespaces allow elements with the same local name to be treated differentlyNamespaces allow elements with the same local name to be treated differently –It works similarly to Java packages and helps avoid name collisions. Namespaces are used in XML like this:Namespaces are used in XML like this: Home Page

JDOM Namespaces Namespace prefix to URI mappings are held statically in the Namespace classNamespace prefix to URI mappings are held statically in the Namespace class They're declared in JDOM like this:They're declared in JDOM like this: They're passed as optional parameters to most element and attribute manipulation methods:They're passed as optional parameters to most element and attribute manipulation methods: List kids = element.getChildren("p", xhtml); Element kid = element.getChild("title", xhtml); Attribute height = element.getAttribute( "height", xhtml); Namespace xhtml = Namespace.getNamespace( "xhtml", "

List Details The current implementation uses ArrayList for speedThe current implementation uses ArrayList for speed –Will be migrating to a FilterList –Note that viewing a subset slows the relatively rare index-based access List objects are mutableList objects are mutable –Modifications affect the backing document –Other existing list views do not currently see the change, but will with FilterList Because of its use of collections, JDOM requires JDK 1.2+ support, or JDK 1.1 with collections.jarBecause of its use of collections, JDOM requires JDK 1.2+ support, or JDK 1.1 with collections.jar

Current Status Currently JDOM is at Beta 7Currently JDOM is at Beta 7 Pending work:Pending work: –Preserve internal DTD subsets –Polish the high-end features of the outputter –Discussion about Namespace re-factoring –Some well-formedness checking work to be done –Formal specification Speed and memory optimizations yet to be done!Speed and memory optimizations yet to be done!

Extending JDOM Some possible extensions to JDOM:Some possible extensions to JDOM: –XPath (already quite far along, and usable) –XLink/XPointer (follows XPath) –XSLT (natively, now uses Xalan) –In-memory validation

JDOM as JSR-102

News! In late February, JDOM was accepted by the Java Community Process (JCP) as a Java Specification Request (JSR-102)In late February, JDOM was accepted by the Java Community Process (JCP) as a Java Specification Request (JSR-102) Sun's comment with their YES vote:Sun's comment with their YES vote: –In general we tend to prefer to avoid adding new APIs to the Java platform which replicate the functionality of existing APIs. However JDOM does appear to be significantly easier to use than the earlier APIs, so we believe it will be a useful addition to the platform.

What It Means What exactly does this mean?What exactly does this mean? –Facilitates JDOM's corporate adoption –Opens the door for JDOM to be incorporated into the core Java Platform –JDOM will still be released as open source software –Technical discussion will continue to take place on public mailing lists For more information:For more information: – jsr/jsr_102_jdom.html

The People Jason Hunter is the "Specification Lead"Jason Hunter is the "Specification Lead" The initial "Expert Group" (in order of acceptance):The initial "Expert Group" (in order of acceptance): –Brett McLaughlin (individual, from Lutris) –Jools Enticknap (individual, software consultant) –James Davidson (individual, from Sun Microsystems and an Apache member) –Joe Bowbeer (individual, from 360.com) –Philip Nelson (individual, from Omni Resources) –Sun Microsystems (Rajiv Mordani) –CAPS (Bob McWhirter) Many other individuals and corporations have responded to the call for experts, none are yet officialMany other individuals and corporations have responded to the call for experts, none are yet official

Living in the JCP The JCP follows a benevolent dictator modelThe JCP follows a benevolent dictator model –Strong spec lead making decisions based on input –Leaders may be deposed by a 2/3 vote of experts –But the replacement is from the same company! –What happens if you depose an individual? Open source RIs and TCKs are legitOpen source RIs and TCKs are legit –Although the PMO is still learning about this –See JSR-053 (Servlets/JSPs), JSR-052 (Taglibs) –See JSR-080 (USB) which hit resistance Open source independent implementations?Open source independent implementations? –Not technically allowed!! –Must enforce compatibility requirements, which violates open source; must pass costly TCK –Working as Apache rep on these issues

A Public Expert Group? Unlike all other JSRs, JDOM discussion is publicUnlike all other JSRs, JDOM discussion is public –We see no reason to work behind NDAs –On design issues the list keeps us in touch with people's needs, and people often step up to solve issues (i.e. long term serialization) –We use [eg] in the subject line for EG topics Unlike most other JSRs, the JDOM implementation leads the JDOM specificationUnlike most other JSRs, the JDOM implementation leads the JDOM specification –Words on paper don't show all the issues –Witness JSR-047 (Logging) What's the role of an expert?What's the role of an expert? –Similar to that of an Apache Member –Long-term commitment to help as needed

You Too Can Get Involved! Download the softwareDownload the software – Read the docsRead the docs – Sign up for the mailing lists (see jdom.org )Sign up for the mailing lists (see jdom.org ) –jdom-announce –jdom-interest Java and XML, by Brett McLaughlinJava and XML, by Brett McLaughlin – Help improve the software!Help improve the software!