Download - Long Tail Treasure Trove
The Long Tail treasure trove
Brian McCallister
Ninghttp://www.ning.com
Gianugo Rabellino
Sourcesensehttp://www.sourcesense.com
2008 JavaOneSM Conference | Session XXXX | 2
Library for Working with Atom (RFC 4287)Apache Abdera (Incubating)
What: Work easily with AtomWhere: http://incubator.apache.org/abdera/License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 3
Apache Abdera (Incubating)Parser parser = Abdera.getNewParser();URI uri = new URI("http://example.org/feed.xml");InputStream in = uri.toURL().openStream();
Document<Feed> doc = Abdera.getNewParser() .parse(in, uri); Feed feed = doc.getRoot();for (Entry entry : feed.getEntries()) { URI id = entry.getId(); String title = entry.getTitle(); // ...}
2008 JavaOneSM Conference | Session XXXX | 4
LL(k) / LL(*) Parser GeneratorANTLR
What: Parse stuff, build an interpreter, more!Where: http://www.antlr.orgLicense: BSD License
2008 JavaOneSM Conference | Session XXXX | 5
grammar Expr;
@header {import java.util.HashMap;}@members { HashMap memory = new HashMap(); }
prog: stat+ ; stat: expr NEWLINE {System.out.println($expr.value);} | ID '=' expr NEWLINE {memory.put($ID.text, new Integer($expr.value));} | NEWLINE;expr returns [int value] : e=multExpr {$value = $e.value;} ('+' e=multExpr {$value += $e.value;} | '-' e=multExpr {$value -= $e.value;})*;
multExpr returns [int value] : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*;
atom returns [int value] : INT {$value = Integer.parseInt($INT.text);} | ID { Integer v = (Integer)memory.get($ID.text); if ( v!=null ) $value = v.intValue(); } | '(' expr ')' {$value = $expr.value;};
ID : ('a'..'z'|'A'..'Z')+ ;INT : '0'..'9'+ ; NEWLINE:'\r'? '\n' ; WS : (' '|'\t')+ {skip();} ;
2008 JavaOneSM Conference | Session XXXX | 6
ANTLR
ANTLRInputStream input = new ANTLRInputStream(System.in); ExprLexer lexer = new ExprLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ExprParser parser = new ExprParser(tokens); parser.prog();
2008 JavaOneSM Conference | Session XXXX | 7
Directories made simpleApacheDS
What:Full-fledged yet lightweight LDAP server
Where: http://directory.apache.org/apacheds/
License: Apache License
2008 JavaOneSM Conference | Session XXXX | 8
ApacheDS embedded
MutableServerStartupConfiguration cfg = new MutableServerStartupConfiguration(); cfg.setWorkingDirectory(new File( System.getProperty("java.io.tmpdir")));
// Setup LDAP networking cfg.setEnableNetworking(true); cfg.setLdapPort(10389); cfg.setAllowAnonymousAccess(false); cfg.setAccessControlEnabled(false);
// Start the Server Hashtable env = EnvHelper.createEnv(); env.putAll(cfg.toJndiEnvironment()); new InitialDirContext(env);
2008 JavaOneSM Conference | Session XXXX | 9
ApacheDS for Unit Tests
public class DemoTest extends AbstractServerTest{ /** * Initialize the server. */ public void setUp() throws Exception { super.setUp(); }
/** * Shutdown the server. */ public void tearDown() throws Exception { super.tearDown(); }}
2008 JavaOneSM Conference | Session XXXX | 10
Small, Efficient, Fast Bytecode ManipulationASM
What: Fast manipulation of bytecodeWhere: http://asm.objectweb.orgLicense: BSD License
2008 JavaOneSM Conference | Session XXXX | 11
ASMClassWriter cw = new ClassWriter(0); cw.visit(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, "pkg/Comparable", null, "java/lang/Object", new String[] { "pkg/Measurable" }); cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "LESS", "I", null, new Integer(-1)).visitEnd(); cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "EQUAL", "I", null, new Integer(0)).visitEnd(); cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "GREATER", "I", null, new Integer(1)).visitEnd(); cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "compareTo", "(Ljava/lang/Object;)I", null, null).visitEnd(); cw.visitEnd(); byte[] b = cw.toByteArray();
2008 JavaOneSM Conference | Session XXXX | 12
High Level Bytecode Generation LibraryCGLIB
What:Another bytecode manipulation tool (built on ASM, higher level)
Where: http://cglib.sf.net/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 13
CGLIBEnhancer e = new Enhancer();e.setSuperclass(Foo.class);e.setCallback(new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.printf("%s has been invoked!", method.getName()); return proxy.invoke(obj, args); }});Foo foo = (Foo) e.create();foo.bar();
2008 JavaOneSM Conference | Session XXXX | 14
Expressions, againJexl
What:Easily embeddable expression language
Where:http://jakarta.apache.org/commons-jexl
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 15
Jexl: Code Samplepublic void testJexl() throws Exception { JexlContext context = JexlHelper.createContext(); context.getVars().put("projects", new ProjectList().getProjects()); Expression exp = ExpressionFactory.createExpression( "projects.get(1).getName()"); assertEquals("Rhino", exp.evaluate(context)); Expression countExp = ExpressionFactory.createExpression( "projects.size()"); assertEquals(3, countExp.evaluate(context)); Expression addExp = ExpressionFactory.createExpression( "projects.size() + 1"); assertEquals(4L, addExp.evaluate(context)); }
2008 JavaOneSM Conference | Session XXXX | 16
Tables made easy!DisplayTag
What:Nifty JSP taglib for table formatting & exporting
Where: http://displaytag.sourceforge.net/
License: Artistic License
2008 JavaOneSM Conference | Session XXXX | 17
DisplayTag: Code Sample
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %><%@ page import="it.rabellino.scrapbook.javaone.DisplayTagList" %> <% request.setAttribute( "test", new DisplayTagList().getProjects() ); %>
<html> <display:table name="test"/></html>
2008 JavaOneSM Conference | Session XXXX | 18
In-Memory and Replicated CacheEHCache
What: Easy Caching for everyone!
Where: http://ehcache.sourceforge.net/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 19
EHCache
CacheManager manager = new CacheManager("config.xml");Cache cache = manager.getCache("cache-one");
Element element = new Element("name", "Ugo");cache.put(element);
Element name = cache.get("name");System.out.println(name.getValue();
2008 JavaOneSM Conference | Session XXXX | 20
Embedded Java CompilerJanino
What: Embedded Java Compiler
Where: http://www.janino.net/
License: BSD License
2008 JavaOneSM Conference | Session XXXX | 21
Janino
String java = “System.out.println(s);”;ScriptEvaluator e = new ScriptEvaluator(java)
e.setParameters(new String[] {”s"}, new Class[] {String.class});
e.evaluate("hello world");
2008 JavaOneSM Conference | Session XXXX | 22
Sledgehammering the jar hellJarJar links
What:Repackaging and embedding tool for Java
Where: http://code.google.com/p/jarjar/License: GPL
2008 JavaOneSM Conference | Session XXXX | 23
JarJar links: Code Sample <taskdef name="jarjar” classname="com.tonicsystems.jarjar.JarJarTask” classpath="lib/build/jarjar-0.7.jar"/> <jarjar jarfile="build/jdbi-${version}.jar"> <fileset dir="build/classes"> <include name="**/*.class"/> </fileset> <zipfileset src="lib/build/antlr-2.7.7.jar"/> <rule pattern="antlr.**” result="org.skife.jdbi.antlr.@1" /> </jarjar>
2008 JavaOneSM Conference | Session XXXX | 24
JDBC Convenience Library (not Abstraction!)jDBI
What: Improves your JDBC experience!
Where: http://jdbi.codehaus.org/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 25
jDBIHandle h = new DBI("jdbc:derby:/tmp/test").open();
String q = "select name from person where age > :age";
List<String> rs = h.createQuery(q) .bind("age", 21) .map(StringMapper.FIRST) .list();
for (String name : rs) { System.out.printf("Hello, %s", name\n");}
h.close();
2008 JavaOneSM Conference | Session XXXX | 26
Lightweight, yet lightning fast web/app serverJetty
What: Web server / Servlet container
Where: http://jetty.mortbay.org/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 27
Jetty: Code SampleHandler handler = new AbstractHandler() { public void handle(String target, HttpServletRequest req, HttpServletResponse res, int dispatch) throws IOException, ServletException { File f = new File(DOCUMENT_ROOT + target); if (f.exists() && f.isFile()) { res.setStatus(HttpServletResponse.SC_OK); OutputStream output = res.getOutputStream(); FileInputStream input = new FileInputStream(f); byte[] buffer = new byte[4096]; int length = 0; while ((length = input.read(buffer)) > -1) { output.write(buffer, 0, length); } } else { res.setStatus(HttpServletResponse.SC_NOT_FOUND); } ((Request) req).setHandled(true); }};Server server = new Server(9999);server.setHandler(handler);server.start();
2008 JavaOneSM Conference | Session XXXX | 28
Date & Time that doesn’t suckJoda Time
What: JAVA -> JSON -> JAVA
Where: http://joda-time.sourceforge.net/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 29
Joda Time
public boolean isAfterPayDay(DateTime datetime) { if (datetime.getMonthOfYear() == 2) { return datetime.getDayOfMonth() > 26; } return datetime.getDayOfMonth() > 28;}
public Days daysToNewYear(LocalDate fromDate) { LocalDate newYear = fromDate.plusYears(1) .withDayOfYear(1); return Days.daysBetween(fromDate, newYear);}
2008 JavaOneSM Conference | Session XXXX | 30
Joda Time
public boolean isRentalOverdue(DateTime datetimeRented) { Period rentalPeriod = new Period() .withDays(2) .withHours(12); return datetimeRented .plus(rentalPeriod) .isBeforeNow();}
public String getBirthMonthText(LocalDate dateOfBirth) { return dateOfBirth.monthOfYear() .getAsText(Locale.ENGLISH);}
2008 JavaOneSM Conference | Session XXXX | 31
Java2JSONJSON-lib
What: JAVA -> JSON -> JAVA
Where: http://json-lib.sourceforge.net/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 32
JSON-lib Code Sample
List list = new ArrayList(); list.add( "JSON" ); list.add( "1" ); list.add( "2.0" ); list.add( "true" ); JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( list ); assertEquals( "JSON", jsonArray.getString(0) ); assertEquals( 1, jsonArray.getInt(1) ); assertEquals( 2.0d, jsonArray.getDouble(2), 0d ); assertTrue( jsonArray.getBoolean(3) );
2008 JavaOneSM Conference | Session XXXX | 33
Math, Linear Algebra, Statistics...Commons Math
What: Java Math library
Where: http://commons.apache.org/math/
License: Apache License
2008 JavaOneSM Conference | Session XXXX | 34
Commons Math: Code Sample
// Get a DescriptiveStatistics instance // using factory methodDescriptiveStatistics stats = DescriptiveStatistics.newInstance();
// Add the data from the arrayfor( int i = 0; i < inputArray.length; i++) { stats.addValue(inputArray[i]);}
// Compute some statisticsdouble mean = stats.getMean();double std = stats.getStandardDeviation();double median = stats.getMedian();
2008 JavaOneSM Conference | Session XXXX | 35
Yes, you can test JavaMail!Mock Javamail
What: JavaMail mock infrastructure
Where: https://mock-javamail.dev.java.net/
License: CDDL
2008 JavaOneSM Conference | Session XXXX | 36
Mock Javamail: Code SampleMimeMessage msg = new MimeMessage();...msg.setRecipients(TO,"[email protected]");Transport.send(msg);
...
List<Message> inbox = Mailbox.get("[email protected]");
assertEquals(inbox.size(),1); // was the e-mail really sent
2008 JavaOneSM Conference | Session XXXX | 37
Not-Yet-Commons-SSL
What: Java SSL library
Where:http://juliusdavies.ca/commons-ssl/ssl.html
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 38
Not-Yet-Commons-SSL
File f = new File("/tmp/foo");FileOutputStream fout = new FileOutputStream(f);fout.write(OpenSSL.encrypt("aes256", "secret".toCharArray(), "hello world\n".getBytes("UTF-8")));fout.close();
Process p = Runtime.getRuntime().exec( "openssl enc -pass pass:secret -d -aes256 -a -in /tmp/foo");
System.out.print(IOUtils.toString(p.getInputStream()));
2008 JavaOneSM Conference | Session XXXX | 39
No more excuses for web testing.Selenium
What:HTML/JS, browser-based, test environment for webapps
Where:http://www.openqa.org/selenium
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 40
Selenium: Code Sample
selenium = new DefaultSelenium("localhost", 4444,"*firefox", URL);selenium.open("http://localhost:8888/samples/blocks/forms/form1");selenium.type("email:input", "[email protected]");selenium.select("fourchars:input", "label=a");selenium.click("N1002E_tab_1");selenium.type("number1:input", "2");selenium.waitForPageToLoad("30000");selenium.select("account:input", "label=2");selenium.type("contacts.1.firstname:input", "Ugo");selenium.click("//tr[3]/td[5]/span/a/img");selenium.waitForPopUp("window_", "30000");selenium.addSelection("drinks.unselected", "label=Hoegaarden");assertEquals("Exactly 2 item(s) should be selected.", selenium.getAlert());verifyTrue(selenium.isTextPresent("Second person has this firstname: Ugo"));
2008 JavaOneSM Conference | Session XXXX | 41
No more excuses for web testing. Really!Selenium IDE
What:Firefox extension providing recording and IDE capabilities to Selenium
Where:http://www.openqa.org/selenium
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 42
Selenium IDE: Code Sample
2008 JavaOneSM Conference | Session XXXX | 43
Read my lips: no more excuses!Selenium Maven plugin
What:Maven plugin integrating Selenium tests in the build cycle
Where:http://mojo.codehaus.org/selenium-maven-plugin/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 44
Selenium Maven plugin: Code Sample <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>selenium-maven-plugin</artifactId> <executions> <execution> <id>start-selenium</id> <phase>pre-integration-test</phase> <goals> <goal>start-server</goal> </goals> <configuration> <background>true</background> </configuration> </execution> </executions> </plugin>
2008 JavaOneSM Conference | Session XXXX | 45
Templates, templates, templatesSitemesh
What:Web page layout and decoration framework
Where: http://www.opensymphony.com/sitemesh
License:Opensymphony Software License(Apache 1.1 derived)
2008 JavaOneSM Conference | Session XXXX | 46
Sitemesh<%@ taglib uri="sitemesh-decorator"prefix="decorator" %><html> <head> <title> My Site - <decorator:title default="Welcome!" /> </title> <decorator:head /> </head> <body> <h1><decorator:title default="Welcome!" /></h1> <p><decorator:body /></p> <p><small> (<a href="?printable=true">printable version</a>) </small></p> </body></html>
2008 JavaOneSM Conference | Session XXXX | 47
XMPP/Jabber ClientSmack
What: Great Jabber client!
Where: http://igniterealtime.org/projects/smack/
License: Apache License 2.0
2008 JavaOneSM Conference | Session XXXX | 48
SmackConnectionConfiguration config = new ConnectionConfiguration("talk.google.com", 5222, "gmail.com");config.setSASLAuthenticationEnabled(false);XMPPConnection c = new XMPPConnection(config);c.connect();c.login(account, password);
Chat chat = c.getChatManager() .createChat("[email protected]", new MessageListener() { public void processMessage(Chat chat, Message msg) { System.out.println(msg.getBody()); }});
chat.sendMessage("Hello, Ugo!");
2008 JavaOneSM Conference | Session XXXX | 49
Super-easy Object/XML TranslationXStream
What: The easiest road to XML
Where: http://xstream.codehaus.org/
License: BSD License
2008 JavaOneSM Conference | Session XXXX | 50
XStreamXStream xstream = new XStream();xstream.alias("person", Person.class);xstream.alias("phonenumber", PhoneNumber.class);
Person joe = new Person("Joe", "Walnes");joe.setPhone(new PhoneNumber(123, "1234-456"));joe.setFax(new PhoneNumber(123, "9999-999"));
String xml = xstream.toXML(joe);
// ...
Person new_joe = (Person)xstream.fromXML(xml);
2008 JavaOneSM Conference | Session XXXX | 51
XStream<person> <firstname>Joe</firstname> <lastname>Walnes</lastname> <phone> <code>123</code> <number>1234-456</number> </phone> <fax> <code>123</code> <number>9999-999</number> </fax></person>
2008 JavaOneSM Conference | Session XXXX | 52
Swiss-army knife of templatingStringTemplate
What:String templating from the ANTLR guy (Terence Parr)
Where: http://www.stringtemplate.org
License: BSD
2008 JavaOneSM Conference | Session XXXX | 53
StringTemplate: Code Samplepublic void testStringTemplate() throws Exception { StringTemplate hello = new StringTemplate("Hello, $name$"); hello.setAttribute("name", "World"); assertEquals("Hello, World", hello.toString()); StringTemplateGroup supergroup = new StringTemplateGroup("super"); StringTemplateGroup subgroup = new StringTemplateGroup("sub"); supergroup.defineTemplate("bold", "<b>$it$</b>"); subgroup.setSuperGroup(supergroup); StringTemplate st = new StringTemplate(subgroup, "$name:bold()$"); st.setAttribute("name", "Ugo"); assertEquals("<b>Ugo</b>", st.toString()); }
2008 JavaOneSM Conference | Session XXXX | 54
Because you’ve got dependenciesIvy
What:Powerful, controlled dependency management
Where: http://ant.apache.org/ivy/
License: Apache License
2008 JavaOneSM Conference | Session XXXX | 55
ivy.xml
<ivy-module version="2.0"> <info organisation="apache" module="hello-ivy"/> <dependencies> <dependency org="commons-lang" name="commons-lang" rev="2.0"/> <dependency org="commons-cli" name="commons-cli" rev="1.0"/> </dependencies></ivy-module>
2008 JavaOneSM Conference | Session XXXX | 56
build.xml<project xmlns:ivy="antlib:org.apache.ivy.ant" name="hello-ivy" default="run"> ... <!-- ================================= target: resolve ================================= --> <target name="resolve" description="--> retrieve dependencies with ivy"> <ivy:retrieve /> </target></project>
2008 JavaOneSM Conference | Session XXXX | 57
Jetty for SMTPSubEthaSMTP
What: Java SMTP server
Where: http://subethasmtp.tigris.org/
License: Apache License
2008 JavaOneSM Conference | Session XXXX | 58
List<MessageListener> listeners = new ArrayList<MessageListener>();listeners.add(myListener);SMTPServer smtpServer = new SMTPServer(listeners);smtpServer.start();
public interface MessageListener{ public boolean accept(String from, String recipient);
public void deliver(String from, String recipient, InputStream data) throws TooMuchDataException, IOException;}
2008 JavaOneSM Conference | Session XXXX | 59
ETL doesn’t have to be a painScriptella
What: Very simple yet powerful ETL tool
Where: http://scriptella.javaforge.com/
License: Apache License
2008 JavaOneSM Conference | Session XXXX | 60
etl.xml <etl> <connection id="db1" url="jdbc:database1:sample" user="sa" password="" classpath="external.jar"/> <connection id="db2" url="jdbc:database2:sample" user="sa" password=""/> <query connection-id="db1"> <!-- Select product from software category in db1--> SELECT * FROM Product WHERE category='software'; <!-- for each row execute a script --> <script connection-id="db2"> <!-- Insert all selected products to db2 use ? to reference properties,
columns or ?{expressions}-->
INSERT INTO Product(id, category, product_name) values (?id, ?{category}, ?name); </script> </query> </etl>
2008 JavaOneSM Conference | Session XXXX | 61
Funky! <query connection-id="db">
SELECT * FROM Table_In
<script connection-id="log">
Transforming $Error_Code
</script>
<!-- Transformation is described as an enclosing query
which is executed before nested elements -->
<query connection-id="js">
<![CDATA[
if (Error_Code < 5) {
Error_Code='WARNING'; //Set a transformed value
} else {
Error_Code='ERROR'; //Set a transformed value
}
query.next(); //Don't forget to trigger nested scripts execution
]]>
<script connection-id="db">
<!-- Insert transformed value -->
INSERT INTO Table_Out VALUES (?Error_Code);
</script>
</query>
</query>
2008 JavaOneSM Conference | Session XXXX | 62
Be unique!UUID
What: Alternate UUID/GUUID implementation
Where:http://johannburkard.de/software/uuid/
License: MIT License
2008 JavaOneSM Conference | Session XXXX | 63
Collections, capsule hotel sizeCommons Primitives
What: Specific, space saving, collection implementations for primitives
Where: http://commons.apache.org/primitives
License: Apache License
2008 JavaOneSM Conference | Session XXXX |
Memory savings
64
Object-based Collection
Bytes per Element
Primitive Collection
Bytes per Element
Space Savings
ArrayList of Bytes 16 ArrayByteList 1 93.40%ArrayList of Shorts 16 ArrayShortList 2 87.50%ArrayList of Characters 16 ArrayCharList 4 75%ArrayList of Floats 16 ArrayFloatList 4 75%ArrayList of Integers 16 ArrayIntist 4 75%ArrayList of Doubles 16 ArrayDoubleList 8 50%ArrayList of Longs 16 ArrayLongList 8 50%
2008 JavaOneSM Conference | Session XXXX | 65
Best thing since sliced breadMaven Jetty plugin
What: Jetty plugin for webapp development
Where: http://jetty.mortbay.org/License: Apache License 2.0
Bonus:http://docs.codehaus.org/display/JETTY/Ant+Jetty+Plugin
2008 JavaOneSM Conference | Session XXXX | 66
Maven Jetty: Code Sample <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.1</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.BlockingChannelConnector"> <port>8890</port> <maxIdleTime>60000</maxIdleTime> </connector> </connectors> <scanIntervalSeconds>1</scanIntervalSeconds> <contextPath>/</contextPath> <webAppSourceDirectory>src/main/webapp</webAppSourceDirectory> </configuration> </plugin>
2008 JavaOneSM Conference | Session XXXX | 67
Great Image ManipulationJMagick
What: JNI Wrapper on ImageMagick
Where: http://www.yeo.id.au/jmagick
License: LGPL
2008 JavaOneSM Conference | Session XXXX | 68
JMagickImageInfo info = new ImageInfo();
MagickImage image = new MagickImage(new ImageInfo("testpic.jpg"));
MagickImage bigger = image.scaleImage(1200, 900);
bigger.setFileName("bigger.jpg");bigger.writeImage(info);
2008 JavaOneSM Conference | Session XXXX | 69
Web 2.0, baby!Mozilla Rhino
What: Embedded Javascript engine
Where: http://www.mozilla.org/rhino/
License: MPL/GPL
2008 JavaOneSM Conference | Session XXXX | 70
Rhino: Code Sample public void actionPerformed(ActionEvent click) { String js = code.getText(); Context context = Context.enter(); ScriptableObject scope = context.initStandardObjects(); try { Object result = context.evaluateString(scope, js, ”code", 1, null); output.setText( Context.toString(result)); } catch (EcmaError e) { output.setText(e.toString()); } }
2008 JavaOneSM Conference | Session XXXX | 71
XML done right?XOM
What: A “different” XML Object Model
Where: http://www.xom.nu
License: LGPL
2008 JavaOneSM Conference | Session XXXX | 72
XOM: Code Sample
public void testXOM() throws Exception { Builder builder = new Builder(); Document pom = builder.build(new File("pom.xml")); // System.out.print(pom.toXML()); XPathContext context = new XPathContext("maven", "http://maven.apache.org/POM/4.0.0"); assertEquals(13, pom.query("//maven:dependency", context).size()); }
2008 JavaOneSM Conference | java.com.sun/javaone | 73
Q&A, and your turn!