Floggy-M3DD-2009-01-21

25
Java ME persistence made easy! by Thiago Rossato Thiago Moreira

description

Presentation used on the M3DD conference in Santa Clara, CA

Transcript of Floggy-M3DD-2009-01-21

Page 1: Floggy-M3DD-2009-01-21

Java ME persistence made easy!by

Thiago RossatoThiago Moreira

Page 2: Floggy-M3DD-2009-01-21

About Us• Thiago Moreira

– Works with …• Java since 2001• Java ME since 2002

– SCJP, SCMAD, SCDJWS and SCDBC• Thiago Rossato

– Works with …• Java since 1999• Java ME since 2002

– SCJP and SCMAD• Priscila Lugon

– Works with …• Java ME since 2004

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 2

Page 3: Floggy-M3DD-2009-01-21

About Floggy

• What is Floggy?– Floggy is a 100% object-oriented open source

persistence framework for Java ME / MIDP applications.

– Floggy allows developers to work with high-level persistence commands.

• What Floggy is not?– A database for Java ME applications.

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 3

Page 4: Floggy-M3DD-2009-01-21

RMS and JSR-75

• How to store data when developing MIDP applications?– RMS (Record Management System)• Implementation is mandatory: in most cases is the only

option.

– JSR 75 adds file system support• Implementation is optional: not all devices support this

JSR.

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 4

Page 5: Floggy-M3DD-2009-01-21

RMS

• Supported by all MIDP devices• Simple and functional API• Modeled after a simple record-oriented

database• Data is manipulated as byte arrays

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 5

Page 6: Floggy-M3DD-2009-01-21

Sample using RMS

public class Person { private String name;private Date birthday;private char gender;

(...)}

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 6

Page 7: Floggy-M3DD-2009-01-21

Sample using RMSpublic Person load(int id) {

Person p;

try {RecordStore rs = RecordStore.openRecordStore(“Person”, true);byte[] data = rs.getRecord(id);ByteArrayInputStream bais = new ByteArrayInputStream(data);DataInputStream dis = new DataInputStream(bais);

try {p = new Person();p.setName(dis.readUTF());p.setBirthday(new Date(dis.readLong()));p.setGender(dis.readChar());dis.close();

} catch (IOException e) {}

rs.closeRecordStore();} catch (RecordStoreException e) {}

return p;}

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 7

Page 8: Floggy-M3DD-2009-01-21

Sample using RMSpublic void save(Person p) {

byte[] data = null;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

DataOutputStream dos = new DataOutputStream(baos);

try {

dos.writeUTF(p.getName());

dos.writeLong(p.getBirthday().getTime());

dos.writeChar(p.getGender());

data = baos.toByteArray();

dos.close();

} catch (IOException e) {}

RecordStore rs = null;

try {

rs = RecordStore.openRecordStore(“Person”, true);

int id = rs.addRecord(data, 0, data.length);

rs.closeRecordStore();

} catch (RecordStoreException e) {}

}

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 8

Page 9: Floggy-M3DD-2009-01-21

How Floggy works?

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 9

Page 10: Floggy-M3DD-2009-01-21

Structure• Package net.sourceforge.floggy.persistence• Persistence– Persistable– PersistableManager

• Search– ObjsetSet– Filter– Comparator

• Exception– FloggyException

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 10

Page 11: Floggy-M3DD-2009-01-21

IDEs

• Eclipse– Floggy Eclipse Plugin

• Netbeans• Ant• Maven• Command Line

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 11

Page 12: Floggy-M3DD-2009-01-21

import net.sourceforge.floggy.persistence.Persistable;

public class Person implements Persistable {

private String name;

private Date birthday;

private char gender;

private Phone[] phones;

private transient int age;

public static int SOME_STATIC_FIELD = 1;

(...)

}

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 12

Entity Person

Page 13: Floggy-M3DD-2009-01-21

import net.sourceforge.floggy.persistence.Persistable;

public class Person implements Persistable {

private String name;

private Date birthday;

private char gender;

private Phone[] phones;

private transient int age;

public static int SOME_STATIC_FIELD = 1;

(...)

}

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 13

Entity Person

The markup interface identifies the

persistable classes.

