Archiv für die Kategorie ‘Java’

JTwitter mit OAuth zum automatischen Twittern mit Java verwenden

Donnerstag, 09. September 2010

Zum Twittern in Java Programmen gab es schon seit längerem die Library JTwitter. Bisher konnte man dort einfach durch Eingabe des Twitter Logins und des Passworts neue Tweets schreiben. Twitter hat jedoch in den vergangenen Tagen dieses Verfahren, welches den Namen Basic Auth trägt, deaktiviert. Jetzt kann nur noch per OAuth auf die Twitter API zugegriffen werden.

Aus diesem Grund müssen auch die Java Programme, die JTwitter mit Basic Auth verwenden, angepasst werden. Neben einer neuen JTwitter Version ist dazu auch die Bibliothek Signpost OAuth notwendig. Außerdem muss das Programm unter http://dev.twitter.com/ als Twitter Application registriert werden. Nach der Registrierung erhält man die für OAuth benötigten Keys.

Mit dem Beispiel des JTwitter Autors funktioniert OAuth auch gut, solange man das Java Programm nur auf dem Desktop PC laufen lässt und jedes Mal eine PIN eingibt, die die Anwendung zum Twittern autorisiert. Soll die Anwendung aber im Hintergrund (z.B. als Cronjob) laufen, eignet sich dieses Beispiel nicht.

Mit OAuth ist es aber auch möglich, den Twitter Account dauerhaft mit der Twitter Application zu verbinden. Dazu habe ich auch wieder einen Beispielcode gefunden, mit dem der OAuth Token erstellt werden kann. Hierzu trägt man den Consumer Key und das Consumer Secret in dem Code ein und startet das Programm. Anschließend erhält man eine URL, die man im Browser eingibt. Nach dem Akzeptieren wird wieder eine PIN angezeigt, die man im Java Programm eingibt. Danach werden das OAuth Access token und das Secret Token ausgeben.

Nun kann mit folgendem Coding wieder eine Tweet erstellt werden, nachdem im Konstruktor der Klasse OAuthSignpostClient die Keys eingesetzt wurden:

OAuthSignpostClient oauthClient =
	new OAuthSignpostClient(
			consumerKey, consumerSecret,
			accessToken, accessTokenSecret);
Twitter twitter = new Twitter(TWITTER_USER, oauthClient);
twitter.setStatus(status);

Es ist jetzt also notwendig, dass sich jedes Programm auch als Anwendung bei Twitter registriert. Für mein einfaches Programm, dass die Nachrichten per Cronjob absendet, ist das natürlich etwas umständlich. Schreibt man aber eine richtige Twitter Anwendung, lässt sich dieser Vorgang so implementieren, dass er für den Anwender schnell abläuft und dieser sein Passwort nur noch auf der offiziellen Twitter Homepage eingeben muss.

Basic Auth

Jackcess – Java Bibliothek zum Zugriff auf MS Access

Sonntag, 25. April 2010

Um in Java auf Datenbanken zuzugreifen, verwendet man in der Regel JDBC Treiber, die vom Datenbank-Hersteller zur Verfügung gestellt werden. Im Falle von Microsofts Access Datenbanken hat man jedoch schlechte Karten, da Microsoft selbst keinen JDBC Treiber anbietet. Um trotzdem auf MS Access Datenken zuzugreifen, gibt es einige JDBC Treiber, die über ODBC auf die Access Datenbank zugreifen. Diese Möglichkeit besteht aber nur unter Windows Systemen. Wer unter Linux arbeitet, kann diese Möglichkeit also auch nicht nutzen.

Diese Lücke schließt aber die Java Bibliothek Jackcess, mit der unabhängig vom Betriebsystem auf MS Access Datenbanken zugegriffen werden kann. Der Zugriff erfolgt hier nicht über JDBC sondern über die Klassen und Methoden von Jackcess.

Hier nun einige Kommentare zum Umgang mit Jackcess:

Langsames Schreiben beschleunigen
Beim Schreiben in eine große Datenbanktabelle hatte bei mir das Einfügen einer neuen Zeile mehr als 30 Sekunden gedauert. Das liegt daran, dass Jackcess den Schreibvorgang so optimiert, dass beim Absturz der Anwendung möglichst wenig Daten verloren gehen. Wenn man darauf nicht angewiesen ist, kann man diese Optimierung jedoch auch ausschalten. Dazu öffnet man die Datenbank mit folgenden Parametern:

Database.open("database.mdb", "false", "false");

Das zweite Variable, die übergeben wird, steuert, dass die Datenbank nicht im “readOnly” Zugriff geöffnet wird. Die dritte Variable schaltet dann die Option “autoSync” aus, wodurch das Schreiben bei mir stark beschleunigt wurde.

Long Integer als Primary Key
Primärschlüssel werden durch Jackcess normalerweise automatisch hochgezählt. Dies funktioniert aber nur, wenn die Spalte den Typ “Integer” hat. Die Datenbank, die ich schreiben musste, hatte jedoch den Spaltentyp “Long Integer”. Jackcess hat hier das Schreiben immer mit einer Exception abgebrochen.
Abhilfe schafft die Option setUseBixIndex(), mit der auch in “Long Integer” Spalten geschrieben werden kann.

Database db = new Database("database.mdb");
db.setUseBigIndex(true);

Das Verwenden dieser Option hatte jedoch zur Folge, dass der Primary Key nicht mehr automatisch vergeben wurde. Hier habe ich keine andere Möglichkeit gefunden als selbst den höchsten Wert der Spalte zu ermitteln und dann 1 zu addieren.

Lesen der Datenbank
Bei den Code-Beispielen auf der Jackcess Seite fehlt das Lesen, deshalb hier eine kurzes Code-Beispiel:

Table myTable = db.getTable("myTable");
Iterator<Map<String, Object>> it = myTable.iterator();
while (it.hasNext()) {
	Map<String, Object> map = it.next();
	String column = map.get("columnName").toString();
	//...
}

Zuerst wählt man die Tabelle aus, die gelesen werden soll. Das Objekt vom Typ Table stellt einen Iterator zur Verfügung, mit dem die Tabelle durchlaufen werden kann. Der Iterator gibt für jede Spalte eine Map zurück, über die der Zugriff auf die einzelnen Spalten der Zeile möglich ist.

Weitere Informationen gibt es in den Apidocs.