Archive for the 'Tools' category

FRF #02 – Morphia und MongoDB

Nov 07 2011 Published by under Development, eclipse, FRF, Java

Mit etwas Verspätung kommt nun der 2. Teil des FRF indem ich mich mit Morphia und MongoDB auseinander gesetzt habe. Die Einarbeitung in beide Themen hat doch mehr Zeit in Anspruch genommen als vermutet. Zudem hatte ich zu Beginn ein Paar Probleme, bis mein Maven und die MongoDB liefen (OSX spezifischer Natur).

Ziel

Das Ergebnis dieses Parts wird es sein, dass CRUD Prinzip mit Hilfe von Morphia in der MongoDB abzubilden. Dazu verwenden wir DAOs und POJOs, welche mit Morphia Annotationen versehen werden.

Das Wichtigste vorweg, MongoDB sollte gestartet sein. Dazu einfach den MongoDB Daemon starten (mongod).

Vorraussetzungen

Maven2 oder Maven3 installiert und konfiguriert. Des Weiteren sollte das m2eclipse Plugin installiert sein. Man sollte wissen wie man Maven einsetzt. Ich werde auf bestimmte Aspekte im Zusammenhang mit diesem Tutorial eingehen, aber es wird keine Einführung in Maven sein.

Ready, Steady, Go

Create & Configuring our Maven Project (Ready)

Zu Beginn sollte ein neues Maven Projekt erstellt werden. Als Archtype sollte maven-archtype-sample gewählt werden. Danach nur noch bei Artifact Id den Namen des Projektes eintragen und Projekt erstellen. Unter Umständen kann es sein, dass es als Java 1.5 Projekt angelegt wird, falls dies so sein sollte, einfach folgenden Absatz in die POM kopieren

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>

und dann Rechtsklick auf das Projekt -> Maven -> Update Project Configuration… Nun sollten etwaige Fehlermeldungen verschwinden. Wenn wir uns schon in der POM aufhalten, dann passen wir gleich die JUnit Version an und zwar nehmen wir die Aktuellste – 4.10. Ansonsten benötigen wir nur noch die Dependencies für Morphia und den MongoDB Java Driver.

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.morphia</groupId>
<artifactId>morphia</artifactId>
<version>0.99</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>com.google.code.morphia</groupId>
<artifactId>morphia-validation</artifactId>
<version>0.99</version>
</dependency>
</dependencies>

Damit Maven die Morphia Dependencies findet muss noch das Morphia Repository hinzugefügt werden.

<repositories>
<repository>
<id>morphia</id>
<url>http://morphia.googlecode.com/svn/mavenrepo/</url>
</repository>
</repositories>

POJOs & DAOs (Steady)

Da das grundlegende Maven-Setup nun steht kann es endlich losgehen. Wir benötigen 2 POJOs, POJO A referenziert POJO B, eine Singelton für den DB Zugriff, entsprechende DAOs.

The Singelton

Das Singelton-Pattern sollte jedem geläufig sein. Es bietet sich gerade dazu an für den Zugriff auf die MongoDB. Hierfür erstellen wir eine neue Klasse mit einem privaten Konstruktor in dem der Verbindungsaufbau zur DB abläuft. Ich nenne die Klasse MongoConnectionManager.java.

public class MongoConnectionManager {

private static final MongoConnectionManager INSTANCE = new MongoConnectionManager();
private final Datastore db;
public static final String DB_NAME = "personDB";
private MongoConnectionManager() {
try {
Mongo m = new Mongo("localhost", 27017);
db = new Morphia().map(Person.class).map(Company.class).createDatastore(m, DB_NAME);
db.ensureIndexes();
} catch (Exception e) {
throw new RuntimeException("Error initializing mongo db", e);
}
}

public static MongoConnectionManager getInstance() {
return INSTANCE;
}

public Datastore getDb() {
return db;
}
}

Was passiert hier? Wir stellen eine Verbindung auf die MongoDB mit Hilfe des MongoDB Java Drivers her. Als Parameter wird der Host und der entsprechende Port mitgeben.

Mongo m = new Mongo("localhost", 27017);

Die folgende Zeilen sind Morphia Spezifisch. Es werden unsere Entities (POJOs) registriert und die Tabelle (hier Datastore) in unserer Datenbank erstellt. Die Methode ensureIndexes(); erstellt synchron die Indexes und die gekapselten Collections für unsere Entities.

db = new Morphia().map(Person.class).map(Company.class).createDatastore(m, DB_NAME);
db.ensureIndexes();

The POJOs

In diesem Beispiel verwende ich 2 POJO Klassen, Person und Company. Jeder Person ist eine Company zugeordnet.