Page 14: Floggy-M3DD-2009-01-21

import net.sourceforge.floggy.persistence.Persistable;

public class Person implements Persistable {

private String name;

private Date birthday;

private char gender;

private Phone[] phones;

private transient int age;

public static int SOME_STATIC_FIELD = 1;

(...)

}

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 14

Entity Person

Transient and static field aren’t persisted.

Page 15: Floggy-M3DD-2009-01-21

import net.sourceforge.floggy.persistence.Persistable;

public class Phone implements Persistable {

private String number;

private String extension;

private int type; // Mobile, Home, Work, etc

(...)

}

15

Entity Phone

15 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 16: Floggy-M3DD-2009-01-21

SavingPerson p = new Person();p.setName(...);p.setBirthday(...);p.setGender(...);p.setPhones(...);

try {

int id = PersistableManager.getInstance().save(p);

} catch (FloggyException e) {(...)

}

16 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 17: Floggy-M3DD-2009-01-21

SavingPerson p = new Person();p.setName(...);p.setBirthday(...);p.setGender(...);p.setPhones(...);

try {

int id = PersistableManager.getInstance().save(p);

} catch (FloggyException e) {(...)

}

An unique ID is returned after saving

an object.

17 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 18: Floggy-M3DD-2009-01-21

Editing and savingPerson person = new Person();

try {

PersistableManager.getInstance().load(person, id);

person.setName(...);

id = PersistableManager.getInstance().save(person);

} catch (FloggyException e) {(...)

}

18 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 19: Floggy-M3DD-2009-01-21

Editing and savingPerson person = new Person();

try {

PersistableManager.getInstance().load(person, id);

person.setName(...);

id = PersistableManager.getInstance().save(person);

} catch (FloggyException e) {(...)

}

Use the unique ID to load an object.

19 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 20: Floggy-M3DD-2009-01-21

ListingPersistableManager pm = PersistableManager.getInstance();ObjectSet persons = pm.find(Person.class, null, null);for (int i = 0; i < persons.size(); i++) { Person p = (Person) persons.get(i); (...)}

An optimized way ...

Person person = new Person();PersistableManager pm = PersistableManager.getInstance();ObjectSet persons = pm.find(Person.class, null, null);for (int i = 0; i < persons.size(); i++) { persons.get(i, person); (...)}

20 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 21: Floggy-M3DD-2009-01-21

Filteringpublic class MaleFilter implements net.sourceforge.floggy.persistence.Filter {

public boolean matches(Persistable persistable) { Person p = (Person) persistable; return p.getGender() == 'M'; }}

(...)

ObjectSet persons = pm.find(Person.class, new MaleFilter(), null);

for (int i = 0; i < persons.size(); i++) { Person p = (Person) persons.get(i); (...)}

21 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 22: Floggy-M3DD-2009-01-21

Orderingpublic class AgeComparator implements net.sourceforge.floggy.persistence.Comparator {

public int compare(Persistable o1, Persistable o2) { Person p1 = (Person) o1; Person p2 = (Person) o2; if (p1.getBirthday().getTime() < p2.getBirthday().getTime()) {

return PRECEDES;}

if (p1.getBirthday().getTime() > p2.getBirthday().getTime()) {

return FOLLOWS; }

return EQUIVALENT;}

}

ObjectSet persons = pm.find(Person.class, null, new AgeCompator());

22 Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you!

Page 23: Floggy-M3DD-2009-01-21

Removing operations

• Removing a single objecttry {

PersistableManager.getInstance().delete(person);} catch (FloggyException e) {}

• Removing all objects of a specified classtry {

PersistableManager.getInstance().deleteAll(Person.class);} catch (FloggyException e) {}

• Removing all objectstry {

PersistableManager.getInstance().deleteAll();

} catch (FloggyException e) {}

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 23

Page 24: Floggy-M3DD-2009-01-21

Information

• Site– Documentation– Roadmap– FAQ

• Mailing lists at SF.net– [email protected]

• Tracker at SF.net– Bugs– Feature requests

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 24

Page 25: Floggy-M3DD-2009-01-21

Now you don't need to write hundred of lines of persistence code anymore. Floggy will do the dirty work for you! 25

Thanks!

http://floggy.org