Posts Tagged ‘java’

Code Coverage in Eclipse mit EclEmma

Mittwoch, November 4th, 2009

Ein feines Plugin gibt es für Eclipse mit dem man die Code Coverage seiner JUnit Testcases herausfinden kann. Wer eine kostenlose Alternative zu Clover oder ähnlichem sucht kann mit EclEmma glücklich werden.

eclemma

Nach dem Installieren sagt man einfach auf seinem TestCase Coverage As -> JUnit Test und schon zeigt das Plugin genau an, welche Zeilen Code durch den Testcase abgedeckt werden und welche nicht. Die farbigen Zeilen wird man schnell wieder los, wenn man in der Coverage View auf das Löschen X drückt.

In Java den StackTrace einer Exception in einen String umleiten/schreiben

Mittwoch, Oktober 28th, 2009

Mensch, mir fällt auf, dass ich arge Probleme mit den Basics habe, ist aber auch eine komplexe Geschichte mit den Reader und Writern und den Streams. Hier jetzt mal die Lösung wie man den StackTrace einer Exception in einem String speichert.

String stack = "";
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
try {
            doRequest();
        } catch (IOException e) {
            sw.write(e.toString());
            e.printStackTrace(pw);
        }
stack = sw.toString();

So was haben wir gemacht? Die Exception stellt uns die Methode printStackTrace() bereit welche unter anderem einen Writer erwartet. So übergeben wir der Methode einen PrintWriter. Dieser wiederrum benötigt einen StringWriter. Final erhalten wir dann aus dem StringWriter mittels toString() unserer weggeschriebenen StackTrace.

In Java einen String in einen InputStream verwandeln

Dienstag, Oktober 27th, 2009

Aus gegebenen Anlass ein schnelles Codesnippet welches in Java einen String in einen InputStream umwandelt:

String msg = "Hello World!";
ByteArrayInputStream stream = new ByteArrayInputStream(msg.getBytes());

In Java einen OutputStream in einen InputStream umwandeln

Dienstag, Oktober 20th, 2009

Über sowas stolpert man ja öfters, dass eine Java Klasse einen InputStream erwartet, man jedoch maximal einen OutputStream zur Hand hat. Wie kriegt man nun das eine in das andere? Es gibt da verschiedene Möglichkeiten, ich persönlich finde den Weg über die Byte Array Streams am schnellsten und einfachsten.

In dem folgenden Beispiel müssen wir ein Properties Objekt in einen InputStream verwandeln. Das Objekt bietet aber maximal die Möglichkeit einen OutputStream zu erstellen. Wenn wir nun nicht über den Zwischenschritt des Speicherns gehen wollen (oder die Properties on-the-fly erzeugt haben) müssen wir uns über folgenden Weg einen InputStream erzeugen.

Properties p = new Properties();
p.put("key", "value");

ByteArrayOutputStream out = new ByteArrayOutputStream();

try {
	p.store(out, "");
} catch (IOException e) {
	e.printStackTrace();
}

ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());

ByteArrayInputStream und ByteArrayOutputStream sind jeweils Subklassen von InputStream und OutputStream. Deshalb können wir auch einer Funktion die explizit einen InputStream erwartet einfach unseren ByteArrayInputStream übergeben.

Was haben wir nun gemacht? Nun wir haben über die store() Methode der Properties Klasse die Daten in unser ByteArrayOutputStream Objekt geschrieben. Daraufhin können wir ein Objekt vom Typ ByteArrayInputStream erstellen welches gleich im Constructor einen ByteArray erwartet. Zum Glück bietet der ByteArrayOutputStream die Möglichkeit mittels toByteArray() seinen Inhalt direkt als ByteArray auszugeben. Und voilà haben wir einen OutputStream in einen InputStream gewandelt.

Daraus lässt sich natürlich auch noch eine nützliche konvertier Funktion basteln, welche aber an dieser Stelle den Rahmen des Posts sprengt (und meine Zeit auffrisst).

Wer sich über weitere Möglichkeiten des Umwandelns informieren möchte kann dies auf der Seite von Stephen Ostermiller machen.