<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BibaBlog</title>
	<atom:link href="http://wap.ecw.de/feed" rel="self" type="application/rss+xml" />
	<link>http://wap.ecw.de</link>
	<description>Vom Erfinder der Pandemie</description>
	<lastBuildDate>Tue, 31 Aug 2010 18:57:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Flashing Nokia 770</title>
		<link>http://wap.ecw.de/archives/1387</link>
		<comments>http://wap.ecw.de/archives/1387#comments</comments>
		<pubDate>Tue, 31 Aug 2010 18:57:20 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flashing]]></category>
		<category><![CDATA[nokia 770]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1387</guid>
		<description><![CDATA[Flashing my old Nokia 770 device to the latest 2008er Hacker edition under Ubuntu 10.0x drove my crazy. Here are steps which brought success: Download the latest flash utility otherwise you will receive the message Invalid flashing API version (1) Download 2008 Hacker Edition execute on command line sudo ./flasher-3.0-static -F SU-18_2008HACKER_4.2007.50-6_PR_F5_MR0_ARM.bin -f and wait. [...]]]></description>
			<content:encoded><![CDATA[<p>Flashing my old Nokia 770 device to the latest 2008er Hacker edition under Ubuntu 10.0x drove my crazy. Here are steps which brought success:</p>
<ul>
<li>Download the <strong>latest</strong> <a href="http://tablets-dev.nokia.com/d3.php?f=flasher-3.0-static">flash utility otherwise you will receive the message <em>Invalid flashing API version (1)</em></a></li>
<li>Download <a href="http://tablets-dev.nokia.com/os2008_hacker_edition.php">2008 Hacker Edition</a></li>
<li>execute on command line
<pre class="brush: bash;">
sudo  ./flasher-3.0-static -F SU-18_2008HACKER_4.2007.50-6_PR_F5_MR0_ARM.bin -f
</pre>
<p> and wait.
</li>
<li>If you receive the error message <em>Error claiming USB interface: Device or resource busy</em>, run
<pre class="brush: bash;">
sudo modprobe -r cdc_phonet
</pre>
<p> in another shell</li>
</li>
<li>Plug-in the USB cable from your PC to the Nokia 770</li>
<li>Power on the Nokia 770 (in my case power cable must be plugged in) <strong>while</strong> holding down the home button.</li>
<li>flasher tool will show update status</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1387/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Howto: Ein Git-Repository auf sourceforge.net resetten</title>
		<link>http://wap.ecw.de/archives/1384</link>
		<comments>http://wap.ecw.de/archives/1384#comments</comments>
		<pubDate>Tue, 31 Aug 2010 17:05:43 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[reset]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[sourceforge]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1384</guid>
		<description><![CDATA[Hin und wieder führt man einen Commit durch, von dem man im Nachhinein denkt: &#8220;Verdammte Axt&#8221;. So geschehen bei einem meiner sourceforge.net-Projekte, die ich seit längerer Zeit von unserem internen Subversion-System auf das öffentliche Git-Repository bei Sourceforge umstellen wollte. Mein initialer Commit enthielt vertrauliche Informationen, die blöderweise nicht hätten auftauchen sollen, da ich in meiner [...]]]></description>
			<content:encoded><![CDATA[<p>Hin und wieder führt man einen Commit durch, von dem man im Nachhinein denkt: &#8220;Verdammte Axt&#8221;. So geschehen bei einem meiner sourceforge.net-Projekte, die ich seit längerer Zeit von unserem internen Subversion-System auf das öffentliche Git-Repository bei Sourceforge umstellen wollte.<br />
Mein initialer Commit enthielt vertrauliche Informationen, die blöderweise nicht hätten auftauchen sollen, da ich in meiner <em>.gitignore</em> einen Typo hatte.<br />
In solch einem Fall besteht nun die Möglichkeit, mit Hilfe von <a href="http://help.github.com/removing-sensitive-data/">diversen Git-Kommandos die Datei zu entfernen</a> oder aber man setzt das Repository komplett neu auf.<br />
Um bei sourceforge.net das Repository per Hand neu zu erstellen, muss man Administrator-Rechte im Projekt besitzen und sich mit </p>
<pre class="brush: bash;">
ssh -t USER,PROJECT@shell.sourceforge.net create
# bzw.
ssh USER@shell.sourceforge.net
</pre>
<p>auf dem sf.net-Server einloggen.</p>
<p>Mit den folgenden Kommandos werden nun alle Git-Dateien des Projekt-Verzeichnisses gelöscht und das Repository neu initalisiert.</p>
<pre class="brush: bash;">
cd /home/scm_git/P/PR/PROJECT
rm -Rf PROJECT/*
mkdir PROJECT
git --git-dir=PROJECT/ init --shared=all
vim PROJECT/description
</pre>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1384/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AspectJ und Spring: Parameter einer Methode auslesen</title>
		<link>http://wap.ecw.de/archives/1382</link>
		<comments>http://wap.ecw.de/archives/1382#comments</comments>
		<pubDate>Sun, 22 Aug 2010 17:32:36 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[annotation]]></category>
		<category><![CDATA[aop]]></category>
		<category><![CDATA[args]]></category>
		<category><![CDATA[argumente]]></category>
		<category><![CDATA[aspectj]]></category>
		<category><![CDATA[aspekt]]></category>
		<category><![CDATA[jokes]]></category>
		<category><![CDATA[methode]]></category>
		<category><![CDATA[parameter]]></category>
		<category><![CDATA[pointcut]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1382</guid>
		<description><![CDATA[Ich stand heute vor dem Problem, dass ich mit einem AspectJ-Advice die Parameter von Methoden überprüfen wollte. Abhängig von dem Parametertyp sollte eine Exception geworfen werden. Meine Exceptions erben von einer Basisklasse, die in Abhängigkeit des Parametertyps weitere Exception-Codes enthalten. So kann z.B. die UserException neben dem Code NOT_FOUND (Parameter ist null) noch weitere Codes [...]]]></description>
			<content:encoded><![CDATA[<p>Ich stand heute vor dem Problem, dass ich mit einem AspectJ-Advice die Parameter von Methoden überprüfen wollte. Abhängig von dem Parametertyp sollte eine Exception geworfen werden. Meine Exceptions erben von einer Basisklasse, die in Abhängigkeit des Parametertyps weitere Exception-Codes enthalten. So kann z.B. die UserException neben dem Code NOT_FOUND (Parameter ist null) noch weitere Codes wie z.B. EMAIL_ALREADY_EXIST besitzen.</p>
<p>Meine Methoden sahen in etwa so aus:</p>
<pre class="brush: java;">
public void methodeA(User _a, boolean _b);

public void methodeB(AnderesDomaenenObjekt _b, User _a);

public void methodeB(User _a, User _b);
</pre>
<p>Leider gibt es momentan noch keine Möglichkeit, einen entsprechenden Pointcut zu definieren, dem die Reihenfolge der Parameter egal ist.</p>
<p>Der Pointcut</p>
<pre class="brush: plain;">
	@Before(value = &quot;execution (* de.mypackage.service..*.*(.., de.mypackage.domain.User, ..)) &amp;&amp; args(*, _user, *&quot;)
</pre>
<p>funktioniert so nämlich nicht.<br />
Um das Problem momentan zu umschiffen, muss man einen generischen Pointcut definieren, der die Parameter der Methode und die übergebenen Objekte überprüft.<br />
Folgender Code überprüft alle übergebenen Parameter einer Methode und beachtet auch die angehängten Annotations an den jeweiligen Parameter.</p>
<pre class="brush: java;">
@Aspect
@Component
public class ParameterValidAspect
{
	@SuppressWarnings(&quot;unchecked&quot;)
	@Before(value = &quot;execution (* de.mypackage.service..*.*(..))&quot;)
	@Order(AspectOrder.FIRST)
	public void parameterNullCheck(JoinPoint pjp) throws SecurityException,
			NoSuchMethodException
	{
		MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
		String methodName = pjp.getStaticPart().getSignature().getName();
		Class&lt;?&gt;[] paramTypes = methodSignature.getParameterTypes();
		Annotation[][] annotationsByMethod = ((CodeSignature) pjp.getStaticPart()
				.getSignature()).getDeclaringType()
				.getMethod(methodName, paramTypes).getParameterAnnotations();
		Object[] methodArguments = pjp.getArgs();
		Object instance = null;

		for (int i = 0, m = paramTypes.length; i &lt; m; i++)
		{
			instance = methodArguments[i];

			if (instance == null)
			{
				try
				{
					instance = paramTypes[i].newInstance();
				}
				catch (Exception e)
				{
				        // Instanzierungs-Exceptions handeln...
                                }
			}

			if (annotationsByMethod[i].length &gt; 0)
				{
					for (Annotation annotation : annotationsByMethod[i])
					{
						// Annotation behandeln
					}
				}
			}

			if (methodArguments[i] == null)
			{
                                // ParameterNullException handelt dann den jeweiligen Objekttyp
				throw new ParameterNullException(instance);
			}
		}
	}
}
</pre>
<p>Noch ein allgemeiner Hinweise zur Benutzung von AspectJ in Zusammenhang mit dem Spring Framework: Werden Aspekte über die Annotation <em>@Aspect</em> beschrieben, <strong>muss</strong> der Aspekt auch mit <em>@Component</em> annotiert werden, damit sie per Auto-Discovery erkannt werden. Benutzt man <em>@Component</em> <strong>nicht</strong>, muss in der Spring-XML-Konfiguration der Aspekt instanziert werden! </p>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1382/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse: &#8220;No persistence.xml file found in project&#8221;</title>
		<link>http://wap.ecw.de/archives/1380</link>
		<comments>http://wap.ecw.de/archives/1380#comments</comments>
		<pubDate>Sun, 08 Aug 2010 09:04:45 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[eclipselink]]></category>
		<category><![CDATA[komisch]]></category>
		<category><![CDATA[persistence.xml]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1380</guid>
		<description><![CDATA[Für mein aktuelles Projekt setze ich u.a. JPA/EclipseLink, Maven und Spring. Damit der Build-Prozess von Maven und das automatische Deployen in den Tomcat-Container von Eclipse funktioniert, musste ich ein paar Änderungen an der .settings/org.eclipse.wst.common.component durchführen: &#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62; &#60;project-modules id=&#34;moduleCoreId&#34; project-version=&#34;1.5.0&#34;&#62; &#60;wb-module deploy-name=&#34;YourProject&#34;&#62; &#60;wb-resource deploy-path=&#34;/&#34; source-path=&#34;/src/main/webapp&#34;/&#62; &#60;wb-resource deploy-path=&#34;/WEB-INF&#34; source-path=&#34;/src/main/resources&#34;/&#62; &#60;wb-resource deploy-path=&#34;/WEB-INF/classes&#34; source-path=&#34;/src/main/java&#34;/&#62; &#60;wb-resource deploy-path=&#34;/WEB-INF/classes&#34; source-path=&#34;/src/test/java&#34;/&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Für mein aktuelles Projekt setze ich u.a. JPA/EclipseLink, Maven und Spring. Damit der Build-Prozess von Maven und das automatische Deployen in den Tomcat-Container von Eclipse funktioniert, musste ich ein paar Änderungen an der <em>.settings/org.eclipse.wst.common.component</em> durchführen:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project-modules id=&quot;moduleCoreId&quot; project-version=&quot;1.5.0&quot;&gt;
    &lt;wb-module deploy-name=&quot;YourProject&quot;&gt;
        &lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/src/main/webapp&quot;/&gt;
	&lt;wb-resource deploy-path=&quot;/WEB-INF&quot; source-path=&quot;/src/main/resources&quot;/&gt;
        &lt;wb-resource deploy-path=&quot;/WEB-INF/classes&quot; source-path=&quot;/src/main/java&quot;/&gt;
        &lt;wb-resource deploy-path=&quot;/WEB-INF/classes&quot; source-path=&quot;/src/test/java&quot;/&gt;
        &lt;wb-resource deploy-path=&quot;/WEB-INF/classes&quot; source-path=&quot;/src/test/resources&quot;/&gt;
        &lt;property name=&quot;context-root&quot; value=&quot;YourProject&quot;/&gt;
        &lt;property name=&quot;java-output-path&quot; value=&quot;/YourProject/target/classes&quot;/&gt;
    &lt;/wb-module&gt;
&lt;/project-modules&gt;
</pre>
<p>Nach dem nächsten Start von Eclipse bekam ich nun folgenden, nichts-sagenden Fehler vom Eclipse-JPA-Plugin: <em>No persistence.xml file found in project.</em>. Pustekuchen, denn unter <em>src/main/resources/META-INF/persistence.xml</em> war die Datei zu finden und auch im Classpath so eingerichtet. Nach einigem hin und her probieren habe ich dann die (absolut bescheuerte) Lösung für das Problem gefunden.</p>
<p />
Der Inhalt des <em>ressource</em>-Ordner muss nach <em>/WEB-INF/classes</em> kopiert werden, und zwar an vierter Stelle:</p>
<pre class="brush: xml;">
        &lt;wb-resource deploy-path=&quot;/WEB-INF/classes&quot; source-path=&quot;/src/main/java&quot;/&gt;
        &lt;wb-resource deploy-path=&quot;/WEB-INF/classes&quot; source-path=&quot;/src/main/resources&quot;/&gt;
</pre>
<p>Die Logik dahinter ist mir schleierhaft, da ja davon eigentlich auszugehen ist, dass das JPA-Plugin die <em>persistence.xml</em> aus dem Classpath anzieht.</p>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1380/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das macht keinen Sinn äh&#8230; Spaß!</title>
		<link>http://wap.ecw.de/archives/1375</link>
		<comments>http://wap.ecw.de/archives/1375#comments</comments>
		<pubDate>Wed, 04 Aug 2010 09:22:40 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Dies und das]]></category>
		<category><![CDATA[denglisch]]></category>
		<category><![CDATA[denglish]]></category>
		<category><![CDATA[deutsch]]></category>
		<category><![CDATA[kein]]></category>
		<category><![CDATA[sinn]]></category>
		<category><![CDATA[sprache]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1375</guid>
		<description><![CDATA[Ich gehöre ja zu den Leuten, die sich für die korrekte Benutzung der deutschen Sprache stark machen, sich auch gerne darüber belehren lassen und nach bestem Wissen und Gewissen ein korrektes Deutsch einsetzen (es sei denn, ich habe etwas mehr getrunken oder es handelt sich um das total bescheuerte Wort &#8220;drinne&#8221;). Vor ein paar Tagen [...]]]></description>
			<content:encoded><![CDATA[<p>Ich gehöre ja zu den Leuten, die sich für die korrekte Benutzung der deutschen Sprache stark machen, sich auch gerne darüber belehren lassen und nach bestem Wissen und Gewissen ein korrektes Deutsch einsetzen (es sei denn, ich habe etwas mehr getrunken oder es handelt sich um das total bescheuerte Wort &#8220;drinne&#8221;).</p>
<p>Vor ein paar Tagen wurde ich bei Twitter von dem stopmakesense-Bot retweetet und dachte mir da nichts bei. Ich hatte geschrieben: &#8220;Das macht keinen Sinn.&#8221; Während einer Besprechung am Montag, wurde ich auf meinen Fehler noch einmal dezent hingewiesen &#8211; ignorierte es aber.</p>
<p>Heute Morgen beim Schwimmen fiel mir der sprachliche Unfall wieder ein und ich dachte darüber nach, was denn daran falsch sei. Ich behaupte einfach mal, dass jeder, der &#8220;das macht keinen Sinn&#8221; als falsch ansieht und jünger als 35 ist, den <a href="http://www.spiegel.de/kultur/zwiebelfisch/0,1518,261738,00.html">Artikel bei Zwiebelfisch</a> gelesen hat, nachdem entweder vor sieben Jahren darüber in seinem RSS-Reader gestolpert ist (bin ich nicht) oder aber von dem oben genannten Twitter-Bot in den letzten Monaten/Wochen retweetet wurde.</p>
<p>Wie dem auch sei. Im Duden steht bereits seit 2002, dass &#8220;das macht keinen Sinn&#8221; <a href="http://www.wer-weiss-was.de/theme143/article1063767.html">als umgangssprachlich anerkannt ist </a>- was mir auf den Keks geht, ist die Begründung, die Bastian Sick als Autor von &#8220;Der Dativ ist dem Genitiv sein Tod&#8221; und anderen Büchern über die deutsche Sprache verfasst hat und was sich damit anstellen lässt:</p>
<p><em>&#8216;&#8221;Sinn&#8221; und &#8220;machen&#8221; passen einfach nicht zusammen. Das Verb &#8220;machen&#8221; hat  die Bedeutung von fertigen, herstellen, tun, bewirken; es geht zurück  auf die indogermanische Wurzel <em>mag-</em>, die für &#8220;kneten&#8221; steht. Das  erste, was &#8220;gemacht&#8221; wurde, war demnach Teig. Etwas Abstraktes wie Sinn  lässt sich jedoch nicht kneten oder formen. Er ist entweder da oder  nicht. Man kann den Sinn suchen, finden, erkennen, verstehen, aber er  lässt sich nicht im Hauruck-Verfahren erschaffen&#8217;</em></p>
<p>Ich akzeptiere die Begründung so wie sie ist. Ich muss sogar zugeben, dass ich bis dahin dachte: &#8220;It doesn&#8217;t make sense&#8221; falsches Englisch sei &#8211; ich bin damit sicherlich nicht alleine. Hiermit mal alle an die eigene Nase fassen.</p>
<p>Soweit, so gut. Jetzt mal an alle, die sich <strong>für</strong> &#8220;das macht keinen Sinn&#8221; einsetzen und den zitierten Satz von Bastian Sick gelesen haben: Haltet ihr die Aussage &#8220;Das macht Laune&#8221; oder noch besser &#8220;Das macht doch keinen Spaß!&#8221; jetzt noch für richtig?</p>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1375/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring Framework für Azubis: Tutorial</title>
		<link>http://wap.ecw.de/archives/1366</link>
		<comments>http://wap.ecw.de/archives/1366#comments</comments>
		<pubDate>Mon, 26 Jul 2010 18:01:24 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Fachinformatiker ausbilden]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[attribute]]></category>
		<category><![CDATA[bean]]></category>
		<category><![CDATA[dummies]]></category>
		<category><![CDATA[dummy]]></category>
		<category><![CDATA[element]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[id]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1366</guid>
		<description><![CDATA[Einen meiner Azubis habe ich vor einigen Wochen die Aufgabe gegeben, sein in Java geschriebenes Website-Crawler Tool auf Spring zu portieren. Dabei kam es dann logischerweise zu einigen Fragen und Pitfalls, über die man als Spring-Neuling stolpert. In diesem Artikel will ich auf die Hürden bei der Entwicklung mit Spring hinweisen, die man als Java- [...]]]></description>
			<content:encoded><![CDATA[<p>Einen meiner Azubis habe ich vor einigen Wochen die Aufgabe gegeben, sein in Java geschriebenes Website-Crawler Tool auf Spring zu portieren. Dabei kam es dann logischerweise zu einigen Fragen und Pitfalls, über die man als Spring-Neuling stolpert.</p>
<p>In diesem Artikel will ich auf die Hürden bei der Entwicklung mit Spring hinweisen, die man als Java- bzw. Spring-Neuling zwangsläufig hat. Anspruch auf Vollständigkeit ist angesichts der Komplexität von Spring natürlich nicht mal annähernd zu erwarten <img src='http://wap.ecw.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h1>Warum Spring?</h1>
<p>Das Spring Framework besteht aus einer Vielzahl an Klassen, die wiederkehrende Aufgaben bereits implementiert haben und getestet sind. So entfällt z.B. das umständliche Erzeugen der Datenbank-Verbindungen und ähnlicher Sachen.<br />
Spring setzt auf das Prinzip der <a href="http://de.wikipedia.org/wiki/Dependency_Injection">Dependency Injection</a>. Dahinter versteckt sich grob gesagt die Tatsache, dass Objekte innerhalb des Quellcodes nicht mehr mit dem Schlüsselwort <em>new</em> erzeugt werden, sondern dass die Instanzierung von Objekten durch Spring geschieht. Durch diese Tatsache wird die Abhängigkeit zwischen Klassen reduziert, einzelne Funktionalitäten lassen sich leichter austauschen. Damit einhergehend ist es auch wichtig, dass gegen Interfaces programmiert wird und <strong>nicht</strong> gegen konkrete Klassen.</p>
<h1>Die Beispielapplikation</h1>
<p>Ziel soll es sein, dass wir eine einfache Main-Klasse haben, die in Abhängigkeit von der Konfiguration entweder die Klasse <em>StringHandlerBackward</em> oder <em>StringHandlerSecond</em> besitzt. Beide <em>StringHandler</em>-Klassen implementieren das Interface <em>IStringHandler</em>. <em>StringHandlerBackward </em>gibt einen String von hinten nach vorne aus, <em>StringHandlerSecond</em> gibt nur jeden zweiten Buchstaben aus.</p>
<h1>Die XML-Konfigurationsdatei I, XML &#038; XSD</h1>
<p>Spring setzt auf die Konfiguration durch XML-Dateien. Innerhalb der XML-Datei wird deklarotisch hinterlegt, welche Objekte mit welchen Eigenschaften automatisch bei ihrer Ansprache erzeugt werden. Im folgenden Beispiel wird unsere Spring-Konfiguration in der Datei <em>applicationContext.xml </em>hinterlegt. Die XML-Datei hat folgenden Aufbau:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd&quot;&gt;

&lt;/beans&gt;
</pre>
<p><em>xmlns=&#8221;http://www.springframework.org/schema/beans&#8221;</em> besagt, dass <a href="http://de.wikipedia.org/wiki/Namensraum_%28XML%29">Standard-Namespace der XML-Datei</a> <em>http://www.springframework.org/schema/beans</em> ist. Innerhalb des Attributs <em>xsi:schemaLocation</em> wird zugewiesen, dass der Namespace <em>http://www.springframework.org/schema/beans</em> innerhalb der XSD-Datei<br />
<em>http://www.springframework.org/schema/beans/spring-beans-3.0.xsd</em> beschrieben ist.<br />
Eine <a href="http://de.wikipedia.org/wiki/XSD">XSD</a>-Datei enthält Informationen darüber, wie eine XML-Datei aufgebaut sein darf (Reihenfolge der Tags/Elemente, welche Elemente benutzt werden dürfen, welche Attribute ein Tag/Element enthalten darf/muss u.s.w.).</p>
<p>Über den Standard-Namespace können wir nun alle Elemente aus der spring-beans-3.0.xsd direkt innerhalb unserer XML-Datei benutzen.</p>
<p><em>xmlns:context=&#8221;http://www.springframework.org/schema/context&#8221;</em> besagt, dass wir über das Prefix <em>context</em> Zugriff auf den Namespace<br />
<em>http://www.springframework.org/schema/context</em> haben.</p>
<p>Warum das so ist? Man stelle sich vor, dass beide XSD-Dateien (<em>spring-beans-3.0.xsd</em> und <em>spring-context-3.0.xsd</em>) das Element bean erlauben. Woher soll nun der XML-Parser wissen, welche Definition der bean Elements genutzt werden soll? Soll er die Definition aus<br />
<em>spring-beans-3.0.xsd</em> nutzen oder aus <em>spring-context-3.0.xsd</em>? Mit den Prefix <em>context</em> wird das Problem nun umgangen, da wir über <em>bean</em> auf den Standard-Namespace (<em>xmlns</em>) zugreifen, über <em>context:bean</em> hingegen auf den context-Namespace (<em>xmlns:context</em>).</p>
<h1>Unsere Java-Klassen</h1>
<p>Zu der Konfigurationsdatei kommen wir gleich wieder, erst einmal müssen wir unsere trivialen Java-Klassen schreiben:</p>
<p>IStringHandler.java</p>
<pre class="brush: java;">
interface IStringHandler {
  /**
  * Wandelt den String der Klasse um und gibt diesen zurück
  * @return String
  */
  public String stringify();
}
</pre>
<p>StringBase.java</p>
<pre class="brush: java;">
class StringBase {
  private String string;

  public StringBase(String _string) {
    setString(_string);
  }

  public StringBase() {
  }

  public void setString(String _string) {
    string = _string;
  }

  public String getString() {
    return string;
  }
</pre>
<p>StringHandlerBackward.java</p>
<pre class="brush: java;">
class StringHandlerBackward extends StringBase implements IStringHandler {
  public StringHandlerBackward(String _string) {
    super(_string);
  }

  public StringHandlerBackward() {
  }

  public String stringify() {
    StringBuffer sb = new StringBuffer();
    String ref = getString();

    for (i = (ref.length - 1); i &gt;= 0; i--) {
      sb.append(ref.charAt(i));
    }

    return sb.toString();
  }
}
</pre>
<p>StringHandlerSecond.java</p>
<pre class="brush: java;">
class StringHandlerSecond extends StringBase implements IStringHandler {
  public StringHandlerSecond(String _string) {
    super(_string);
  }

  public StringHandlerSecond() {
  }

  public String stringify() {
    StringBuffer sb = new StringBuffer();
    String ref = getString();

    for (i = 0, m = ref.length; i &lt;= m; i=i+2) {
      sb.append(ref.charAt(i));
    }

    return sb.toString();
  }
}
</pre>
<p>Main.java</p>
<pre class="brush: java;">
class Main {
  public static void main(String args[]) {
  }
}
</pre>
<h1>Der ApplicationContext und Resourcen</h1>
<p>Spring definiert den so genannten ApplicationContext, der Methoden bereit stellt, um auf die in der XML-Datei hinterlegten Beans zuzugreifen. Für unsere Zwecke soll die Klasse <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/support/ClassPathXmlApplicationContext.html">ClasspathXmlApplicationContext</a> dienen. Diese implementiert das Interface <em>ApplicationContext</em> und noch andere Interfaces, die die Arbeit erleichtern. <em>ClasspathXmlApplicationContext</em> ist für die Arbeit mit XML-Konfigurationsdateien innerhalb des Java-Classpath gedacht.</p>
<p>Mit Hilfe von </p>
<pre class="brush: java;">
AbstractXmlApplicationContext ctx = new ClasspathXmlApplicationContext(&quot;applicationContext.xml&quot;);
</pre>
<p>definieren wir, dass Spring die Datei <em>applicationContext.xml</em> laden soll. Diese muss sich im Java-Classpath befinden.</p>
<p>Wir können aber auch folgendes machen:</p>
<pre class="brush: java;">
AbstractXmlApplicationContext ctx = new FileSystemXmlApplicationContext(&quot;classpath:applicationContext.xml&quot;);
</pre>
<p><a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/support/FileSystemXmlApplicationContext.html">FileSystemXmlApplicationContext</a> erbt ebenfalls von <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/support/AbstractXmlApplicationContext.html">AbstractXmlApplicationContext</a> und bietet die Möglichkeit, über Prefixe auf Resource zuzugreifen. Das Prefix <em>classpath</em> führt dazu, dass die Datei innerhalb des Classpathes gesucht wird. Das Prefix <em>file</em> hingegen, weist auf eine Suche im Dateisystem hin. Mehr Infos gibt es in der <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/resources.html#resources-app-ctx-classpathxml">Resources-Abteilung von Spring</a>.</p>
<p>Über die lokale Variable <em>ctx</em> können wir nun unser Bean laden und den Text ausgeben:</p>
<pre class="brush: java;">
IStringify stringifierBean = (IStringify)ctx.getBean(&quot;stringifierBean&quot;);
System.out.println(stringifierBean.stringify());
</pre>
<p><em>ctx.getBean(&#8220;stringifierBean&#8221;)</em> sucht nun in der XML-Konfiguration nach einem Bean mit genau diesem Namen und erzeugt es.</p>
<p>Unsere Main-Klasse sieht nun folgendermaßen aus:</p>
<pre class="brush: java;">
class Main {
  public static void main(String args[]) {
    // Neuen ApplicationContext laden. Unsere XML-Konfiguration applicationContext.xml wird dabei im Classpath gesucht
    AbstractXmlApplicationContext ctx = new FileSystemXmlApplicationContext(&quot;classpath:applicationContext.xml&quot;);
    // getBean(&quot;idDesBeans&quot;) lädt nun das Bean. getBean() liefert Object zurück, deshalb der Typecast in das korrekte Interface
    IStringify stringifierBean = (IStringify)ctx.getBean(&quot;stringifierBean&quot;);
    System.out.println(stringifierBean.stringify());
  }
}
</pre>
<h1>Die XML-Konfigurationsdatei II, Beans</h1>
<p>Immer noch am Grübeln, woher denn nun das ominöse <em>stringifierBean</em> kommt? Hier folgt die Aufklärung: Jedes Bean, dass wir innerhalb unseres Java-Codes ansprechen wollen, braucht einen Identifier und/oder Namen. Hinter <em>stringifierBean</em> verbirgt sich nun das Bean, dass wir zur Verarbeitung des Strings benutzen. Ein Bean ist nichts weiter als eine Java-Klasse mit optionalen getter- und setter-Methoden und mindestens einem öffentlichen Konstruktor (auf Factories werde ich jetzt nicht weiter eingehen).</p>
<p>Folgenden Code-Schnipsel packen wir nun in das <em>beans</em>-Element unserer XML-Datei:</p>
<pre class="brush: xml;">
  &lt;bean id=&quot;stringifierBean&quot; name=&quot;stringifierBean&quot; class=&quot;StringHandlerSecond&quot; /&gt;
</pre>
<p>Wo ist der Unterschied zwischen den Attributen <em>id</em> und <em>name</em>? Spring behandelt unter <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-beanname">3.3.1 Naming Beans</a> das Thema. Kurz gesagt: <em>id</em> benutzen. Jede ID darf genau einmal vergeben werden!<br />
<br />
Mit der obigen XML-Deklaration definieren wir, dass Spring beim Aufruf von getBean(&#8220;stringifierBean&#8221;) eine Instanz der Klasse <em>StringHandlerSecond</em> zurückliefert. Um hingegen eine Instanz der Klasse <em>StringHandlerBackwards</em> zu bekommen, müssen wir anstatt <em>class=&#8221;StringHandlerSecond&#8221; class=&#8221;StringHandlerBackwards&#8221;</em> schreiben.</p>
<h2>Singletons, Scopes und Prototypen</h2>
<p>Standardmäßig verhält sich Spring so, dass von einem Bean genau immer <strong>eine</strong> Instanz erzeugt. Nicht zwei, nicht 20, nicht 200 sondern genau <strong>eine</strong>. Jedes Bean ist somit ein Singleton.<br />
Folgender Code macht keinen Sinn:</p>
<pre class="brush: java;">
IStringHandler stringHandler1 = ctx.getBean(&quot;stringifierBean&quot;);
IStringHandler stringHandler2 = ctx.getBean(&quot;stringifierBean&quot;);
</pre>
<p><em>ctx.getBean(&#8220;stringifierBean&#8221;)</em> liefert die selbe Instanz zurück, somit ist stringHandler1 und stringHandler2 das selbe Objekt und wir haben doppelten Code.<br />
Manchmal (oder öfter) ist es aber nötig, dass von einer Klasse nicht nur eine Instanz sondern n-Instanzen existieren können. Spring führt deshalb den so genannten Scope ein. Dieser definiert, was beim Zugriff auf das Bean mit <em>getBean(&#8220;beanName&#8221;)</em> geschieht. Standardmäßig steht der Scope auf <em>singleton</em>. Um mit jeden Aufruf ein neues Objekt der Klasse zu bekommen, muss der Scope auf <em>prototype</em> stehen. Um das zu erreichen, müssen wir unsere Bean-Definition folgendermaßen anpassen:</p>
<pre class="brush: xml;">
  &lt;bean id=&quot;stringifierBean&quot; name=&quot;stringifierBean&quot; class=&quot;StringHandlerSecond&quot; scope=&quot;prototype&quot;/&gt;
</pre>
<p>Das Attribut <em>scope</em> mit dem Wert <em>prototype</em> bemerkt? Gut! Genau das sorgt dafür, dass mit jedem Auf ein neues Objekt erzeugt wird.</p>
<h2>Was macht denn Spring nun eigentlich beim Aufruf von <em>getBean()</em>?</h2>
<p>Spring geht beim Aufruf von <em>ctx.getBean(&#8220;stringifierBean&#8221;)</em> folgendermaßen vor:</p>
<ul>
<li>Existiert das Bean <em>stringifierBean</em> in der Konfiguration?<br /><strong>Nein:</strong> Fehler<br />Ja: Weiter geht es</li>
<li>Hat das Bean einen <em>prototype</em> Scope?<br /><strong>Ja:</strong> Neues Objekt erzeugen<br /><strong>Nein:</strong>: Weiter geht es</li>
<li>Existiert das Bean <em>stringifierBean</em> im Cache von Spring?<br /><strong>Ja:</strong> Objekt aus dem Cache zurückliefern<br /><strong>Nein:</strong> Neues Objekt erzeugen, im Cache speichern und Referenz auf das Objekt zurückliefern.
</li>
</ul>
<h2>Properties und Konstruktor-Argumente</h2>
<p>Momentan macht unsere Applikation noch gar nichts, da der String, der umgewandelt werden soll, noch nicht hinterlegt worden ist.<br />
Wir können nun den String auf zwei Arten injizieren:</p>
<pre class="brush: xml;">
  &lt;bean id=&quot;stringifierBean&quot; name=&quot;stringifierBean&quot; class=&quot;StringHandlerSecond&quot;&gt;
    &lt;property name=&quot;string&quot; value=&quot;Mein String&quot; /&gt;
  &lt;/bean&gt;
</pre>
<p>Dadurch wird das Objekt von Spring erzeugt (es wird der leere Konstruktor benutzt) und dann dann die setter-Methode <em>setString</em> mit dem Wert &#8220;Mein String&#8221; aufgerufen.<br />
Intern macht Spring eine Art</p>
<pre class="brush: java;">
StringHandlerSecond stringifierBean = new StringHandlerSecond();
stringifierBean.setString(&quot;Mein String&quot;);
// addToCache(stringifierBean);
</pre>
<pre class="brush: xml;">
  &lt;bean id=&quot;stringifierBean&quot; name=&quot;stringifierBean&quot; class=&quot;StringHandlerSecond&quot;&gt;
    &lt;constructor-arg type=&quot;java.lang.String&quot; value=&quot;Mein String&quot; /&gt;
  &lt;/bean&gt;
</pre>
<p>Hiermit wird der Konstruktor aufgerufen, dessen Parameter vom Typ <em>java.lang.String</em> ist.<br />Auch hier wieder der Pseudo-Code, der innerhalb von Spring aufgerufen wird (ist natürlich alles etwas komplizierter, zum groben Verständnis soll das aber reichen):</p>
<pre class="brush: java;">
StringHandlerSecond stringifierBean = new StringHandlerSecond(&quot;Mein String&quot;);
// addToCache(stringifierBean);
</pre>
<p>Man kann natürlich auch beides kombinieren:</p>
<pre class="brush: xml;">
  &lt;bean id=&quot;stringifierBean&quot; name=&quot;stringifierBean&quot; class=&quot;StringHandlerSecond&quot;&gt;
    &lt;constructor-arg type=&quot;java.lang.String&quot; value=&quot;Mein String&quot; /&gt;
    &lt;property name=&quot;string&quot; value=&quot;Und dann überschreibe ich den String&quot; /&gt;
  &lt;/bean&gt;
</pre>
<pre class="brush: java;">
StringHandlerSecond stringifierBean = new StringHandlerSecond(&quot;Mein String&quot;);
stringifierBean.setString(&quot;Und dann überschreibe ich den String&quot;);
// addToCache(stringifierBean);
</pre>
<p>Man kann auch mit Hilfe des Attributs <em>ref</em> auf andere Beans verweisen. Bei der Verwendung des Attributs <em>ref</em> ist wichtig, dass das zu referenzierende Bean <strong>nicht</strong> wieder auf das Bean verweist, von dem referenziert wird. Nicht verstanden?</p>
<pre class="brush: xml;">
&lt;bean id=&quot;A&quot; name=&quot;A&quot; class=&quot;AKlasse&quot;&gt;
  &lt;property name=&quot;andereKlasse&quot; value=&quot;B&quot; /&gt;
&lt;/bean&gt;

&lt;bean id=&quot;B&quot; name=&quot;B&quot; class=&quot;BKlasse&quot;&gt;
  &lt;property name=&quot;andereKlasse&quot; value=&quot;A&quot; /&gt;
&lt;/bean&gt;
</pre>
<p>Das funktioniert <strong>nicht</strong>, da wir in eine so genannte zirkuläre Abhängigkeit geraten. A und B hängen gegenseitig von einander ab. Spring weiß nicht, wie er die Klassen zuerst initalisieren soll.</p>
<h1>.properties-Dateien, Einstellungen auslagern</h1>
<p>Momentan haben wir den Wert für unseren umzuwandelnden String noch fest in die XML-Datei geschrieben. Das ist natürlich möglich, der Endanwender interessiert sich aber eher nicht so für das ganze XML-Geraffel. Deshalb lagern wir die Variablen nun aus. Dazu speichern wir folgenden Code in der Datei <em>stringifier.properties</em></p>
<pre class="brush: bash;">
stringifier.class=StringHandlerSecond # oder StringHandlerBackwards
stringifier.string=Hallo Wald!
</pre>
<p>und passen unsere <em>applicationContext.xml</em> an:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd&quot;&gt;

    &lt;context:property-placeholder location=&quot;stringifier.properties&quot;/&gt;

    &lt;bean id=&quot;stringifierBean&quot; name=&quot;stringifierBean&quot; class=&quot;${stringifier.class}&quot;&gt;
      &lt;constructor-arg type=&quot;java.lang.String&quot; value=&quot;${stringifier.value}&quot; /&gt;
    &lt;/bean&gt;
&lt;/beans&gt;
</pre>
<p>Mit <em>context.property-placeholder</em> definieren wir eine Konfigurationsdatei, in der die zu ersetzenden Werte im Muster <em>${}</em> stehen.</p>
<p />
Das soll erst einmal reichen. Spring umfasst noch viel viel mehr, sei es Annotations, AOP, Unterstützung von Scriptsprachen u.s.w. &#8211; Ich kann nur empfehlen, sich die hervorragende Dokumentation durchzulesen. Sie ist meiner Meinung nach eine der besten Dokumentationen, die im Internet zu finden ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1366/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging von C-Applikationen unter Linux</title>
		<link>http://wap.ecw.de/archives/1363</link>
		<comments>http://wap.ecw.de/archives/1363#comments</comments>
		<pubDate>Thu, 22 Jul 2010 10:10:20 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[fault]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[leak]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[segfault]]></category>
		<category><![CDATA[segmentation]]></category>
		<category><![CDATA[valgrind]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1363</guid>
		<description><![CDATA[Da ich gegenwärtig an libopenranked von etqw-openranked arbeite und ich vermute, dass ich meine Erkenntnisse nach einiger Zeit wieder vergesse, gibt es hier die Kurzfassung. Damit bei einem Segmentation Fault eine Core-Dump erzeugt wird, muss ulimit -c unlimited aufgerufen. Damit wird festgelegt, dass der Core-Dump beliebig groß sein darf. Mit gdb a.out core backtrace lassen [...]]]></description>
			<content:encoded><![CDATA[<p>Da ich gegenwärtig an <em>libopenranked</em> von <a href="http://sourceforge.net/projects/etqw-openranked">etqw-openranked</a> arbeite und ich vermute, dass ich meine Erkenntnisse nach einiger Zeit wieder vergesse, gibt es hier die Kurzfassung.</p>
<p>Damit bei einem Segmentation Fault eine Core-Dump erzeugt wird, muss</p>
<pre class="brush: bash;">
ulimit -c unlimited
</pre>
<p>aufgerufen. Damit wird festgelegt, dass der Core-Dump beliebig groß sein darf.</p>
<p>Mit</p>
<pre class="brush: bash;">
gdb a.out core
backtrace
</pre>
<p>lassen sich die letzten Ausführungsschritte der Applikation anzeigen.</p>
<p>Mit</p>
<pre class="brush: bash;">
apt-get install valgrind
valgrind --tool=memcheck --leak-check=yes ./a.out
</pre>
<p>lässt sich überprüfen, welche Funktionen potenzielle Memory Leaks erzeugen, die wiederum zu einem Segmentation Fault führen können.</p>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1363/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Daily Hack: Manuell aus RSSPopper eine OPML erstellen</title>
		<link>http://wap.ecw.de/archives/1361</link>
		<comments>http://wap.ecw.de/archives/1361#comments</comments>
		<pubDate>Thu, 15 Jul 2010 20:03:17 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[daily hack]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[opml]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[rsspopper]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xpath]]></category>
		<category><![CDATA[xquery]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1361</guid>
		<description><![CDATA[Am Mittwoch habe ich meinen Urlaub angetreten und mir meine OPML-Datei, die ich in meinem Firmen-Outlook eingerichtet  habe, per E-Mail zugeschickt, so dass ich auf meinem Privat-Notebook in meiner Urlaubszeit immer noch die News als RSS durchschauen kann. Heute Abend wollte ich dann die OPML-Datei aus Outlook Web Access in Liferea einspielen. Leider gab es [...]]]></description>
			<content:encoded><![CDATA[<p>Am Mittwoch habe ich meinen Urlaub angetreten und mir meine OPML-Datei, die ich in meinem Firmen-Outlook eingerichtet  habe, per E-Mail zugeschickt, so dass ich auf meinem Privat-Notebook in meiner Urlaubszeit immer noch die News als RSS durchschauen kann.<br />
Heute Abend wollte ich dann die OPML-Datei aus Outlook Web Access in Liferea einspielen. Leider gab es ein Problem: über OWA konnte ich (warum auch immer) den Anhang meiner E-Mail nicht herunterladen. Mein Rechner war auch aus, so dass ich die OPML-Datei nicht erneut erstellen konnte.<br />
Glücklicherweise werden die Feeds von RSSPopper im Profilverzeichnis unter <em>Anwendungsdaten/RSSPopper</em> gespeichert. An mein Server-Profil kam ich leicht heran, kopierte mir dann die Datei <em>feeds.xml</em> und schraubte mir auf die Schnelle ein XPath-Ausdruck, den ich auf der Kommandozeile mit <em>xqilla rsspopper_to_opml.xquery</em> ausführte.</p>
<pre class="brush: xml;">
&lt;opml version=&quot;1.0&quot;&gt;
  &lt;head&gt;
    &lt;title&gt;Feeds&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;outline text=&quot;Feeds&quot;&gt;
    {
	let $d := fn:doc(&quot;/home/ckl/Desktop/feeds.xml&quot;)/feeds
        for $x in $d/feed
            return
		&lt;outline title=&quot;{$x/Title}&quot; xmlUrl=&quot;{$x/Link}&quot; /&gt;
    }
&lt;/outline&gt;
&lt;/body&gt;
&lt;/opml&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1361/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12 von 33: Wissenschaftliches Arbeiten bestanden</title>
		<link>http://wap.ecw.de/archives/1357</link>
		<comments>http://wap.ecw.de/archives/1357#comments</comments>
		<pubDate>Tue, 13 Jul 2010 12:58:52 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Studium]]></category>
		<category><![CDATA[Wissenschafliches Arbeiten]]></category>
		<category><![CDATA[3. semester]]></category>
		<category><![CDATA[präsenzklausur]]></category>
		<category><![CDATA[wissenschaftliches arbeiten]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1357</guid>
		<description><![CDATA[Gestern kam die Nachricht herein, dass ich das Modul Wissenschaftliches Arbeiten mit 1.0 (98,5% Präsenzklausur, Gesamt: 123%) bestanden habe. 36% des Studiums sind damit fertig und ich bin im 3. Semester.]]></description>
			<content:encoded><![CDATA[<p>Gestern kam die Nachricht herein, dass ich das Modul Wissenschaftliches Arbeiten mit 1.0 (98,5% Präsenzklausur, Gesamt: 123%) bestanden habe. 36% des Studiums sind damit fertig und ich bin im 3. Semester.</p>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1357/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring: Properties für eine Applikation vor Starten des ApplicationContext laden</title>
		<link>http://wap.ecw.de/archives/1355</link>
		<comments>http://wap.ecw.de/archives/1355#comments</comments>
		<pubDate>Tue, 13 Jul 2010 12:55:46 +0000</pubDate>
		<dc:creator>Schakko</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[anwendung]]></category>
		<category><![CDATA[applicationcontext]]></category>
		<category><![CDATA[bean]]></category>
		<category><![CDATA[factory]]></category>
		<category><![CDATA[properties]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://wap.ecw.de/?p=1355</guid>
		<description><![CDATA[Für mein gegenwärtiges Freizeit-Projekt OpenRanked war es nötig, dass ich beim Starten der Applikation (Stand-Alone Anwendung ohne Anwendungsserver) ein Pfad zu einer .properties-Datei mit den Einstellungen des Servers übergeben konnte. Damit nun die übergebene .properties-Datei auch in der richtigen zeitlichen Reihenfolge geladen werden konnte, ist folgender Code-Schnipsel nötig: // _xmlFiles = new String[] { &#34;config.xml&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>Für mein gegenwärtiges Freizeit-Projekt <a href="http://sourceforge.net/projects/etqw-openranked">OpenRanked</a> war es nötig, dass ich beim Starten der Applikation (Stand-Alone Anwendung ohne Anwendungsserver) ein Pfad zu einer .properties-Datei mit den Einstellungen des Servers übergeben konnte. Damit nun die übergebene .properties-Datei auch in der richtigen zeitlichen Reihenfolge geladen werden konnte, ist folgender Code-Schnipsel nötig:</p>
<pre class="brush: java;">
// _xmlFiles = new String[] { &quot;config.xml&quot; }
// false = Context noch nicht initalisieren
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(
_xmlFiles, false);
// PropertyPlacer aufsetzen, so dass die Konfiguration geladen werden kann
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
Resource resource  = ac.getResource(&quot;my.properties&quot;);

if (resource == null)
{
throw new InvalidParameterException(
&quot;Could not load configuration&quot;);
}

// Location setzen
cfg.setLocation(resource);
// Dem ApplicationContext den PostProcessor anfügen
ac.getBeanFactoryPostProcessors().add(cfg);

// ApplicationContext (neu) laden
ac.refresh();
</pre>
<p>Warum ich das poste? Die Spring-Dokumentation schlägt vor, dass anstatt <em>ac.getBeanFactoryPostProcessors()</em> <em>cfg.setBeanFactory(ac.getBeanFactory())</em> benutzt werden soll. Das funktioniert aber nicht, weil in dem Moment der ApplicationContext noch gar nicht geladen wurde und es dann zu Exceptions kommt.</p>
]]></content:encoded>
			<wfw:commentRss>http://wap.ecw.de/archives/1355/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
