| « Groovy/Grails als Ergänzung zu Java | Access-Tutorial über 10.000 x gelesen » |
Tutorial: Integration von Google Desktop Search in Java-Anwendungen
Im Alltag fehlt mir oft eine Möglichkeit, Dateien, E-Mails und vielfältige Projektinformationen übersichtlich zu gruppieren. Eigentlich erstaunlich, aber in den “großen” Organizer-Programmen wie Outlook oder Lotus Notes gibt es keine übergeordnete Instanz namens “Vorgang” und keine integrierte Desktop-Suche.
Einen großen Schritt in diese Richtung kann man mit Google Desktop Search (GDS) tun. Praktischerweise enthält es eine API, die u.a. HTTP-Requests erlaubt und sauberes XML zurückliefert. Das ist auf jeden Fall einen genaueren Blick wert.
Fortsetzung:
Schon beim Gebrauch von GDS im Browser fallen die URL-Parameter auf, die auch als Favorit immer noch gut funktionieren. Hängt man an den URL eines Suchergebnisses den Parameter “&format=xml", erscheint das Ergebnis so, dass man damit arbeiten kann.
Doch vorher ist noch ein Detail zu lösen: Alle URLs enthalten einen kodierten Parameter “s” als “security token". Ohne den geht nichts, und er unterscheidet sich in jeder installierten Version. Glücklicherweise kann man ihn über die Windows-Registry ermitteln - und Google beschreibt auch ein Verfahren für MacOS.
Hier eine Klasse, die den Zugriff auf GDS ermöglicht und eine gezielte Suche in E-Mails erlaubt:
Code:
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.StringWriter; | |
| |
/** | |
* Klasse zur Kommunikation mit Google Desktop Search. | |
@author Jean-Rene Thies | |
*/ | |
public class GoogleDesktopAPI { | |
| |
private static final String REGQUERY_UTIL = "reg query "; | |
private static final String REGSTR_TOKEN = "REG_SZ"; | |
private static final String GOOGLEAPI = REGQUERY_UTIL + "\"HKCU\\Software\\Google\\Google Desktop\\API\" /v search_url"; | |
| |
/** | |
* Such-URL generieren, um E-Mails mit Google Desktop Search zu finden. | |
@param s Suchbegriff | |
@param maxresults Maximale Anzahl von Treffern | |
@return URL für HTTP-Request an GDS | |
*/ | |
public static String getSearchEmailUrl(String s, int maxresults) { | |
String searchurl = getGoogleSearchUrl() + "&flags=1088&num=" + maxresults + "&format=xml?q=" + s; | |
return searchurl; | |
} | |
| |
/** | |
* Abfrage der Registry nach dem Eintrag search_url. Dieser unterscheidet sich bei jeder Installation! | |
@return Search-URL aus Registry, nicht parametrisiert | |
*/ | |
private static String getGoogleSearchUrl() { | |
try { | |
Process process = Runtime.getRuntime().exec(GOOGLEAPI); | |
StreamReader reader = new StreamReader(process.getInputStream()); | |
reader.start(); | |
process.waitFor(); | |
reader.join(); | |
String result = reader.getResult(); | |
int p = result.indexOf(REGSTR_TOKEN); | |
if (p == -1) { | |
return null; | |
} | |
String origurl = result.substring(p + REGSTR_TOKEN.length()).trim(); | |
System.out.println("OrigUrl: " + origurl); | |
int lengthurl = origurl.length(); | |
return origurl.substring(0, lengthurl - 3); | |
} catch (Exception e) { | |
return null; | |
} | |
} | |
| |
/** | |
* StreamReader zum Auslesen der Registry | |
*/ | |
private static class StreamReader extends Thread { | |
| |
private InputStream is; | |
private StringWriter sw; | |
| |
StreamReader(InputStream is) { | |
this.is = is; | |
sw = new StringWriter(); | |
} | |
| |
@Override | |
public void run() { | |
try { | |
int c; | |
while ((c = is.read()) != -1) { | |
sw.write(c); | |
} | |
} catch (IOException e) { | |
} | |
} | |
| |
String getResult() { | |
return sw.toString(); | |
} | |
} | |
} |
Die Anwendung ist ganz einfach. Hier ein Beispiel für eine Suche nach dem Wort “newsletter” und maximal 20 Treffern:
Code:
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.io.Reader; | |
import java.net.MalformedURLException; | |
import java.net.URL; | |
| |
public class HttpTest { | |
| |
public static void main(String[] args) { | |
StringBuffer input = new StringBuffer(); | |
try { | |
String geturl = GoogleDesktopAPI.getSearchEmailUrl("newsletter", 20); | |
System.out.println(geturl); | |
URL url = new URL(geturl); | |
Reader is = new InputStreamReader(url.openStream()); | |
BufferedReader in = new BufferedReader(is); | |
for (String s; (s = in.readLine()) != null;) { | |
input.append(s); | |
} | |
in.close(); | |
} catch (MalformedURLException e) { | |
System.out.println("MalformedURLException: " + e); | |
} catch (IOException e) { | |
System.out.println("IOException: " + e); | |
} | |
System.out.println(input.toString()); | |
} | |
} |
Das XML-Ergebnis wird hier einfach auf der Konsole ausgegeben. Genauso kann man es aber parsen (z.B. mit XStream), in Objekte packen und beliebig weiterverwenden.
Ein Detail noch: Das Datum eines E-Mails sieht im XML z.B. so aus:
XML:
<time>128594678480000000</time> |
Hier wird das Windows FILETIME Format verwendet. Zur Umrechnung in ein Datum kann man z.B. Apache POI verwenden, dass ich zum Schreiben von Exceldateien oft sowieso integriere. Ein kleines Beispiel dazu:
Code:
import java.util.Date; | |
import org.apache.poi.hpsf.Util; | |
| |
public class TestTime { | |
| |
public static void main(String[] args) { | |
long time = 128584186310000000L; | |
Date d = Util.filetimeToDate(time); | |
System.out.println(d.toString()); | |
} | |
} |
Noch kein Feedback
Kommentare sind für diesen Eintrag deaktiviert.