Hi Lars,
Henrique Prange wrote:
>
> Above is the complete...
Below. :p
Cheers,
Henrique
>
> 16-May-2008 09:13 AM Henrique Prange:
> * SUMMARY
> WebObjects applications cannot be initialized on Windows using a path
> with spaces. The problem occurs because of a bug in the NSBundle class.
>
> I understand Apple doesn't support the development of WebObjects
> applications in Windows anymore. But this problem also affects the
> application developed on Mac but deployed on a Windows machine (i.e. WO
> app package as WAR running on Tomcat in Windows). This scenario is valid
> and should be supported. Besides, the known workaround cannot be always
> applied.
>
> This is an old known bug and the solution is simple.
>
> * STEPS TO REPRODUCE
>
> On development environment:
>
> 1. Install the WebObjects libraries into a path with spaces: i.e.
> "C:\Documents and
> Settings\Username\.m2\repository\com\apple\webobjects\JavaFoundation\5.4.1"
> 2. Create a simple project using Eclipse/WOLips.
> 3. Run the application.
>
> On deployment environment:
>
> 1. Create a simple WO app.
> 2. Package it as true WAR.
> 3. Deploy the app on Tomcat installed in a path with spaces: i.e.
> C:\Program Files\Tomcat.
> 4. Start Tomcat and see the log for the error.
>
> * RESULTS
>
> The following exception is thrown while trying to start the app:
>
> [2008-5-16 12:9:35 EDT] <main> Unable to locate the "JavaWebObjects" bundle
> [2008-5-16 12:9:35 EDT] <main> Unable to initialize WOProperties for
> reason: Cannot find JavaWebObjects framework !
> java.lang.IllegalStateException: Unable to locate the "JavaWebObjects"
> bundle
> [2008-5-16 12:9:35 EDT] <main> A fatal exception occurred:
> <WOApplication>: Cannot be initialized.
> [2008-5-16 12:9:35 EDT] <main>
> com.webobjects.foundation.NSForwardException
> [java.lang.IllegalStateException] Unable to locate the "JavaWebObjects"
> bundle:<WOApplication>: Cannot be initialized.
> at
> com.webobjects.appserver.WOApplication.<init>(WOApplication.java:912)
> at er.extensions.ERXAjaxApplication.<init>(ERXAjaxApplication.java:20)
> at er.extensions.ERXApplication.<init>(ERXApplication.java:753)
> at moleque.sicc.app.Application.<init>(Application.java:13)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> Method)
> at
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>
> at
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>
> at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
> at java.lang.Class.newInstance0(Class.java:355)
> at java.lang.Class.newInstance(Class.java:308)
> at com.webobjects.appserver.WOApplication.main(WOApplication.java:546)
> at er.extensions.ERXApplication.main(ERXApplication.java:454)
> at moleque.sicc.app.Application.main(Application.java:10)
> Caused by: java.lang.IllegalStateException: Unable to locate the
> "JavaWebObjects" bundle
> at
> com.webobjects.appserver._private.WOProperties.initUserDefaultsKeys(WOProperties.java:394)
>
> at
> com.webobjects.appserver.WOApplication._initWOApp(WOApplication.java:5690)
> at
> com.webobjects.appserver.WOApplication.<init>(WOApplication.java:773)
> ... 12 more
>
> * REGRESSION
> It happens in all versions of Windows.
> I have verified the same behavior in WO 5.3.x and 5.2.x.
> If the path doesn't have spaces, the application works (this is the
> workaround).
>
> * NOTES
> This problem occurs because of a conversion from URL to String in the
> NSBundle class. The Java URLDecoder class could be used to solve this
> problem. Below is a possible fix that could be done on
> __exctractStringFromURL private method of NSBundle:
>
> String urlPath = URLDecoder.decode( anURL.getPath(), "UTF-8" );
>
> Cheers,
>
> Henrique
>
> Lars Sonchocky-Helldorf wrote:
>>
>> Am 15.10.2008 um 22:25 schrieb Lachlan Deck:
>>
>>> On 16/10/2008, at 2:30 AM, Lars Sonchocky-Helldorf wrote:
>>>
>>>> Am 15.10.2008 um 16:04 schrieb Lachlan Deck:
>>>>
>>>>> On 15/10/2008, at 10:51 AM, Lars Sonchocky-Helldorf wrote:
>>>>>
>>>>>> when trying to launch a Maven based WOApplication inside Eclipse
>>>>>> 3.4 / WOLips 3.4.5503 on a Windows XP machine which HASN'T
>>>>>> WebObjects installed at first I got some null pointer exception
>>>>>> which had something to do with not being able to read certain
>>>>>> environment variables (I had a stacktrace on it inside the error
>>>>>> log view in Eclipse but my co-worker did hit the clear button when
>>>>>> trying to work the problem out while I was at lunch :-(
>>>>>
>>>>> :-)
>>>
>>> Just to clarify, how was this working for you before? What's changed?
>>
>> Don't ask … ;-)
>>
>> before another co-worker of mine was developing the project on
>> Leopard. Now he is bussy with something else and we got a freshman who
>> should take over the project. My boss assigned the freshman a Windows
>> PC as workstation, and I am the one to get the project started there.
>> So basically what's changed is the OS the project is developed on.
>>
>>>
>>>>> All this is doing is looking for the JavaWebObjects bundle having
>>>>> been already loaded during started. i.e., it's calling
>>>>> NSBundle.bundleForName("JavaWebObjects") which in turn looks up an
>>>>> NSDictionary and is getting null in return... so it decides to
>>>>> throws an error.
>>>>>
>>>>>> What makes me wonder is that even when launching a Maven based
>>>>>> WOApplication a static WO installation seems to be required and
>>>>>> referred (environment variables).
>>>>>
>>>>> I don't believe that's true.
>>>>
>>>> hmm, at least the NPE in the Eclipse WOApps launcher went away after
>>>> setting the NEXT_ROOT env for the first time. This could - of course
>>>> - be completely unrelated.
>>>
>>> Okay. What was the stack trace of the NPE beforehand?
>>
>> that is the famous stacktrace that got lost when my co-worked cleared
>> the error log in eclipse.
>>
>>>
>>>>>> Shouldn't it work out of the box without any WO installed at the
>>>>>> machine at all (and loading all the dependencies from the local
>>>>>> .m2/repository instead)
>>>>>
>>>>
>>>> Our project structure looks like this:
>>>
>>> Cool. Sorry - had to eliminate the obvious.
>>>
>>>> and the project builds now (after switching to the 2.0.16-SNAPSHOT
>>>> version of maven-wolifecycle-plugin like Henrique suggested.)
>>>
>>> Okay. Great. So if you from TankDiskAll do
>>> $ mvn clean package
>>>
>>> What do classpath.properties, classpath.txt, and wobuild.properties
>>> look like in TankDiskAdmin/target?
>>
>> like this:
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>>
>>
>>
>>>
>>>> But the exception during the launch attempt remains …
>>>
>>> hmm. In your LaunchConfig for your app, on the Source tab do you see
>>> under the expanded Default all the jars and project dependencies you
>>> expect?
>>
>>
>> looks quite good (see screenshot below)
>>
>>
>>
>>>
>>> Running within WOLips has some differences in that it does (perhaps
>>> did... I haven't tested with more recent nightlies to see if this is
>>> really still needed) have some dependencies on what it builds into
>>> project/build/YourProject.[woa|framework].
>>>
>>> So my launchconfig for one of my apps looks like this:<Picture 1.png>
>>
>>
>> and mine looks like this:
>>
>>
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>>
>>
>>>
>>>
>>>
>>> You might want to have a look at what settings you've inherited from
>>> WOlips prefs in the WO tab of your launchconfig for the app. By
>>> default these are all ticked in WOLips prefs. I usually untick most
>>> of them except the ones that actually make sense to set manually. So
>>> you might need to play with these.<Picture 2.png>
>>
>>
>> I tried several variations here - which had no influence at all at the
>> exception during startup.
>>
>>
>>
>>
>>
>>
>>
>> =======================================================================================
>>
>>
>>
>>
>>
>>
>>
>>
>> Now I decided to dig deeper and have some additional notes for you (of
>> which I hope those might give you a clue on what's going on)
>>
>>
>>
>>
>>
>> * I use the Q4E Eclipse PlugIn for Maven stuff inside Eclipse:
>> http://code.google.com/p/q4e/
>> http://q4e.googlecode.com/svn/trunk/updatesite/ this plugin is
>> responsible for creating the Maven Classpath Container
>>
>>
>>
>> * I found out that something/someone (the co-worker who developed the
>> project before when trying to help the freshman?) added the following
>> classpath variables in Eclipse:
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>>
>>
>>
>>
>> * I installed jad/jadclipse and fired up the debugger on the startup
>> exception. Here are my findings (sit down comfortable, it's a looong
>> story):
>>
>> The main cause, as we found out, seems to be the difference between
>> jar files and Mac OS X bundles. look at the following code (which a
>> little jad gave me):
>>
>>
>> WOResourceManager:
>>
>> public static InputStream
>> __getJavaWebObjectsResourceAsStream(String name) throws
>> IllegalStateException {
>> /* 113*/ InputStream is = null;
>>
>> /* 115*/ String errorCause = "";
>> /* 116*/ NSBundle aFrameworkBundle =
>> NSBundle.bundleForName("JavaWebObjects");
>> /* 117*/ if(aFrameworkBundle != null) {
>> /* 118*/ String aUserDefaultsKeysPath =
>> aFrameworkBundle.resourcePathForLocalizedResourceNamed(name, "");
>> /* 119*/ if(aUserDefaultsKeysPath != null) {
>> /* 120*/ is =
>> aFrameworkBundle.inputStreamForResourcePath(aUserDefaultsKeysPath);
>> } else {
>> /* 122*/ errorCause = (new
>> StringBuilder()).append("Unable to locate
>> \"").append(name).append("\"").toString();
>> /* 123*/ is =
>> com/webobjects/appserver/WOResourceManager.getClassLoader().getResourceAsStream((new
>> StringBuilder())
>>
>> .append("com/webobjects/appserver/").append(name).toString());
>> }
>> } else {
>> /* 126*/ errorCause = "Unable to locate the
>> \"JavaWebObjects\" bundle";
>> /* 127*/ is =
>> com/webobjects/appserver/WOResourceManager.getClassLoader().getResourceAsStream((new
>> StringBuilder())
>>
>> .append("com/webobjects/appserver/").append(name).toString());
>> }
>> /* 129*/ if(is == null) {
>> /* 130*/ NSLog.err.appendln((new
>> StringBuilder()).append("<WOResourceManager>
>> ").append(errorCause).toString());
>> /* 131*/ throw new IllegalStateException(errorCause);
>> } else {
>> /* 133*/ return is;
>> }
>> }
>>
>>
>> in line 116 NSBundle.bundleForName("JavaWebObjects"); fails because in
>> line 527 BundlesNamesTable was empty: {}
>>
>> NSBundle:
>>
>> public static synchronized NSBundle bundleForName(String
>> aName) {
>> /* <-MISALIGNED-> */ /* 516*/ NSBundle bundle = null;
>> /* <-MISALIGNED-> */ /* 518*/ if(aName != null) {
>> String fixedName;
>> /* <-MISALIGNED-> */ /* 521*/ if(aName.endsWith(".framework"))
>> /* <-MISALIGNED-> */ /* 522*/ fixedName =
>> NSPathUtilities.stringByDeletingPathExtension(aName);
>> /* <-MISALIGNED-> */ /* 524*/ else
>> /* <-MISALIGNED-> */ /* 524*/ fixedName = aName;
>> /* <-MISALIGNED-> */ /* 527*/ bundle =
>> (NSBundle)BundlesNamesTable.objectForKey(fixedName);
>> }
>> /* <-MISALIGNED-> */ /* 530*/ return bundle;
>> }
>>
>>
>>
>> this in turn was caused by the failure of LoadBundlesFromClassPath()
>> during classloading of NSBundle in the static block:
>>
>>
>> static {
>> .
>> .
>> .
>> /* <-MISALIGNED-> */ /* 349*/ NSArray classpath =
>> NSArray._mutableComponentsSeparatedByString((new
>> StringBuilder()).append(System.getProperty("java.class.path")).append(File.pathSeparator).append(NSProperties.getProperty("com.webobjects.classpath")).toString(),
>> File.pathSeparator);
>> /* <-MISALIGNED-> */ /* 352*/ NSMutableArray
>> cleanedUpClassPath = new NSMutableArray();
>> /* <-MISALIGNED-> */ /* 353*/ Iterator iterator =
>> classpath.iterator();
>> /* <-MISALIGNED-> */ /* 353*/ do {
>> /* <-MISALIGNED-> */ /* 353*/ if(!iterator.hasNext())
>> /* <-MISALIGNED-> */ /* 354*/ break;
>> /* <-MISALIGNED-> */ /* 354*/ String fixedComponent =
>> NSPathUtilities.stringByNormalizingExistingPath((String)iterator.next());
>> /* <-MISALIGNED-> */ /* 355*/ if(fixedComponent != null
>> && fixedComponent.length() > 0)
>> /* <-MISALIGNED-> */ /* 356*/
>> cleanedUpClassPath.add(fixedComponent);
>> } while(true);
>> /* <-MISALIGNED-> */ /* 363*/ for(int i =
>> cleanedUpClassPath.count() - 1; i >= 0; i--) {
>> /* <-MISALIGNED-> */ /* 364*/ String component =
>> (String)cleanedUpClassPath.objectAtIndex(i);
>> /* <-MISALIGNED-> */ /* 366*/
>> if(cleanedUpClassPath.indexOfObject(component) != i)
>> /* <-MISALIGNED-> */ /* 367*/
>> cleanedUpClassPath.removeObjectAtIndex(i);
>> }
>> /* <-MISALIGNED-> */ /* 370*/ ClassPath = cleanedUpClassPath;
>> /* <-MISALIGNED-> */ /* 373*/
>> LoadBundlesFromClassPath(ClassPath);
>> .
>> .
>> .
>> }
>>
>> None of the following classpath entries was loaded …
>>
>> the value of ClassPath in line 370 was:
>>
>> ( C:\Dokumente und
>> Einstellungen\cem\workspace\TankDiskAll\Applications\TankDiskServer\build\TankDiskServer.woa\Contents\Resources\Java,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaXML\5.4.2\JavaXML-5.4.2.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaJDBCAdaptor\5.4.2\JavaJDBCAdaptor-5.4.2.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaEOAccess\5.4.2\JavaEOAccess-5.4.2.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaEOControl\5.4.2\JavaEOControl-5.4.2.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaWebObjects\5.4.2\JavaWebObjects-5.4.2.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaFoundation\5.4.2\JavaFoundation-5.4.2.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaWOExtensions\5.4.2\JavaWOExtensions-5.4.2.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\postgresql\postgresql\7.4.1-jdbc3\postgresql-7.4.1-jdbc3.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\javax\mail\mail\1.4.1\mail-1.4.1.jar,
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\assense\shared\PostgreSQLPlugIn\1.5.4\PostgreSQLPlugIn-1.5.4.jar,
>>
>> C:\Dokumente und
>> Einstellungen\cem\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar
>> )
>>
>>
>> … , because the loading of bundles works like this:
>>
>>
>> NSBundle:
>>
>> private static void LoadBundlesFromClassPath(NSArray array) {
>> /* <-MISALIGNED-> */ /* 741*/ Enumeration en =
>> array.objectEnumerator();
>> /* <-MISALIGNED-> */ /* 741*/ do {
>> /* <-MISALIGNED-> */ /* 741*/ if(!en.hasMoreElements())
>> /* <-MISALIGNED-> */ /* 742*/ break;
>> /* <-MISALIGNED-> */ /* 742*/ NSBundle b = null;
>> /* <-MISALIGNED-> */ /* 743*/ String nextPathComponent =
>> (String)en.nextElement();
>> /* <-MISALIGNED-> */ /* 744*/
>> if(couldBeABundle(nextPathComponent))
>> /* <-MISALIGNED-> */ /* 745*/ b =
>> _bundleWithPathShouldCreateIsJar(nextPathComponent, true, false);
>> /* <-MISALIGNED-> */ /* 747*/ if(b != null)
>> /* <-MISALIGNED-> */ /* 748*/ b.postNotification();
>> } while(true);
>> }
>>
>>
>> and the check whether something at the classpath is a bundle or not is
>> based on the following code:
>>
>>
>> NSBundle:
>>
>> private static boolean couldBeABundle(String aPath) {
>> /* <-MISALIGNED-> */ /* 586*/ boolean isBundle = false;
>> /* <-MISALIGNED-> */ /* 587*/ NSMutableArray resourcesSubdirs =
>> new NSMutableArray();
>> /* <-MISALIGNED-> */ /* 589*/ int index =
>> aPath.lastIndexOf(RSUFFIX);
>> /* <-MISALIGNED-> */ /* 591*/ if(index == -1) {
>> /* <-MISALIGNED-> */ /* 593*/
>> resourcesSubdirs.addObject(aPath.concat(RSUFFIX)); // Resources
>> /* <-MISALIGNED-> */ /* 594*/
>> resourcesSubdirs.addObject(aPath.concat(CSUFFIX)); // Contents
>> } else {
>> /* <-MISALIGNED-> */ /* 596*/
>> resourcesSubdirs.addObject(aPath.substring(0, index + RSUFFIX.length()));
>> }
>> /* <-MISALIGNED-> */ /* 599*/ Iterator iterator =
>> resourcesSubdirs.iterator();
>> /* <-MISALIGNED-> */ /* 599*/ do {
>> /* <-MISALIGNED-> */ /* 599*/ if(!iterator.hasNext())
>> /* <-MISALIGNED-> */ /* 600*/ break;
>> /* <-MISALIGNED-> */ /* 600*/ File file = new
>> File((String)iterator.next());
>> /* <-MISALIGNED-> */ /* 601*/ if(!file.exists() ||
>> !file.isDirectory())
>> /* <-MISALIGNED-> */ /* 602*/ continue;
>> /* <-MISALIGNED-> */ /* 602*/ String files[] =
>> file.list(TheInfoDictFilter); // looking for info.plist named file
>> /* <-MISALIGNED-> */ /* 603*/ if(files.length <= 0)
>> /* <-MISALIGNED-> */ /* 604*/ continue;
>> /* <-MISALIGNED-> */ /* 604*/ isBundle = true;
>> /* <-MISALIGNED-> */ /* 605*/ break;
>> } while(true);
>> /* <-MISALIGNED-> */ /* 610*/ return isBundle;
>> }
>>
>>
>> so this code looks for each entry in the classpath if there is a file
>> named "info.plist" inside the subdirectories Resources and
>> Resources/Contents . If not it isn't considered a bundle.
>>
>>
>> is everything clear so far?
>>
>>
>>
>> =======================================================================================
>>
>>
>>
>>
>> Because of the failure of NSBundle.bundleForName("JavaWebObjects") in
>> line 116 of WOResourceManager, WOResourceManager falls back to the
>> following:
>>
>> } else {
>> /* 126*/ errorCause = "Unable to locate the
>> \"JavaWebObjects\" bundle";
>> /* 127*/ is =
>> com/webobjects/appserver/WOResourceManager.getClassLoader().getResourceAsStream((new
>> StringBuilder())
>>
>> .append("com/webobjects/appserver/").append(name).toString());
>> }
>>
>> where it tries to load "com/webobjects/appserver/WOPropertyKeys.plist"
>> at the first occasion from any jars in the classpath (it looks even in
>> the bootclasspath).
>>
>>
>> I found a file (next to several others) inside
>> JavaWebObjects-5.4.2.jar, but there in a Folder named "Resources", not
>> inside com/webobjects/appserver/
>>
>>
>> when trying to load that Resource the something deep inside Java
>> Classloading logic tried to open this path:
>>
>> \C:\Dokumente und
>> Einstellungen\cem\.m2\repository\com\apple\webobjects\JavaWebObjects\5.4.2\JavaWebObjects.jar
>> (note the leading backslash and the omission of the version string
>> "-5.4.2") what resulted in some FileNotFoundException which was
>> catched by the deeper levels of the Classloading logic.
>>
>>
>>
>> Because the Classloading logic was also looking inside
>> TankDiskServer\build\TankDiskServer.woa\Contents\Resources\Java I just
>> created the directory structure "com/webobjects/appserver/" and copied
>> everything from inside the "Resource" directory of
>> JavaWebObjects-5.4.2.jar over there. Now at least my first exception
>> was gone but the trouble is not over yet.
>>
>>
>>
>> =======================================================================================
>>
>>
>>
>>
>> now I am getting:
>>
>> [2008-10-16 20:25:46 CEST] <main> WebObjects version = Not Available
>> [2008-10-16 20:25:46 CEST] <main> NSBundle is unable to find
>> JavaWebObjects.framework -- unable to load
>> "ExtensionsForResources.plist" from there. Ignoring.
>> [2008-10-16 20:25:46 CEST] <main> A fatal exception occurred: null
>> [2008-10-16 20:25:46 CEST] <main> java.lang.ExceptionInInitializerError
>> at
>> com.webobjects._ideservices._WOProject.ideProjectAtPath(_WOProject.java:85)
>>
>> at
>> com.webobjects.appserver._private.WOProjectBundle._isProjectBundlePath(WOProjectBundle.java:225)
>>
>> at
>> com.webobjects.appserver._private.WODeployedBundle.bundleWithNSBundle(WODeployedBundle.java:745)
>>
>> at
>> com.webobjects.appserver._private.WODeployedBundle.deployedBundle(WODeployedBundle.java:124)
>>
>> at
>> com.webobjects.appserver.WOResourceManager._initAppBundle(WOResourceManager.java:140)
>>
>> at
>> com.webobjects.appserver.WOResourceManager.<init>(WOResourceManager.java:60)
>>
>> at
>> com.webobjects.appserver.WOApplication.createResourceManager(WOApplication.java:2067)
>>
>> at
>> com.webobjects.appserver.WOApplication.<init>(WOApplication.java:841)
>> at
>> com.assense.core.wo.AssenseApplication.<init>(AssenseApplication.java:25)
>> at com.tankdisk.Application.<init>(Application.java:67)
>> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>> Method)
>> at
>> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>>
>> at
>> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>>
>> at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
>> at java.lang.Class.newInstance0(Class.java:350)
>> at java.lang.Class.newInstance(Class.java:303)
>> at com.webobjects.appserver.WOApplication.main(WOApplication.java:547)
>> at com.tankdisk.Application.main(Application.java:37)
>> Caused by: java.lang.IllegalStateException: Unable to find any
>> resource extensions in either JavaWebObjects.framework or the main
>> bundle.
>> at
>> com.webobjects._ideservices._IDEProjectPBX.<clinit>(_IDEProjectPBX.java:183)
>>
>> ... 18 more
>>
>>
>>
>>>
>>>
>>>
>>> with regards,
>>> --
>>>
>>> Lachlan Deck
>>>
>>
>>
>>
>>
>> I hope you didn't fall asleep while reading this looooong mail!
>>
>>
>>
>>
>>
>> regards,
>>
>>
>>
>> Lars
>>
>>
>>
>>
>>
>
This archive was generated by hypermail 2.0.0 : Thu Oct 16 2008 - 18:32:06 EDT