@Entity(value="persons", noClassnameStored=true)
public class Person {
@Id
private ObjectId id;
private String name;
private String surename;
private String Email;

@Reference
private Company company;

//Gettter/Setter
...
  • @Entity wird benötigt um mitzuteilen, dass diese Klasse als Entität verwendet werden soll. Morphia persistiert diese Klasse dann dementsprechend.
  • @Id wird im Zusammenhang mit der Klasse ObjectId verwendet. @Id sagt aus, dass dieses Attribut vom Typ ObjectId, bei fehlerfreien persistieren die entsprechende Id von der MongoDB zugewiesen bekommt.
  • @Reference stellt die Verbindung/Verknüpfung mit der Klasse Company dar.

Die wichtigsten Annotationen sind @Entity und @Id, die vorhanden sein müssen.


@Entity(value="companies", noClassnameStored=true)
public class Company {

@Id
private ObjectId id;
private String name;
private Long noEmployees;

//Getter/Setter
...

Die Klasse Company benötigt keine weiteren Morphia Annotationen außer @Enity und @Id.

The DAOs

Data Access Objekt was ist das? Hier lesen!

Use a Data Access Object (DAO) to abstract and encapsulate all access to the data source. The DAO manages the connection with the data source to obtain and store data.

Ich baue meine DAOs immer wie folgt auf, einmal das Interface EntityDAO und die Implementierung dazu EntityDAOImpl. In das Interface kommen die gewünschten Methoden zum Suchen, Erstellen, Löschen, … von Datensätzen.

public interface PersonDAO {
public Key<Person> save(Person person);
public Person findPerson(ObjectId personId);
public List<Person> findAllPersons();
public List<Person> findPersonsByCompany(Company company);
}

Nun erben wir u.a. von unseren oben erstellten Interface und programmieren unsere Methoden aus.

public class PersonDAOImpl extends BasicDAO<Person, ObjectId> implements PersonDAO {
public PersonDAOImpl(){
super(Person.class, MongoConnectionManager.getInstance().getDb());
}

@Override
public Person findPerson(ObjectId personId) {
return get(personId);
}

@Override
public List<Person> findAllPersons() {
return find().asList();
}

@Override
public List<Person> findPersonsByCompany(Company company) {
return createQuery().field("company").equal(company).asList();
}
}

Das war schon die ganze Zauberei. Nun sind wir soweit um unsere Anwendung zu testen.

Creating & Running JUnit Tests (Go)

Wir verwenden JUnit Tests um unsere Anwendung auf Funktionalität zu testen. Ist besser, sauberer und vor allem professioneller als eine Main Klasse zuschreiben und mit System.out.println(); zu arbeiten.

Dafür legen wir im Ordner src/test/java unterhalb des Packages eine neue JUnit Klasse an. Ich hab meine PersonDAOTest.java genannt.

Ich habe 2 Tests geschrieben, einen der prüft ob ein Datensatz persistiert wurde, der Andere versucht einen Datensatz zu finden.

Wichtig ist, dass die Companies bereits existieren (persistiert sind) wenn sie den Personen zugeordnet werden. Falls dies nicht der Fall ist, bricht der Test mit einer MappingException ab! Siehe Kommentar im Quellcode.


public class PersonDAOTest {

private PersonDAO personDAO;
private BasicDAO<Company, ObjectId> companyDAO;

private final Company ibm = new Company().withName("IBM").withNumberOfEmployees(Long.valueOf(426751));
private final Company samsung = new Company().withName("Samsung").withNumberOfEmployees(Long.valueOf(290000));

@Before
public void before() {
Util.drop();

personDAO = new PersonDAOImpl();
companyDAO = new BasicDAO<Company, ObjectId>(Company.class, MongoConnectionManager.getInstance().getDb());

/**
* "Pre" store the company, so that they will haven an objectId, otherwise it will throw new Mapping Exception
* see here for more information: http://code.google.com/p/morphia/issues/detail?id=315
*/

ArrayList<Company> arrList = new ArrayList<Company>();
arrList.add(ibm);
arrList.add(samsung);

for (Company c : arrList) {
companyDAO.save(c);
}
}

private Person createPerson(){
Person person = new Person();
person.setSurename("Sue");
person.setName("Walker");
person.setEmail("sue.walker@ibm.com");
person.withCompany(ibm);
personDAO.save(person);
return person;
}

@Test
public void testPersistance() {
Person person = createPerson();

assertNotNull("Saved Person Id", person.getId());
person = personDAO.findPerson(person.getId());
assertNotNull("Person retrieved", person);
}

@Test
public void query() {
createPerson();
List<Person> persons = personDAO.findPersonsByCompany(ibm);
assertTrue("Returned one Person" , persons.size() == 1);
persons = personDAO.findPersonsByCompany(samsung);
assertTrue("Nothing should returned" , persons.size() == 0);
}
}

Sobald die JUnit Klasse fertig gestellt wurde kann man mit

mvn test

die Tests ausführen.

Ich denke die Klasse ist recht selbsterklärend, falls doch Erklärungsbedarf  bestehen sollte, schreibts in die Kommentare ich werde es mit in den Artikel einfließen lassen.

Mit einem Administrationstool wie z.B. MongoHub (OSX) kann mit Hilfe einer grafischen Oberfläche nachgeschaut werden ob etwas persistiert wurde.

Comming Next …

Im nächsten Part versuche ich dem ganzen eine Oberfläche zu verpassen. Das Framework wird Vaadin sein. Es soll dann möglich sein neue Einträge hinzuzufügen, zu modifizieren und zu löschen mit Hilfe einer UI. Dort kommt dann der Tomcat noch mit ins Spiel.

Last But Not Least …

… habe ich noch ein paar Interessante Ressourcen zum Thema MongoDB und Morphia gefunden. Diese Links dienten als Quellen und Anhaltspunkte für diesen Artikel:
http://www.mongodb.org/display/DOCS/Quickstart
http://www.mongodb.org/display/DOCS/Admin+UIs
http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart
http://code.google.com/p/morphia/wiki/QuickStart
http://sleeplessinslc.blogspot.com/2010/10/mongodb-with-morphia-example.html
http://mongohub.todayclose.com/download

Das Projekt kann gezippt heruntergeladen werden. GitHub folgt!

Projekt Download

Version 0.2

2 responses so far

FRF #01 – Getting Started

Okt 05 2011 Published by under Development, eclipse, FRF, Java

So nun ist es soweit der erste FRF geht an den Start.

Einleitung

Ziel ist es eine Web 2.0-fähige Applikation zu bauen, die den Einsatz der genannten Technologien exemplarisch darstellen. Hierfür wird Vaadin für die UI-Bibliotheken, Mongo für die Datenbank(schicht) und Morphia für die Persistenz(schicht) verwendet.

Warum genau diese Technologien?

Ich interessiere mich seit längerem für die NoSQL Datenbanken und habe das ganze leicht verfolgt, aber nie wirklich ausgetestet. Durch diesen Artikel auf IT-Republik bin ich auf Vaadin gestoßen. Habe mir dann mal die Website des Projektes angeschaut, etwas gestöbert und hatte das verlangen es einmal auszuprobieren. Morphia kam dann durch die Suche nach einer JPA-like-Lib für MongoDB hinzu. Um die Zusammenarbeit der einzelnen Tools aufzuzeigen wird nun dieser Prototyp entwickelt.

Bestandsaufnahme

Als erstes muss eine Bestandsaufnahme der benötigten Tools & Libraries durchgeführt werden.

Es wird benötigt:

Nachdem alles runtergeladen und (je nachdem) installiert/entpackt wurde geht es an die Einrichtung der Tools.

Einrichtung der Tools

Für den Tomcat7 habe ich ein recht aktuelle und ausführliche Anleitung gefunden, mit Hilfe der ich ihn eingerichtet habe.

Vaadin besitzt auch ein eclipse PlugIn, in welchem man direkt die aktuellesten Vaadin Libs herunterladen kann.

Bei MongoDB wird es ein wenig interessanter, es existier ein PlugIn zur Verwaltung in eclipse und auf der MongoDB Seite sind die Java Treiber vorhanden. Im Moment bin ich noch ein wenig unschlüssig, ob ich auf DataNucleus oder Morphia setzen werde. Aktuell tendier ich eher zu Morphia.

Ein guter Getting Started Artikel zu MongoDB findet ihr auf der MongoDB Seite.

What’s next?

Im nächsten Artikel geht es dann um etwas an das Eingemachte, es wird via Morphia auf die MongoDB zugegriffen und Daten persistiert.

Ich möchte das Tutorium langsam von unten aufbauen, sprich von der DB Schicht hoch zum UI. Slow but steady.

Hier lang zu FRF #02 – Morphia und MongoDB.

Version: 0.4

4 responses so far

MOTODEV Studio Version 3.0 released

Sep 16 2011 Published by under Android, Development, eclipse

Das MOTODEV Studio, ist wie der Name schon sagt, Motorola’s Entwicklungsumgebung für Android. Mit Version 3.0 wird die neuste Android SDK Version 12  unterstützt und es ist auf der neusten Version von Eclipse (Indigo) lauffähig.

Bild: Copyright developer.motorola.com

 

Das MOTODEV Studio ist Open Source und kann von der Projektseite gedownloaded werden.

Man hat die Möglichkeit sich ein Full-Package zu laden, welches ein Eclipse mit bereits installiertem MOTODEV Studio ist, oder man installiert das MOTODEV Studio als PlugIn. Dafür existieren 2 Möglichkeiten, die Erste ist die automatische Installation über die Eclipse Funktionalität “Install new Software…” und dort die Update-Site:

https://studio-android.motodevupdate.com/android/3.0

eintragen. Die zweite Möglichkeit ist die manuelle Installation des PlugIns, in dem man das Archiv downloaded, entpackt und in die Dateien in den Eclipse Ordner kopiert. Danach eclipse mit eclipse -clean starten und es sollte alles funktionieren.

Das MOTODEV Studio setzt einen bereits konfigurierten Android Environment (SDK, …) vorraus.

Für das ganze benötigt ihr aber einen Motorola Developer Account. Ohne diesen könnt Ihr weder das MOTODEV Studio downloaden, noch über die Update-Site (hier werdet Ihr auch nach dem Passwort gefragt) installieren.

Links:
MOTODEV Studio Download
Pressemeldung – mobile360.de

 

 

No responses yet

PhoneGap Version 1.0 erschienen

Aug 03 2011 Published by under Android, Development, iOS, Tools

So langsam aber sicher wird PhoneGap erwachsen, nicht zuletzt mit der frisch erschienen Version 1.0.

Für die, die nicht wissen was PhoneGap ist, hier eine kurze Erklärung: Man kann mit Webtechnologien (HTML5, JS, CSS3, GWT …) erstellte “Seiten” mit PhoneGap wrappen und auf den verschiedenen mobilen Plattformen als Native App ausliefern. PhoneGap stellt u.a. den Zugriff, mit Hilfe einer API, auf OS Features wie GPS, Kamera, Kontakte etc. her.

Mit Version 1.0 werden folgende Plattformen unterstützt: iOS, Android, Blackberry, WebOS, Symbian.

How PhoneGap works

(Bild: PhoneGap)

Ein PlugIn für Dreamweaver 5.5 & Xcode4 steht auch zur Verfügung.

PhoneGap ist Open-Source, somit kostenlos erhältlich und steht unter der MIT Lizenz.

via [phonegap, mobile360.de]

No responses yet

Shortcut Blockkommentare Xcode4

Mai 18 2011 Published by under Development, OSX, Xcode

Es werden jetzt sicherlich einige denken, das wird doch auch in Xcode unter Editor -> Structre -> Un/Comment Section (cmd+/ ) angezeigt.

Nun ich arbeite hier mit einem MacBook Pro und dort bewirkt CMD + 7 ein öffnen der Log View.

Also etwas herrum probiert und hier nun die Kombination für Blockkommentare:

cmd +  shift + 7

Viel Spaß damit ;-)

No responses yet

SQLite Datenbanken unter Android verwalten

Mai 12 2011 Published by under Android, Development, eclipse, Google

Habe vor langer Zeit einmal ein ziemlich cooles Plugin für eclipse gehabt, welches sich in die Android DDMS Sicht integriert hat und mit dem man sein SQLite Datenbanken verwalten konnte. Neulich hätt ich dieses Plugin mal wieder benötigt, aber hatte es nicht mehr installiert und natürlich auch den Namen vergessen …

Also ein wenig gegoogelt und et voila habs wieder gefunden eine ganze Stufe professioneller als vor über einem halben Jahr.

SQLite Manager für Android DBs

 

Das Plugin heißt Questoid DevTools und kann nach kurzer Registrierung heruntergeladen werden.

 

No responses yet

[OSX] Code Completion Shortcut in Eclipse

Apr 27 2011 Published by under Apple, eclipse, OSX

Irgendwie hab ich noch nicht wirklich viel mit eclipse unter OSX gearbeitet, das fiel mir heute mal wieder auf. Eclipse wollte partut keine Code Completion machen.

Mit Apfel+Leertaste nichts, mit Ctrl+Leertaste kommt Spotlight zum Vorschein, Alt+Leertaste machte ein paar Leerzeichen. Klasse!

Also wieder unseren lieben Freund Google gefragt, klar der hatte Ahnung warum es nicht geht. Man öffne die Einstellungen von Eclipse begebe sich in den Menüpunkt General -> Keys und Suche dort nach Content Assist (die Code Completion heißt in eclipse nämlich Content Assist). Hier kann man dann eine Tastenkombination vergeben. Ich habe Alt+Leertaste genommen.

Keybinding für Content Assistant in eclipse

So nun kanns losgehen mit dem Hardcore Entwicklen …. ;-)

via (stefaanlippens.net)

No responses yet