<?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>AGYNAMIX &#187; Programming</title>
	<atom:link href="http://www.agynamix.de/blog/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agynamix.de</link>
	<description>Passionate Software</description>
	<lastBuildDate>Wed, 06 Jul 2011 06:28:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Synchronize your media library with iTunes</title>
		<link>http://www.agynamix.de/blog/synchronize-your-media-library-with-itunes/</link>
		<comments>http://www.agynamix.de/blog/synchronize-your-media-library-with-itunes/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 18:12:28 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[media]]></category>

		<guid isPermaLink="false">http://www.agynamix.de/?p=717</guid>
		<description><![CDATA[This article will show you how you can synchronize your media library (movies, tv shows and iTunes shows at the moment) with iTunes. Background: To understand my solution I&#8217;d like to share with you how my media setup works: I use eyeTV (great program btw) to record movies and tv shows. I then use Toast [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>This article will show you how you can synchronize your media library (movies, tv shows and iTunes shows at the moment) with iTunes.</p>
<h3>Background:</h3>
<p>To understand my solution I&#8217;d like to share with you how my media setup works:</p>
<p>I use eyeTV (great program btw) to record movies and tv shows. I then use Toast to cut out commercials and convert the file into Apple TV format. I then copy the media files unto a NAS (Drobo in my case) into a predefined directory structure (see below).</p>
<p>To watch shows through Apple TV I first have to import them into my Mac Mini (the same that records the shows). I then have the Mac Mini connected to the Apple TV and let it stream media into the living room. So for that purpose the Apple TV is just an overly expensive iTunes connector that just works&#8230;</p>
<h3>How does it work:</h3>
<p>In order to have an automated process (synchronize your current media library with the iTunes library) I have written a small piece of software that does just that. iTunesMediaImport is a Java based cross platform software that is freely available at <a href="http://code.google.com/p/itunesmediaimport/">http://code.google.com/p/itunesmediaimport/</a></p>
<p>When it runs it parses a defined directory structure, dissects the file and directory name and creates a proper iTunes entry. iTunesMediaImport is started from a command line terminal.</p>
<h3>Directory Structure:</h3>
<p>The important thing is that the media archive directory structure is what iTunesMediaImport expects. It knows 3 different kind of media types: iTunes shows, movies you recorded yourself and self recorded TV shows.</p>
<h4>iTunes Shows:</h4>
<p>For iTunes shows you point the variable &#8220;itunesShowsPath.x&#8221; (x is a unique number) straight to the &#8220;TV shows&#8221; folder. The content of that folder should be the folders of your iTunes shows.</p>
<h4>Movies:</h4>
<p>For movies point &#8220;moviePath.x&#8221; to a folder that contains genre folders. Each genre folder contains the movie files that you file under that genre.</p>
<p>So in my case I point the variable (from etc/mediaimport.properties) to: &#8220;/Volumes/Drobo/Mediathek/Movies&#8221;. This folder contains genre folders like &#8220;Adventure&#8221;, &#8220;Action&#8221;, &#8220;Comedy&#8221;. You can have as many and name them as you see fit. When the movie is imported into iTunes it will be filed under a genre category with that name. Then the genre folder contains your movie files. The file name of the movie will be used as it&#8217;s name in iTunes.</p>
<h4>TV Shows:</h4>
<p>TV shows are handled much like movies except there is another directory layer, the season folder.</p>
<p>In mediaimport.properties you find a key &#8220;tvSeriesPath.x&#8221; that points to a directory that forms the root of my tv shows archive, &#8220;/Volumes/Drobo/Mediathek/TV Series&#8221; in my case.</p>
<p>Then this folder contains the names of my tv shows, like &#8220;Bones&#8221;, &#8220;Stargate&#8221; or whatever your poison is. Now under that folder you need to define another folder named &#8220;S&lt;season number&gt;&#8221;, so &#8220;Stargate/S3/&#8221; would be the 3rd season of Stargate.</p>
<p>Under the season folder  you file the tv shows that belong to that season, for instance: &#8220;Stargate 11 &#8211; Tokra.m4v&#8221;. iTunesMediaImport will parse the file name backwards and stop at the first dash (&#8216;-&#8217;) it finds. If it finds a number after the dash (looking towards the beginning of the filename) that number will become the show number in iTunes. The part after the dash until the end of the file name (except the .m4v extension) will become the name of the show.</p>
<p>&#8212;</p>
<p>iTunesMediaImport will keep a log of media files it has added into iTunes in order to avoid processing them over and over again. It will also delete shows from iTunes that have been deleted or renamed in your archive.</p>
<p>I invite you to give it a try, if you want you are welcome to contribute to it on Google Code. There&#8217;s also a forum for it <a href="http://helpdesk.agynamix.de/index.php?pg=forums.topics&amp;id=6">here</a>.</p>
<p>Have fun!</p>
<h4>References:</h4>
<ul>
<li>iTunesMediaImport on Google Code: <a href="http://code.google.com/p/itunesmediaimport/">http://code.google.com/p/itunesmediaimport/</a></li>
<li>iTunesMediaImport forum: <a href="http://helpdesk.agynamix.de/index.php?pg=forums.topics&amp;id=6">http://helpdesk.agynamix.de/index.php?pg=forums.topics&amp;id=6</a></li>
<li>My website: <a href="http://www.agynamix.de">http://www.agynamix.de</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/synchronize-your-media-library-with-itunes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Use ASP.NET Forms Authentication with local Windows Users</title>
		<link>http://www.agynamix.de/blog/use-asp-net-forms-authentication-with-local-windows-users/</link>
		<comments>http://www.agynamix.de/blog/use-asp-net-forms-authentication-with-local-windows-users/#comments</comments>
		<pubDate>Sat, 08 May 2010 11:46:04 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.agynamix.de/?p=703</guid>
		<description><![CDATA[This article shows you how to build your own MembershipProvider to authenticate users of your ASP.NET 2.0 web application against Windows user accounts using Forms authentication and the Win32 API method LogonUser.]]></description>
			<content:encoded><![CDATA[<p></p><h2>Summary</h2>
<p>This article shows you how to build your own MembershipProvider to authenticate users of your ASP.NET 2.0 web application against Windows user accounts using Forms authentication and the Win32 API method LogonUser.</p>
<p><span id="more-703"></span></p>
<p>A few years back I developed a small ASP.NET 2.0 application for my customer. The requirement at that time was to authenticate users against ActiveDirectory. We did this using Forms authentication and the ADMembershipProvider that comes with the .NET framework. You would use the Web.config configuration file to define the access string and other parameters for ActiveDirectory access&#8230;</p>
<p>But that&#8217;s not the topic of this post&#8230; Anyway a few weeks ago that same customer asked me to change the authentication in order to validate against Windows user accounts.<br />
At first I had a hard time finding a way to use forms authentication in combination with Windows accounts. But eventually I found a few websites (for instance: here) that gave me the right clue:<br />
There is a Win32 function called LogonUser that can be used to validate the users credentials.</p>
<p>I used that API method in a self made MembershipProvider (WinNTMembershipProvider) to implement an exchangeable authentication mechanism. Then, in Web.config I referenced that new MembershipProvider. That way I didn&#8217;t have to change anything within the existing application, just a configuration change.</p>
<p>Here&#8217;s the essential part of the MembershipProvider that uses the LogonUser API method:</p>
<p>You first need to announce the use of the LogonUser method:</p>
<pre>
<div class="codesnip-container" >
<div class="csharp codesnip" style="font-family:monospace;"><span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;ADVAPI32.dll&quot;</span>, EntryPoint <span class="sy0">=</span> <span class="st0">&quot;LogonUserW&quot;</span>, SetLastError <span class="sy0">=</span> <span class="kw1">true</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CharSet <span class="sy0">=</span> CharSet.<span class="kw1">Auto</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">extern</span> <span class="kw4">bool</span> LogonUser<span class="br0">&#40;</span><span class="kw4">string</span> lpszUsername, <span class="kw4">string</span> lpszDomain,
<span class="kw4">string</span> lpszPassword, <span class="kw4">int</span> dwLogonType, <span class="kw4">int</span> dwLogonProvider, <span class="kw1">ref</span> IntPtr phToken<span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
</pre>
<p>Then, within the ValidateUser method you try to log that user into the system:</p>
<pre>
<div class="codesnip-container" >
<div class="csharp codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ValidateUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strPassword<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw4">bool</span> bSuccessfulLogin <span class="sy0">=</span> false<span class="sy0">;</span>
IntPtr token <span class="sy0">=</span> IntPtr.<span class="me1">Zero</span><span class="sy0">;</span>

<span class="co1">//userName, domainName and Password parameters are very obvious.</span>
<span class="coMULTI">/* dwLogonType (3rd parameter): I used LOGON32_LOGON_INTERACTIVE, This logon type is
intended for users who will be interactively using the computer, such as a user being
logged on by a terminal server, remote shell, or similar process. This logon type has
the additional expense of caching logon information for disconnected operations. For
more details about this parameter please see http://msdn.microsoft.com/en-
us/library/aa378184(VS.85).aspx */</span>

<span class="coMULTI">/* dwLogonProvider (4th parameter) : I used LOGON32_PROVIDER_DEFAUL, This provider
uses the standard logon provider for the system. The default security provider is
negotiate, unless you pass NULL for the domain name and the user name is not in UPN
format. In this case, the default provider is NTLM. For more details about this
parameter please see http://msdn.microsoft.com/en-us/library/aa378184(VS.85).aspx */</span>
<span class="coMULTI">/* phToken (5th parameter): A pointer to a handle variable that receives a handle to
a token that represents the specified user. We can use this handler for impersonation
purpose. */</span>

bSuccessfulLogin <span class="sy0">=</span> LogonUser<span class="br0">&#40;</span>strName, _userDomain, strPassword, _logonType, 0, <span class="kw1">ref</span> token<span class="br0">&#41;</span><span class="sy0">;</span>

<span class="kw1">return</span> bSuccessfulLogin<span class="sy0">;</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>The next thing is to reference the MembershipProvider in Web.config:</p>
<pre>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc-1">&lt;!-- userDomain: Domain in which the user is looked up</span>
<span class="sc-1"> &nbsp; &nbsp; logonType: 2 - Interactive, 3 - Network &nbsp;--&gt;</span>
<span class="sc3"><span class="re1">&lt;membership</span> <span class="re0">defaultProvider</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;providers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;add</span> <span class="re0">name</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">type</span>=<span class="st0">&quot;my_package.WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">applicationName</span>=<span class="st0">&quot;Sessiondatenserver&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">description</span>=<span class="st0">&quot;Checks Username and Password against valid Windows users of a given domain&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">userDomain</span>=<span class="st0">&quot;USER_DOMAIN&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">logonType</span>=<span class="st0">&quot;3&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp;<span class="re2">/&gt;</span></span>
&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/providers<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/membership<span class="re2">&gt;</span></span></span></div>
</div>
</pre>
<p>Here&#8217;s the complete source code for WinNTMembershipProvider:</p>
<p>Please note that most of the boilerplate here is not needed for our example, it&#8217;s just needed to fullfill the MembershipProvider contract.</p>
<pre>
<div class="codesnip-container" >
<div class="csharp codesnip" style="font-family:monospace;"><span class="kw1">using</span> <span class="co3">System</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Collections.Generic</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Text</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Web</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Web.Security</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Runtime.InteropServices</span><span class="sy0">;</span>

<span class="kw1">namespace</span> my_package
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">class</span> WinNTMembershipProvider <span class="sy0">:</span> MembershipProvider
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;ADVAPI32.dll&quot;</span>, EntryPoint <span class="sy0">=</span> <span class="st0">&quot;LogonUserW&quot;</span>, SetLastError <span class="sy0">=</span> <span class="kw1">true</span>,
&nbsp; &nbsp; &nbsp; &nbsp; CharSet <span class="sy0">=</span> CharSet.<span class="kw1">Auto</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">extern</span> <span class="kw4">bool</span> LogonUser<span class="br0">&#40;</span><span class="kw4">string</span> lpszUsername, <span class="kw4">string</span> lpszDomain,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">string</span> lpszPassword, <span class="kw4">int</span> dwLogonType, <span class="kw4">int</span> dwLogonProvider, <span class="kw1">ref</span> IntPtr phToken<span class="br0">&#41;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">String</span> _strName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">String</span> _strApplicationName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">String</span> _userDomain<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _logonType<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolEnablePasswordReset<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolEnablePasswordRetrieval<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _intMaxInvalidPasswordAttempts<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _intMinRequiredAlphanumericCharacters<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _intMinRequiredPasswordLength<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> MembershipPasswordFormat _oPasswordFormat<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">string</span> _strPasswordStrengthRegularExpression<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolRequiresQuestionAndAnswer<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolRequiresUniqueEMail<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> WinNTMembershipProvider<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strName <span class="sy0">=</span> <span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strApplicationName <span class="sy0">=</span> <span class="st0">&quot;DefaultApp&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _userDomain <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _logonType <span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="co1">// Interactive by default</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolEnablePasswordReset <span class="sy0">=</span> false<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolEnablePasswordRetrieval <span class="sy0">=</span> false<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolRequiresQuestionAndAnswer <span class="sy0">=</span> false<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolRequiresUniqueEMail <span class="sy0">=</span> false<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _intMaxInvalidPasswordAttempts <span class="sy0">=</span> <span class="nu0">3</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _intMinRequiredAlphanumericCharacters <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _intMinRequiredPasswordLength <span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strPasswordStrengthRegularExpression <span class="sy0">=</span> <span class="st_h">@&quot;[\w| !§$%&amp;amp;/()=\-?\*]*&quot;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _oPasswordFormat <span class="sy0">=</span> MembershipPasswordFormat.<span class="me1">Clear</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//DFB: reads entries from web.config and initializes this class from those values</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &nbsp;Once the provider is loaded, the</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &nbsp;runtime calls Initialize and passes the settings as name-value</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &nbsp;pairs in an instance of the NameValueCollection class.</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw1">void</span> Initialize<span class="br0">&#40;</span><span class="kw4">string</span> name, <span class="kw5">System.<span class="me1">Collections</span></span>.<span class="me1">Specialized</span>.<span class="me1">NameValueCollection</span> config<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>config <span class="sy0">==</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> ArgumentNullException<span class="br0">&#40;</span><span class="st0">&quot;config&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">IsNullOrEmpty</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name <span class="sy0">=</span> <span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">IsNullOrEmpty</span><span class="br0">&#40;</span>config<span class="br0">&#91;</span><span class="st0">&quot;description&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; config.<span class="me1">Remove</span><span class="br0">&#40;</span><span class="st0">&quot;description&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; config.<span class="me1">Add</span><span class="br0">&#40;</span><span class="st0">&quot;description&quot;</span>, <span class="st0">&quot;WinNT Membership Provider&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">base</span>.<span class="me1">Initialize</span><span class="br0">&#40;</span>name, config<span class="br0">&#41;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> key <span class="kw1">in</span> config.<span class="me1">Keys</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>key.<span class="me1">ToLower</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;name&quot;</span><span class="sy0">:</span> _strName <span class="sy0">=</span> config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;applicationname&quot;</span><span class="sy0">:</span> _strApplicationName <span class="sy0">=</span> config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;userdomain&quot;</span><span class="sy0">:</span> _userDomain <span class="sy0">=</span> config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;logontype&quot;</span><span class="sy0">:</span> _logonType <span class="sy0">=</span> <span class="kw4">int</span>.<span class="me1">Parse</span><span class="br0">&#40;</span>config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ValidateUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strPassword<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> bSuccessfulLogin <span class="sy0">=</span> false<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IntPtr token <span class="sy0">=</span> IntPtr.<span class="me1">Zero</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//userName, domainName and Password parameters are very obvious.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* dwLogonType (3rd parameter): I used LOGON32_LOGON_INTERACTIVE, This logon type is
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intended for users who will be interactively using the computer, such as a user being
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logged on by a terminal server, remote shell, or similar process. This logon type has
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the additional expense of caching logon information for disconnected operations. For
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; more details about this parameter please see http://msdn.microsoft.com/en-
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; us/library/aa378184(VS.85).aspx */</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* dwLogonProvider (4th parameter) : I used LOGON32_PROVIDER_DEFAUL, This provider
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uses the standard logon provider for the system. The default security provider is
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; negotiate, unless you pass NULL for the domain name and the user name is not in UPN
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; format. In this case, the default provider is NTLM. For more details about this
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parameter please see http://msdn.microsoft.com/en-us/library/aa378184(VS.85).aspx */</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* phToken (5th parameter): A pointer to a handle variable that receives a handle to
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a token that represents the specified user. We can use this handler for impersonation
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; purpose. */</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bSuccessfulLogin <span class="sy0">=</span> LogonUser<span class="br0">&#40;</span>strName, _userDomain, strPassword, _logonType, 0, <span class="kw1">ref</span> token<span class="br0">&#41;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> bSuccessfulLogin<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Properties
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ApplicationName
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _strApplicationName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strApplicationName <span class="sy0">=</span> value<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> Name
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _strName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> EnablePasswordReset
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolEnablePasswordReset<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> EnablePasswordRetrieval
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolEnablePasswordRetrieval<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> MaxInvalidPasswordAttempts
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _intMaxInvalidPasswordAttempts<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> MinRequiredNonAlphanumericCharacters
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _intMinRequiredAlphanumericCharacters<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> MinRequiredPasswordLength
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _intMinRequiredPasswordLength<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> PasswordAttemptWindow
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipPasswordFormat PasswordFormat
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _oPasswordFormat<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> PasswordStrengthRegularExpression
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _strPasswordStrengthRegularExpression<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> RequiresQuestionAndAnswer
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolRequiresQuestionAndAnswer<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> RequiresUniqueEmail
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolRequiresUniqueEMail<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* API Functions
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> GetPassword<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strAnswer<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUser CreateUser<span class="br0">&#40;</span><span class="kw4">string</span> username, <span class="kw4">string</span> password, <span class="kw4">string</span> email, <span class="kw4">string</span> passwordQuestion,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> passwordAnswer, <span class="kw4">bool</span> isApproved, <span class="kw4">object</span> userId, <span class="kw1">out</span> MembershipCreateStatus status<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> GetUserNameByEmail<span class="br0">&#40;</span><span class="kw4">string</span> strEmail<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ResetPassword<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strAnswer<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ChangePassword<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strOldPwd, <span class="kw4">string</span> strNewPwd<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> GetNumberOfUsersOnline<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ChangePasswordQuestionAndAnswer<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strPassword, <span class="kw4">string</span> strNewPwdQuestion, <span class="kw4">string</span> strNewPwdAnswer<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUser GetUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">bool</span> boolUserIsOnline<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> DeleteUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">bool</span> boolDeleteAllRelatedData<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUserCollection FindUsersByEmail<span class="br0">&#40;</span><span class="kw4">string</span> strEmailToMatch, <span class="kw4">int</span> iPageIndex, <span class="kw4">int</span> iPageSize, <span class="kw1">out</span> <span class="kw4">int</span> iTotalRecords<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUserCollection FindUsersByName<span class="br0">&#40;</span><span class="kw4">string</span> strUsernameToMatch, <span class="kw4">int</span> iPageIndex, <span class="kw4">int</span> iPageSize, <span class="kw1">out</span> <span class="kw4">int</span> iTotalRecords<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUserCollection GetAllUsers<span class="br0">&#40;</span><span class="kw4">int</span> iPageIndex, <span class="kw4">int</span> iPageSize, <span class="kw1">out</span> <span class="kw4">int</span> iTotalRecords<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw1">void</span> UpdateUser<span class="br0">&#40;</span>MembershipUser user<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> UnlockUser<span class="br0">&#40;</span><span class="kw4">string</span> strUserName<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUser GetUser<span class="br0">&#40;</span><span class="kw4">object</span> providerUserKey, <span class="kw4">bool</span> userIsOnline<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>And the Web.config:</p>
<pre>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span>
<span class="sc3"><span class="re1">&lt;configuration<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>

&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authentication</span> <span class="re0">mode</span>=<span class="st0">&quot;Forms&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;forms</span> <span class="re0">loginUrl</span>=<span class="st0">&quot;Login.aspx&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">timeout</span>=<span class="st0">&quot;30&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">name</span>=<span class="st0">&quot;.AUTHNAME&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">requireSSL</span>=<span class="st0">&quot;true&quot;</span> &nbsp;</span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">slidingExpiration</span>=<span class="st0">&quot;true&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">defaultUrl</span>=<span class="st0">&quot;default.aspx&quot;</span> <span class="re2">/&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authentication<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;deny</span> <span class="re0">users</span>=<span class="st0">&quot;?&quot;</span> <span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span> <span class="re2">/&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>

&nbsp; &nbsp; <span class="sc-1">&lt;!-- userDomain: Domain in which the user is looked up</span>
<span class="sc-1"> &nbsp; &nbsp; &nbsp; &nbsp; logonType: 2 - Interactive, 3 - Network &nbsp;--&gt;</span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;membership</span> <span class="re0">defaultProvider</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;providers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;add</span> <span class="re0">name</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">type</span>=<span class="st0">&quot;my_package.WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">applicationName</span>=<span class="st0">&quot;Sessiondatenserver&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">description</span>=<span class="st0">&quot;Checks Username and Password against valid Windows users of a given domain&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">userDomain</span>=<span class="st0">&quot;USER_DOMAIN&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">logonType</span>=<span class="st0">&quot;3&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/providers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/membership<span class="re2">&gt;</span></span></span>

&nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>

&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the themes and images --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;css&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;image&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the NonSSL directory --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;NonSSL&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the help --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;help.aspx&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the imprint --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;Imprint.aspx&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;/configuration<span class="re2">&gt;</span></span></span></div>
</div>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/use-asp-net-forms-authentication-with-local-windows-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Tip: How to find the location of a class being executed</title>
		<link>http://www.agynamix.de/blog/find-location-of-a-class/</link>
		<comments>http://www.agynamix.de/blog/find-location-of-a-class/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 13:51:25 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=223</guid>
		<description><![CDATA[Today I wanted to find the location of a class file to make sure the class is really called from a specific jar file (old project with historically grown piles of archaeologically valuable code). Turns out this is pretty easy. For instance within the class you log the result of the following statement: URI uri [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Today I wanted to find the location of a class file to make sure the class is really called from a specific jar file (old project with historically grown piles of archaeologically valuable code).</p>
<p>Turns out this is pretty easy. For instance within the class you log the result of the following statement:</p>
<pre>URI uri = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()</pre>
<p>This will give you the exact place from witch the class was loaded.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/find-location-of-a-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Tip: Find the call path (stack trace) of a method</title>
		<link>http://www.agynamix.de/blog/method-call-path/</link>
		<comments>http://www.agynamix.de/blog/method-call-path/#comments</comments>
		<pubDate>Wed, 13 May 2009 13:18:30 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=215</guid>
		<description><![CDATA[Here is a little tip that can save you some time and trouble every now and then. Sometimes when hunting down bugs it is necessary to find out the path a method is called from in order to determine the root of a problem. Here&#8217;s how you do this quiet easily. In there method that [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Here is a little tip that can save you some time and trouble every now and then.</p>
<p>Sometimes when hunting down bugs it is necessary to find out the path a method is called from in order to determine the root of a problem.</p>
<p>Here&#8217;s how you do this quiet easily. In there method that you observe add the following:</p>
<pre>System.out.println("I'm here:");
Exception e = new Exception();
e.printStackTrace();</pre>
<p>If you have a logger in place which you should you could write it this way:</p>
<pre>log.isDebugEnabled() {
   log.debug("Call of Method X", new Exception());
}</pre>
<p>The logger will only process the expensive part of creating the exception<br />
and retrieving the stack trace if it will be written somewhere.</p>
<p>Remember, exceptions are just Java classes with some built in behavior. You can create and use them and also subclass and extend them. Sometimes it is useful to create custom exceptions that carry additional meaningful information that your code needs in order to resolve the problematic situation that caused the exception.</p>
<p>But who keeps you from creating an exception and not throwing it- just use some of its powers&#8230;</p>
<p style="text-align: left;">–</p>
<address style="text-align: left;">My name is Torsten Uhlmann, I’m founder of <a href="http://www.agynamix.de/">AGYNAMIX</a>, a tiny (sooo tiiiny its just me) software company specializing in Java software consulting for larger corporations.</address>
<address style="text-align: left;">I also develop <a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.simidude.com');" href="http://www.simidude.com/">Simidude</a>, an easy to use cross platform network clipboard and Drag &amp; Drop tool which you might happen to find useful.</address>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/method-call-path/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jira and Confluence $5 each (for the next 5 days)</title>
		<link>http://www.agynamix.de/blog/jira-and-confluence-5-each-for-the-next-5-days/</link>
		<comments>http://www.agynamix.de/blog/jira-and-confluence-5-each-for-the-next-5-days/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 08:12:31 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[bug tracking]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=206</guid>
		<description><![CDATA[Balsamiq twittered it first and I&#8217;d like to repeat this great offer of Atlassian here: Until Friday, April 24 you can get Jira And Confluence for a price of $5 each for five users. Don&#8217;t nail me down on the specific time though- Atlassian is to my knowledge an Australian company and I don&#8217;t know [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://twitter.com/balsamiq">Balsamiq</a> twittered it first and I&#8217;d like to repeat this great offer of Atlassian here:</p>
<p>Until Friday, April 24 you can get Jira And Confluence for a price of $5 each for five users. Don&#8217;t nail me down on the specific time though- Atlassian is to my knowledge an Australian company and I don&#8217;t know which time zone they use for there offer&#8230;</p>
<p>Jira is a Java-based Enterprise grade bug tracking system, and Confluence is an Enterprise wiki with every feature in it you could dream of but where afraid to ask.</p>
<p>So if you are a startup you may want to take advantage of this great offer: <a href="http://www.atlassian.com/starter/">http://www.atlassian.com/starter/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/jira-and-confluence-5-each-for-the-next-5-days/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A simple and free MP3 Tag Editor</title>
		<link>http://www.agynamix.de/blog/simple-and-free-mp3-tag-editor/</link>
		<comments>http://www.agynamix.de/blog/simple-and-free-mp3-tag-editor/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 17:49:27 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=202</guid>
		<description><![CDATA[I had some code laying around on my hard disk and thought it might be a good idea to clean it up and release it- so maybe this one is of help for others. I once had a need for a simple MP3 tag editor that I could throw a podcast file upon and have [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I had some code laying around on my hard disk and thought it might be a good idea to clean it up and release it- so maybe this one is of help for others.</p>
<p>I once had a need for a simple MP3 tag editor that I could throw a podcast file upon and have an easy way to change it&#8217;s essential tags.</p>
<p>It&#8217;s a pretty easy tool, it comes with an easy to use installer. Just install, open it, choose a file, edit the tags, save the file and done. Nothing fancy, just useful <img src='http://www.agynamix.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here&#8217;s a screenshot of the thing:</p>
<p><a href="http://v2.agynamix.de/wp-content/uploads/2009/03/taginspector.jpg"><img class="alignnone size-medium wp-image-203" title="TagInspector Screenshot" src="http://blog.agynamix.de/wp-content/uploads/2009/03/taginspector-300x241.jpg" alt="" width="300" height="241" /></a></p>
<p>Please note that TagInspector only runs on Windows and requires the .Net framework. I did this as a learning project to do something practically with C#- before I put the books back in the shelf.</p>
<p>Ah, right, here is the <a href="http://cms.agynamix.de/downloads/cat_view-2.html">download URL</a>. While you&#8217;re there you might want to check for other cool software, both free and commercial that I do offer&#8230;</p>
<p>Have a great day,</p>
<p>Torsten.</p>
<p style="text-align: left;">–</p>
<address style="text-align: left;">My name is Torsten Uhlmann, I’m founder of <a href="http://www.agynamix.de/">AGYNAMIX</a>, a tiny (sooo tiiiny its just me) software company specializing in Java software consulting for larger corporations.</address>
<address style="text-align: left;">I also develop <a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.simidude.com');" href="http://www.simidude.com/">Simidude</a>, a cross platform network clipboard and Drag&amp;Drop tool which you might happen to find useful.</address>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/simple-and-free-mp3-tag-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 2.6, safe_mode and file uploads</title>
		<link>http://www.agynamix.de/blog/wordpress-26-safe_mode-and-file-uploads/</link>
		<comments>http://www.agynamix.de/blog/wordpress-26-safe_mode-and-file-uploads/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 11:08:17 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=149</guid>
		<description><![CDATA[Since I&#8217;m (most of the time) a responsible internet user I try to keep my web applications up to date. In this article I describe how you can keep WordPress up to date with updates directly from the source. Now I&#8217;ve done that for this blog and my new Simidude website. All went well, software [...]]]></description>
			<content:encoded><![CDATA[<p></p><p style="text-align: left;">Since I&#8217;m (most of the time) a responsible internet user I try to keep my web applications up to date.</p>
<p style="text-align: left;">In <a href="http://blog.agynamix.de/blog/2008/keep-wordpress-up-to-date-with-subversion/">this article</a> I describe how you can keep WordPress up to date with updates directly from the source. Now I&#8217;ve done that for this blog and my new <a href="http://www.simidude.com">Simidude website</a>. All went well, software got updated and I got a good feeling knowing I did something for peace on the internet.</p>
<p style="text-align: left;">Now these days I wanted to write some new articles including some charming images. Images in posts are great because the just make the post more pleasant.</p>
<p style="text-align: left;">So I cheerfully wrote some text about our <a href="http://www.simidude.com/blog/2008/simidude-screenshots/">new baby boy &#8220;Sim&#8221;</a> whom I like to call Simi dude and I also wanted to include some screenshots about how he looks by now so that, in a few weeks or so, people would see how fast he has grown and become a real boy.</p>
<p style="text-align: left;">Hm, suddenly WordPress bombards me with the following error message while I was trying to upload a foto:</p>
<blockquote style="text-align: left;"><p>Unable to create directory &#8220;[...]/uploads/2008/11&#8243;. Is its parent directory writeable by server?</p></blockquote>
<p style="text-align: left;">Of course it is writable! And sure enough it worked a few weeks ago. (well actually month- the last time I uploaded an image into this blog was in May. I&#8217;m ashamed.)</p>
<p style="text-align: left;">Since I&#8217;m running a real root server with ssh access I went to the server and toyed with the Unix file permissions. So I tried setting the wp-content directory world-writable (777). No effect, same error message. FYI I changed the settings back- no need to hack the server&#8230;</p>
<p style="text-align: left;">Then I realized the following:</p>
<p><a href="http://v2.agynamix.de/wp-content/uploads/2008/11/linstow_006.jpg"><img class="alignright size-medium wp-image-151" title="linstow_006" src="http://blog.agynamix.de/wp-content/uploads/2008/11/linstow_006-224x300.jpg" alt="" width="224" height="300" align="right"/></a></p>
<p style="text-align: left;">The uploads directory was owned by web4.www-data. web4 is my user account on the machine, www-data is the user and group of the Apache server (standard on Debian based systems).</p>
<p style="text-align: left;">A directory &#8220;2008&#8243; was actually created with the owner &#8220;www-data.www-data&#8221; because it had been created by the Apache server through the PHP script. Just the &#8220;11&#8243; directory could not be created. So I did this by hand, setting ownership to www-data.www-data. Now I rushed over to the upload dialog being pretty sure it would work now. No luck! Still I received an error message (see above) that this directory could not be created.</p>
<p style="text-align: left;">After spending some time with my friend Google and reading helpless posts that sugessted setting the file permissions to 777 and don&#8217;t care about the rest I came across some explanation of PHP safe_mode (did I mention I use safe_mode on)?</p>
<p style="text-align: left;">What matters here is that safe_mode checks if the executed script belongs to the same owner as the directory it writes into. Now my WordPress installation belongs to web4.www-data so that I could use FTP or SSH to connect as user web4 and actually have write permission.</p>
<p style="text-align: left;">So the script that uploads the image tries to create the directory &#8220;2008&#8243;. That works because the parent directory, &#8220;uploads&#8221;, belong to web4.www-data. But the created directory &#8220;2008&#8243; is now owned by www-data.www-data because it was created by the Apache server. When it tries to create &#8220;11&#8243; inside &#8220;2008&#8243; it fails miserably because &#8220;2008&#8243; is not owned by web4.</p>
<p style="text-align: left;">After creating the directory &#8220;11&#8243; by hand and changing the ownership of &#8220;2008&#8243; and &#8220;11&#8243; to web4.www-data I was able to upload images!</p>
<p style="text-align: left;">Now for a somewhat permanent solution because I don&#8217;t want to go to my server each month and create a new directory by hand:</p>
<p style="text-align: left;">Apparently there is a setting in php.ini which tells the safe_mode to not just look at the owner of a file but also the goup of it. The setting is called:</p>
<blockquote style="text-align: left;"><p><strong>safe_mode_gid = On</strong></p></blockquote>
<p style="text-align: left;">It was Off in my case. After changing it and restarting Apache I could readily create directories and upload images.</p>
<p style="text-align: left;">Now if you can&#8217;t change that setting because you don&#8217;t have root access it might also work if you can change the ownership of your WordPress php files to www-data.www-data. Because after you&#8217;ve done that the user of the script and of the created directory would match again.</p>
<p style="text-align: left;">Hope this saves some of your time!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/wordpress-26-safe_mode-and-file-uploads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Initialize SWT Action accelerators in SWT 3.4</title>
		<link>http://www.agynamix.de/blog/initialize-swt-action-accelerators-in-swt-34/</link>
		<comments>http://www.agynamix.de/blog/initialize-swt-action-accelerators-in-swt-34/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 08:10:17 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=139</guid>
		<description><![CDATA[While developing my new application Simidude I ran about a funny problem with JFace&#8217;s MenuManager. I develop Simidude (an easy to use cross platform clipboard synchronizer and Drag &#38; Drop tool- it&#8217;s exciting, you should look at it ) using Java 5 and the SWT/JFace libraries from Eclipse. SWT provides Java with a platform specific [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>While developing my new application <a href="http://www.simidude.com">Simidude</a> I ran about a funny problem with JFace&#8217;s MenuManager.</p>
<p>I develop Simidude (an easy to use cross platform clipboard synchronizer and Drag &amp; Drop tool- it&#8217;s exciting, <a href="http://www.simidude.com">you should look at it</a> <img src='http://www.agynamix.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) using Java 5 and the SWT/JFace libraries from <a href="http://www.eclipse.org">Eclipse</a>. SWT provides Java with a platform specific look and feel which makes my application appear native on all supported (Windows, Mac and Linux) platforms.</p>
<p>Because I want the application to be small and carry as little overhead as possible I do not use the Eclipse RCP platform but rather just the GUI libraries.</p>
<p>Now when writing a JFace application you subclass ApplicationWindow for your application&#8217;s main window.</p>
<p>To create a menu bar you overwrite the method &#8220;MenuMnager createMenuManager()&#8221; in which you create your top level menu items like &#8220;File&#8221;, &#8220;Edit&#8221; or &#8220;Help&#8221; as well as the Actions that you plug into them. An Action basically wraps up  the information needed to display a menu entry as well as some code to do something. Actions can be reused to be shown in the menubar as well as in the toolbar.</p>
<p>An Action can hold for instance an image object, a tooltip text or an accelerator definition. To set an accelerator for my &#8220;Quit&#8221; action I&#8217;d do something like this:</p>
<blockquote><p>setAccelerator(SWT.MOD1 + &#8216;Q&#8217;);</p></blockquote>
<p>&#8220;SWT.MOD1&#8243; is replaced with the platform specific modifier like &#8220;CTRL&#8221; on Windows and Linux and &#8220;Command&#8221; (Apple key) on Mac.</p>
<p>Now one would expect that you could actually USE this key combination in a running application. Far from it. I had to click on the menu with the mouse, then do something in the application and then the keys would work. Sounds like an initialization problem.</p>
<p>So I filed a bug with Eclipse. Turned out they had &#8220;optimized&#8221; the menu creation code in Eclipse 3.4 which would actually cause this pain. Btw it works fine if you&#8217;re in an Eclipse plugin or RCP applications. And it also works if you&#8217;re using plain SWT and are not using Actions but creating the menu entries the SWT style. Turns out this is some weird JFace initialization thing.</p>
<p>But the good news is there is a workaround: After creating your menubar you need to <strong>initialize</strong> it. This is my initialization routine which is called in the beginning of the life cycle:</p>
<blockquote><p>public void initializeApplicationGUI()<br />
{<br />
makeActions();<br />
addMenuBar();<br />
addToolBar(SWT.TOP | SWT.FLAT | SWT.HORIZONTAL | SWT.SHADOW_OUT );<br />
addStatusLine();<br />
<strong>create();<br />
getMenuBarManager().updateAll(true);</strong><br />
}</p></blockquote>
<p>If you add the last two lines suddenly your menu flies. I don&#8217;t know how long I digged around for such a stupid bug&#8230;</p>
<p>Anyway I hope I could save some of your time!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/initialize-swt-action-accelerators-in-swt-34/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Announce: DobuDish version 1.1.1 released</title>
		<link>http://www.agynamix.de/blog/announce-dobudish-version-111-released/</link>
		<comments>http://www.agynamix.de/blog/announce-dobudish-version-111-released/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 10:19:16 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[dobudish]]></category>
		<category><![CDATA[Docbook]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=138</guid>
		<description><![CDATA[Hi all, I have just released version 1.1.1 of DobuDish. Changes to the prior version include bug fixes with the new global hooks as well an improved documentation to include all available hooks with a tiny description. Please get DobuDish at http://cms.agynamix.de/downloads/cat_view-2.html Enjoy, Torsten.]]></description>
			<content:encoded><![CDATA[<p></p><p>Hi all,</p>
<p>I have just released version 1.1.1 of DobuDish.<br />
Changes to the prior version include bug fixes with the new global hooks as well an improved documentation to include all available hooks with a tiny description.</p>
<p>Please get DobuDish at <a title="http://cms.agynamix.de/downloads/cat_view-2.html" href="http://cms.agynamix.de/downloads/cat_view-2.html" target="_blank">http://cms.agynamix.de/downloads/cat_view-2.html</a></p>
<p>Enjoy,<br />
Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/announce-dobudish-version-111-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announce: Version 1.1.0 of DobuDish released</title>
		<link>http://www.agynamix.de/blog/announce-version-110-of-dobudish-released/</link>
		<comments>http://www.agynamix.de/blog/announce-version-110-of-dobudish-released/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 10:56:49 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[Docbook]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=137</guid>
		<description><![CDATA[Hi all, today I released version 1.1.0 of DobuDish. The change: I have added new global-[pre/post] targets to DobuDish as well as an initially empty file &#8220;system/etc/build-user-augments.xml&#8221; which is supposed to hold user defined actions for the global targets. The logic is as follow: first try to execute a local target if that does not [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Hi all,</p>
<p>today I released version 1.1.0 of DobuDish. The change:</p>
<p>I have added new global-[pre/post] targets to DobuDish as well as an initially empty file &#8220;system/etc/build-user-augments.xml&#8221; which is supposed to hold user defined actions for the global targets. The logic is as follow:</p>
<ul>
<li>first try to execute a local target</li>
<li>if that does not exist, try to execute the corresponding global target. That way you can overwrite global actions with local ones. Please note if a local action is found, the corresponding global action is not executed- unless you explicitely call it inside the local action.</li>
</ul>
<p>You can download DobuDish at the <a href="http://cms.agynamix.de/downloads/cat_view-2.html">usual place</a>.</p>
<p>Enjoy,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/announce-version-110-of-dobudish-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announce: Dopus renamed to DobuDish</title>
		<link>http://www.agynamix.de/blog/announce-dopus-renamed-to-dobudish/</link>
		<comments>http://www.agynamix.de/blog/announce-dopus-renamed-to-dobudish/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 19:55:29 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[Docbook]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=136</guid>
		<description><![CDATA[Dear Dopus user, yesterday I have uploaded a new version of Dopus under its new name, DobuDish. I have renamed the Docbook Framework to resolve a naming conflict with the original Dopus software. This release features new Ant hooks called during the creation of a new document. Now that these things are in order I [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Dear Dopus user,</p>
<p>yesterday I have uploaded a new version of Dopus under its new name, DobuDish.</p>
<p>I have renamed the Docbook Framework to resolve a naming conflict with the <a href="http://www.gpsoft.com.au/Intro.html">original Dopus software</a>.</p>
<p>This release features new Ant hooks called during the creation of a new document.</p>
<p>Now that these things are in order I have decided to release this new version as 1.0.0.</p>
<p>As always you can getDobuDish at our <a href="http://cms.agynamix.de/downloads/cat_view-2.html">download side</a>.</p>
<p>Enjoy,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/announce-dopus-renamed-to-dobudish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announce: Dopus 0.9.16 released</title>
		<link>http://www.agynamix.de/blog/announce-dopus-0916-released/</link>
		<comments>http://www.agynamix.de/blog/announce-dopus-0916-released/#comments</comments>
		<pubDate>Thu, 01 May 2008 08:46:34 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[Docbook]]></category>
		<category><![CDATA[Dopus]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=122</guid>
		<description><![CDATA[Dear Dopus users, I just release version 0.9.16 of Dopus. This is a bugfix release, with the following enhancements: Fixed bug with the new document.type mechanism. There was an oversight for documents that contain sub documents of a different document type than the main document. In localbuild.properties you can now add additional entries of the [...]]]></description>
			<content:encoded><![CDATA[<p></p><div class="main">
<p>Dear Dopus users,</p>
<p>I just release version 0.9.16 of Dopus. This is a bugfix release, with the following enhancements:</p>
<ul>
<li>Fixed bug with the new document.type mechanism. There was an oversight for documents that contain sub documents of a different document type than the main document. In localbuild.properties you can now add additional entries of the for
<p>document.&lt;file name&gt;.type=article|book|&#8230;</p>
<p>Now when you process your sub document and an entry for this document is found it overwrites the document.type setting.<br />
This also is possible for the master document. So you might set document.type to the default document type and overwrite only those that differ from that one.</li>
</ul>
</div>
<div class="main">
<p>Dopus can be downloaded from the <a href="http://cms.agynamix.de/downloads/cat_view-2.html">usual place</a>.</p>
<p>Enjoy!</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/announce-dopus-0916-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nested properties in Ant</title>
		<link>http://www.agynamix.de/blog/nested-properties-in-ant/</link>
		<comments>http://www.agynamix.de/blog/nested-properties-in-ant/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 18:32:06 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=121</guid>
		<description><![CDATA[Today while scripting my Dopus Ant files I came across a problem with nested properties. Something of the sort ${document.${input.file}.type}. Turns out that Ant cannot do this by default. Yet I found a blog entry that explains how it can be done with newer versions of Ant (those that support macros). I adapted the solution [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Today while scripting my <a href="http://cms.agynamix.de/downloads/cat_view-2.html">Dopus</a> Ant files I came across a problem with nested properties.</p>
<p>Something of the sort <em>${document.${input.file}.type}</em>.</p>
<p>Turns out that Ant cannot do this by default. Yet I found a <a href="http://blog.joerghoh.de/index.php?/archives/93-Ant-Properties-indirekt-aufloesen.html">blog entry</a> that explains how it can be done with newer versions of Ant (those that support macros). I adapted the solution a little bit with the following result:</p>
<blockquote><p>&lt;!&#8211; Needed to resolve a nested property like ${document.${input.file}.type} &#8211;&gt;     <br />&lt;macrodef name=&quot;resolveProperty&quot;&gt;      <br />&#160;&#160;&#160; &lt;attribute name=&quot;property&quot; /&gt;      <br />&#160;&#160;&#160; &lt;attribute name=&quot;value&quot; /&gt;      <br />&#160;&#160;&#160; &lt;sequential&gt;      <br />&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;tmp1.@{property}&quot; value=&quot;document.@{value}.type&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160; &lt;resolveProperty2 property=&quot;@{property}&quot; value=&quot;${tmp1.@{property}}&quot; /&gt;      <br />&#160;&#160;&#160; &lt;/sequential&gt;      <br />&lt;/macrodef&gt; </p>
<p>&lt;macrodef name=&quot;resolveProperty2&quot;&gt;     <br />&#160; &lt;attribute name=&quot;property&quot; /&gt;      <br />&#160; &lt;attribute name=&quot;value&quot; /&gt;      <br />&#160; &lt;sequential&gt;      <br />&#160;&#160;&#160; &lt;property name=&quot;@{property}&quot; value=&quot;${@{value}}&quot; /&gt;      <br />&#160; &lt;/sequential&gt;      <br />&lt;/macrodef&gt; </p>
</blockquote>
<p>Now I can set my property like so:</p>
<blockquote><p>&lt;resolveProperty property=&quot;document.calculated.type&quot; value=&quot;${project.input.file}&quot; /&gt; </p>
</blockquote>
<p>which effectively sets document.calculated.type=${document.${project.input.file}.type}.</p>
<p>Nice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/nested-properties-in-ant/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Nice Developer&#8217;s blog</title>
		<link>http://www.agynamix.de/blog/nice-developers-blog/</link>
		<comments>http://www.agynamix.de/blog/nice-developers-blog/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 10:07:21 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=120</guid>
		<description><![CDATA[Today, while browsing the Business of Software forum I found the blog of fellow Java developer Steve McLeod. The blog is here filled with valuable info to enhance your daily Java development pleasures&#8230;         Enjoy&#8230;]]></description>
			<content:encoded><![CDATA[<p></p><p><img class="alignleft" style="float: left;" src="http://v2.agynamix.de/wp-content/uploads/2008/04/img-1915.jpg" alt="IMG_1915" width="277" height="188" align="right" /></p>
<p>Today, while browsing the <a href="http://discuss.joelonsoftware.com/?biz">Business of Software</a> forum I found the blog of fellow Java developer Steve McLeod. The blog is <a href="http://solidsimplesafe.com/">here</a> filled with valuable info to enhance your daily Java development pleasures&#8230;</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>Enjoy&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/nice-developers-blog/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Announce: Dopus 0.9.15 released</title>
		<link>http://www.agynamix.de/blog/announce-dopus-0915-released/</link>
		<comments>http://www.agynamix.de/blog/announce-dopus-0915-released/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 18:14:23 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=118</guid>
		<description><![CDATA[Dear Dopus user and all those who wish to become one, I just release version 0.9.15 of Dopus. This is a bugfix release, with the following enhancements: There is a new property in localbuild.properties which determines the type of the document. The templates have been adapted but you have to adapt your existing documents yourself. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Dear Dopus user and all those who wish to become one,</p>
<p>I just release version 0.9.15 of Dopus. This is a bugfix release, with the following enhancements:</p>
<ul>
<li>There is a new property in localbuild.properties which determines the type of the document. 				The templates have been adapted but you have to adapt your existing documents yourself. To do that 				please insert into localbuild.properties:
<p>document.type = &lt;doctype&gt;</p>
<p>where &lt;doctype&gt; is one of <span class="emphasis"><em>book, article, set, slides, webpage</em></span>. The old way is still supported but deprecated.</li>
<li>Cleaned up some glitches with the website document type.</li>
</ul>
<p>Dopus can be downloaded from the <a href="http://cms.agynamix.de/downloads/cat_view-2.html">usual place</a>.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/announce-dopus-0915-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Collections API</title>
		<link>http://www.agynamix.de/blog/google-collections-api/</link>
		<comments>http://www.agynamix.de/blog/google-collections-api/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 13:25:05 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=116</guid>
		<description><![CDATA[Recently, while listening to the JavaPosse podcast I learned about the Google Collections API, a collections of enhancements to the original Java codebase. Not unlike Apache commons collections it enhances the Java programming experience in several ways. It&#8217;s definetly  worth checking out. There is a fine tutorial which explains parts of the API with code [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Recently, while listening to the <a href="http://www.javaposse.com/">JavaPosse podcast</a> I learned about the <a href="http://code.google.com/p/google-collections/">Google Collections API</a>, a collections of enhancements to the original Java codebase. Not unlike <a href="http://commons.apache.org/collections/">Apache commons collections</a> it enhances the Java programming experience in several ways.</p>
<p>It&#8217;s definetly  worth checking out. There is a <a href="http://publicobject.com/2007/09/series-recap-coding-in-small-with.html">fine tutorial</a> which explains parts of the API with code sample and explanations.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/google-collections-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announce: Dopus 0.9.14 released</title>
		<link>http://www.agynamix.de/blog/announce-dopus-0914-released/</link>
		<comments>http://www.agynamix.de/blog/announce-dopus-0914-released/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 07:58:29 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=115</guid>
		<description><![CDATA[I wrapped up a new release of Dopus. This release includes a few bugfixes as well as new support for Docbook Website creation. From the release notes: Version 0.9.14 Support for Website creation. The new targets &#8220;ws-tab&#8221; for the creation of tabular website and &#8220;website&#8221; for non tabular websites. If you now create a directory [...]]]></description>
			<content:encoded><![CDATA[<p></p><p class="main">I wrapped up a new release of Dopus.</p>
<p>This release includes a few bugfixes as well as new support for Docbook Website creation. From the release notes:</p>
<ul>
<li><span class="bold"><strong>Version 0.9.14</strong></span>
<ul>
<li>Support for Website creation. The new targets &#8220;ws-tab&#8221; for the           creation of tabular website and &#8220;website&#8221; for non tabular websites.</li>
<li>If you now create a directory &#8220;copy_to_output&#8221; it&#8217;s content will                         entirely and recursively be copied to the output directory.</li>
<li>You can now have a folder &#8220;common-files&#8221; in the &#8220;custom-cfg&#8221;           folder of your document. If that one exists, common files will be taken from there instead           from the global &#8220;custom-xsl&#8221; directory.</li>
<li>Cleaned up a bug in the generator script that appeared on Linux.</li>
<li>No more warnings when a specific style.css is not available</li>
</ul>
</li>
</ul>
<p>Dopus is available for download at the <a href="http://cms.agynamix.de/downloads/cat_view-2.html">usual place</a>.</p>
<p>Please test the new website feature and report any bugs via the <a href="http://helpdesk.agynamix.de/">helpdesk</a>.</p>
<p>Tell me what you think!</p>
<p>Thanks for using Dopus, and enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/announce-dopus-0914-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evidence Based Scheduling</title>
		<link>http://www.agynamix.de/blog/evidence-based-scheduling/</link>
		<comments>http://www.agynamix.de/blog/evidence-based-scheduling/#comments</comments>
		<pubDate>Sat, 27 Oct 2007 07:27:48 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=114</guid>
		<description><![CDATA[I just read an interesting article about software scheduling strategies over at &#8220;Joel on Software&#8220;. I found it rather interesting- so without further ado, here&#8217;s the link: http://www.joelonsoftware.com/items/2007/10/26.html]]></description>
			<content:encoded><![CDATA[<p></p><p>I just read an interesting article about software scheduling strategies over at &#8220;<a href="http://www.joelonsoftware.com">Joel on Software</a>&#8220;.</p>
<p>I found it rather interesting- so without further ado, here&#8217;s the link: <a href="http://www.joelonsoftware.com/items/2007/10/26.html">http://www.joelonsoftware.com/items/2007/10/26.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/evidence-based-scheduling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nice words for Dopus</title>
		<link>http://www.agynamix.de/blog/nice-words-for-dopus/</link>
		<comments>http://www.agynamix.de/blog/nice-words-for-dopus/#comments</comments>
		<pubDate>Sat, 29 Sep 2007 08:01:42 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=113</guid>
		<description><![CDATA[I got some trackbacks on Dopus recently which I really do like. I&#8217;d like to thank you guys for your nice encouraging words (here and I&#8217;m sure there are more). I&#8217;m curious how many people actively use Dopus?]]></description>
			<content:encoded><![CDATA[<p></p><p>I got some trackbacks on Dopus recently which I really do like.</p>
<p>I&#8217;d like to thank you guys for your nice encouraging words (<a href="http://www.simplifiedcomplexity.com/blog/mgalvin/a-complete-self-contained-cross-platform-docbook-toolchain">here</a> and I&#8217;m sure there are more).</p>
<p>I&#8217;m curious how many people actively use Dopus?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/nice-words-for-dopus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announce: Dopus 0.9.13 released</title>
		<link>http://www.agynamix.de/blog/announce-dopus-0913-released/</link>
		<comments>http://www.agynamix.de/blog/announce-dopus-0913-released/#comments</comments>
		<pubDate>Thu, 16 Aug 2007 13:10:17 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.agynamix.de/?p=112</guid>
		<description><![CDATA[I wrapped up a new release of Dopus. This is a bug fix release. There was a problem with the included fonts (there XML description files) that made them unsearchable in applications like Acrobat Reader. While I was at it I clean up some other minor glitches. Dopus is available for download at the usual [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I wrapped up a new release of Dopus.</p>
<p>This is a bug fix release. There was a problem with the included fonts (there XML description files) that made them unsearchable in applications like Acrobat Reader. While I was at it I clean up some other minor glitches.</p>
<p>Dopus is available for download at the <a href="http://cms.agynamix.de/downloads/cat_view-2.html">usual place</a>.</p>
<p>I&#8217;m planning to wrap together a new version of Dopus (possibly under a new name- or just Dopus2) that would sport Docbook 5 and FOP  0.93 (the latest version) support. I find it rather hard to support a package that holds two so different Docbook versions and therefore would rather go the route to release a new bundle.</p>
<p>I&#8217;d like to hear from you about this. Tell me what you think!</p>
<p>Thanks for using Dopus, and enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/announce-dopus-0913-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

