18
www.ow2.org OW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris OW2 UTILITIES The Swiss Army Knife Of OW2 Projects Guillaume Sauthier 1

Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

Embed Size (px)

Citation preview

Page 1: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

OW2 UTILITIESThe Swiss Army Knife Of OW2 Projects

Guillaume Sauthier

1

Page 2: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

Because����������� ������������������  code����������� ������������������  should����������� ������������������  be����������� ������������������  written����������� ������������������  only����������� ������������������  onceBecause����������� ������������������  code����������� ������������������  should����������� ������������������  be����������� ������������������  well����������� ������������������  tested

Because����������� ������������������  code����������� ������������������  should����������� ������������������  be����������� ������������������  shared

OW2 Utilities

2

Page 3: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

How����������� ������������������  did����������� ������������������  we����������� ������������������  get����������� ������������������  there����������� ������������������  ?

Genesis

3

Page 4: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

A LITTLE BIT OF HISTORY

•Was born in 2006 inside the OW2 EasyBeans project

•Used in JOnAS, CAROL, CMI, EasyBeans, Shelbie, JASMINe for years

•Extracted as a separate maven project in 2008

•More than 35 releases up to today !

• Proposed as top level OW2 project in 2012

•We’re here now :)

4

Page 5: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

15����������� ������������������  minutes����������� ������������������  is����������� ������������������  so����������� ������������������  short,����������� ������������������  and����������� ������������������  we����������� ������������������  have����������� ������������������  so����������� ������������������  many����������� ������������������  modules

Modules

5

Page 6: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

QUITE BASIC STUFF

• I18n and Logger

• Internationalized loggers, Java 5 style

•Xml parsing

• Obtain a DocumentParser, extract values from Elements (trimmed, Properties, default values, ...)

•Xml Config

• Simple Java/Xml mapper (read your Xml configuration files)

•Base64

• Encode, decode

• File/URL conversion

•Classloader aware ObjectInputStream

6

Just����������� ������������������  to����������� ������������������  be����������� ������������������  mentioned

Page 7: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

ANNOTATION PROCESSOR

•Traverse Class, Method and Field declaration

• Support inheritance

•Call interested AnnotationHandler(s)

7

Want����������� ������������������  a����������� ������������������  nice����������� ������������������  way����������� ������������������  to����������� ������������������  visit����������� ������������������  annotations����������� ������������������  of����������� ������������������  an����������� ������������������  instance����������� ������������������  ?

IAnnotationProcessor processor = new DefaultAnnotationProcessor();processor.addAnnotationHandler(new SampleAnnotationHandler());processor.addAnnotationHandler(/* as many handler as you want */);processor.process(/* some instance */);

public class SampleAnnotationHandler extends AbstractAnnotationHandler {

public boolean isSupported(Class<? extends Annotation> clazz) { return clazz.equals(Hello.class); }

@Override public void process(Annotation annotation, Class<?> clazz, Object target) throws ProcessorException { System.out.printf("Type %s is annotated with @%s(%s)", clazz, annotation.annotationType().getSimpleName() ((Hello) annotation).name()); }}

Page 8: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

EVENT SYSTEM

•On steroid topic notification system

• Hierarchical, multi-threaded

•Dispatcher fires event on a topic

•Listeners receive events matching a topic pattern

• Declares a priority (SYNC, ASYNC)

8

AsynchronousSupport

// Simple asynchronous listenerIEventListener listener = new IEventListener() { public void handle(IEvent event) { // Do your own casting here System.out.printf("Received Event %s", event); } public EventPriority getPriority() { return EventPriority.ASYNC_HIGH; } public boolean accept(IEvent event) { return true; }};

Page 9: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

EVENT SYSTEM

9

Some����������� ������������������  code

Event Service

/c

/a

/a/b

Dispatchers Event ListenersLoose CouplingAsynchronous

Even

t Sou

rce(

s)

Cons

umer

(s)

// Create a DispatcherEventDispatcher dispatcher = new EventDispatcher();dispatcher.setNbWorkers(3);dispatcher.start(); // Topic registrationeventService.registerDispatcher("/result/success", dispatcher);

// Listen to all Event published in /result/**eventService.registerListener(listener, "/result/.*");

// Dispatch an Eventdispatcher.dispatch(new MyEvent("/result/.*"));

Page 10: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

POOL

