73
The Long Tail treasure trove Brian McCallister Ning http://www.ning.com Gianugo Rabellino Sourcesense http://www.sourcesense.com

Long Tail Treasure Trove

Embed Size (px)

DESCRIPTION

30 Open Source projects in 50 minutes!

Citation preview

Page 1: Long Tail Treasure Trove

The Long Tail treasure trove

Brian McCallister

Ninghttp://www.ning.com

Gianugo Rabellino

Sourcesensehttp://www.sourcesense.com

Page 2: Long Tail Treasure Trove

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

Page 3: Long Tail Treasure Trove

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(); // ...}

Page 4: Long Tail Treasure Trove

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

Page 5: Long Tail Treasure Trove

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

Page 6: Long Tail Treasure Trove

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

Page 7: Long Tail Treasure Trove

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

Page 8: Long Tail Treasure Trove

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

Page 9: Long Tail Treasure Trove

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

Page 10: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 10

Small, Efficient, Fast Bytecode ManipulationASM

What: Fast manipulation of bytecodeWhere: http://asm.objectweb.orgLicense: BSD License

Page 11: Long Tail Treasure Trove

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

Page 12: Long Tail Treasure Trove

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

Page 13: Long Tail Treasure Trove

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

Page 14: Long Tail Treasure Trove

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

Page 15: Long Tail Treasure Trove

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

Page 16: Long Tail Treasure Trove

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

Page 17: Long Tail Treasure Trove

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>

Page 18: Long Tail Treasure Trove

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

Page 19: Long Tail Treasure Trove

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

Page 20: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 20

Embedded Java CompilerJanino

What: Embedded Java Compiler

Where: http://www.janino.net/

License: BSD License

Page 21: Long Tail Treasure Trove

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");

Page 22: Long Tail Treasure Trove

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

Page 23: Long Tail Treasure Trove

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>

Page 24: Long Tail Treasure Trove

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

Page 25: Long Tail Treasure Trove

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

Page 26: Long Tail Treasure Trove

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

Page 27: Long Tail Treasure Trove

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

Page 28: Long Tail Treasure Trove

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

Page 29: Long Tail Treasure Trove

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

Page 30: Long Tail Treasure Trove

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

Page 31: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 31

Java2JSONJSON-lib

What: JAVA -> JSON -> JAVA

Where: http://json-lib.sourceforge.net/

License: Apache License 2.0

Page 32: Long Tail Treasure Trove

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

Page 33: Long Tail Treasure Trove

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

Page 34: Long Tail Treasure Trove

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

Page 35: Long Tail Treasure Trove

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

Page 36: Long Tail Treasure Trove

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

Page 37: Long Tail Treasure Trove

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

Page 38: Long Tail Treasure Trove

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

Page 39: Long Tail Treasure Trove

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

Page 40: Long Tail Treasure Trove

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"));

Page 41: Long Tail Treasure Trove

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

Page 42: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 42

Selenium IDE: Code Sample

Page 43: Long Tail Treasure Trove

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

Page 44: Long Tail Treasure Trove

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>

Page 45: Long Tail Treasure Trove

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)

Page 46: Long Tail Treasure Trove

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>

Page 47: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 47

XMPP/Jabber ClientSmack

What: Great Jabber client!

Where: http://igniterealtime.org/projects/smack/

License: Apache License 2.0

Page 48: Long Tail Treasure Trove

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!");

Page 49: Long Tail Treasure Trove

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

Page 50: Long Tail Treasure Trove

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

Page 51: Long Tail Treasure Trove

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>

Page 52: Long Tail Treasure Trove

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

Page 53: Long Tail Treasure Trove

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

Page 54: Long Tail Treasure Trove

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

Page 55: Long Tail Treasure Trove

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>

Page 56: Long Tail Treasure Trove

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>

Page 57: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 57

Jetty for SMTPSubEthaSMTP

What: Java SMTP server

Where: http://subethasmtp.tigris.org/

License: Apache License

Page 58: Long Tail Treasure Trove

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

Page 59: Long Tail Treasure Trove

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

Page 60: Long Tail Treasure Trove

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>

Page 61: Long Tail Treasure Trove

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>

Page 62: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 62

Be unique!UUID

What: Alternate UUID/GUUID implementation

Where:http://johannburkard.de/software/uuid/

License: MIT License

Page 63: Long Tail Treasure Trove

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

Page 64: Long Tail Treasure Trove

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%

Page 65: Long Tail Treasure Trove

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

Page 66: Long Tail Treasure Trove

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>

Page 67: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 67

Great Image ManipulationJMagick

What: JNI Wrapper on ImageMagick

Where: http://www.yeo.id.au/jmagick

License: LGPL

Page 68: Long Tail Treasure Trove

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

Page 69: Long Tail Treasure Trove

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

Page 70: Long Tail Treasure Trove

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

Page 71: Long Tail Treasure Trove

2008 JavaOneSM Conference | Session XXXX | 71

XML done right?XOM

What: A “different” XML Object Model

Where: http://www.xom.nu

License: LGPL

Page 72: Long Tail Treasure Trove

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

Page 73: Long Tail Treasure Trove

2008 JavaOneSM Conference | java.com.sun/javaone | 73

Q&A, and your turn!