• Simple Pooling API

• Pool size, waiters, timeout

• Thread-safe

• Basic implementation

• Synchronous

• Advanced implementation

• Asynchronous, composable

10

Re-usinginstances

public static void main(String[] args) throws Exception { PoolFactory<Pooled, Long> poolFactory = new PooledFactory(); JPool<Pooled,Long> pool = new JPool<Pooled, Long>(poolFactory); pool.start(); Pooled one = pool.get(); Pooled two = pool.get(); Pooled three = pool.get(); Pooled four = pool.get(); // Will block until timeout or a release}private static final class PooledFactory implements PoolFactory<Pooled, Long> { public Pooled create(Long clue) throws PoolException { return new Pooled(clue); } public boolean isMatching(Pooled instance, Long clue) { return instance.id == clue; } public void remove(Pooled instance) { // Destroy instance } public boolean validate(Pooled instance, PoolEntryStatistics stats) { return true; }}

@Pool(min = 1, max = 3)private static class Pooled { long id; public Pooled(Long clue) { id = clue; }}

Page 11: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

SUBSTITUTION

•Extract variables declaration from String

• ‘Hello ${speaker.name} !’

•PropertyResolvers

• Provides value for expression

• Composable

• Support recursion (variables in variable)

11

Variableprocessing

DefaultSubstitutionEngine engine = new DefaultSubstitutionEngine();ChainedResolver chain = new ChainedResolver();chain.getResolvers().add(new SpeakerResolver());chain.getResolvers().add(new DateResolver());engine.setResolver(chain);engine.substitute("Hello ${speaker.name} ! -- ${date}");

public class SpeakerResolver implements IPropertyResolver { public String resolve(String expression) { return "speaker.name".equals(expression) ? "Guillaume" : null; }}

public class DateResolver implements IPropertyResolver { public String resolve(String expression) { return "date".equals(expression) ? (new Date()).toString() : null; }}

Page 12: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

ARCHIVE

•Uniform API for resource consumption

•Supporting (out of the box)

• Directory

• Jar

• OSGi Bundle

•Extensible

12

ResourceAbstraction

public interface IArchive {

String getName();

URL getURL() throws ArchiveException;

URL getResource(String resourceName) throws ArchiveException;

Iterator<URL> getResources() throws ArchiveException;

Iterator<URL> getResources(String resourceName) throws ArchiveException;

Iterator<String> getEntries() throws ArchiveException;

boolean close();

IArchiveMetadata getMetadata();

}

Page 13: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

BUNDLES, BUNDLES, BUNDLES

•Around 20 common libraries wrapped as Bundles

• commons-{collections, logging, modeler}, javassist, jaxb2-ri, jgroups, jsch, opencsv, weld, zookeeper, bouncycastle, ...

• Correct exported packages version, verified imports

•All other modules are OSGi Bundles

• Versioned API, content exported

13

Page 14: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

What����������� ������������������  about����������� ������������������  you����������� ������������������  ?

Contributions

14

Page 15: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

ANONYMOUS QUOTES

15

http://gitorious.ow2.org/ow2-utilities‘I����������� ������������������  want����������� ������������������  to����������� ������������������  code,����������� ������������������  where����������� ������������������  are����������� ������������������  the����������� ������������������  repositories����������� ������������������  ?’

‘You����������� ������������������  convinced����������� ������������������  me,����������� ������������������  let����������� ������������������  me����������� ������������������  write����������� ������������������  some����������� ������������������  documentation’http://utilities.ow2.org

‘Wow,����������� ������������������  they����������� ������������������  even����������� ������������������  have����������� ������������������  a����������� ������������������  Bamboo����������� ������������������  for����������� ������������������  CI’http://bamboo.ow2.org/browse/UTIL

‘Do����������� ������������������  they����������� ������������������  really����������� ������������������  need����������� ������������������  a����������� ������������������  JIRA,����������� ������������������  it’s����������� ������������������  working����������� ������������������  so����������� ������������������  great����������� ������������������  !’http://jira.ow2.org/browse/UTIL

Page 16: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

Questions

16

Page 18: Ow2 Utilities - The Swiss Army Knife Of Ow2 Projects

www.ow2.orgOW2 Annual Conference 2012, 27-29 November, Orange Labs, Paris

RESOURCES

•http://www.flickr.com/photos/emagic/56206868/

18