commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Siegfried Goeschl (JIRA)" <j...@apache.org>
Subject [jira] Commented: (EXEC-30) Make environment variables respect casing rules of platforms
Date Fri, 14 Nov 2008 10:40:44 GMT

    [ https://issues.apache.org/jira/browse/EXEC-30?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12647574#action_12647574
] 

Siegfried Goeschl commented on EXEC-30:
---------------------------------------

Mhmm, didn't even know that environment variables are case-insensitive on Windows - wonder
if I'm the right man for the job .... :-(

Currently I try to understand the consequences of the change - let's assume you have code
under Unix that uses "$PATH" and "$Path" thereby referencing two different environment variables.
In this case the code would be broken under Windows no matter what I'm doing.

I think this is an undocumented good practice to stick to uppercase environment variables
and most people are simply not aware of the issue (including me) - any other opinions out
there?

> Make environment variables respect casing rules of platforms
> ------------------------------------------------------------
>
>                 Key: EXEC-30
>                 URL: https://issues.apache.org/jira/browse/EXEC-30
>             Project: Commons Exec
>          Issue Type: Improvement
>    Affects Versions: 1.0
>         Environment: Windows
>            Reporter: Benjamin Bentmann
>            Assignee: Siegfried Goeschl
>            Priority: Critical
>         Attachments: EXEC-30.patch
>
>
> Intro: Environment variables on Windows are case-insensitive (see [ExpandEnvironmentStrings|http://msdn.microsoft.com/en-us/library/ms724265(VS.85).aspx]).
As a little experiment, run the following code snippet on Windows with Java 1.5
> {code:java}
> System.out.println(System.getenv("PATH"));
> System.out.println(System.getenv("path"));
> System.out.println(System.getenv("Path"));
> System.out.println(System.getenv().get("PATH"));
> System.out.println(System.getenv().get("path"));
> System.out.println(System.getenv().get("Path"));
> {code}
> which can for example output
> {noformat}
> <successfully resolved variable>
> <successfully resolved variable>
> <successfully resolved variable>
> null
> null
> <successfully resolved variable>{noformat}
> IMHO, this is an example of how an API should *not* be designed. The two overloads of
{{System.getenv()}} look very similar but behave completely different. Even having this documented,
this subtle peculiarity makes Java programming prone to errors that prevent platform-independence.
> Commons Exec is currently providing a case-sensitive view of the Windows shell environment.
This makes it effectively impossible for client to code to reliably lookup an environment
variable without performing further tweaks to the map returned from {{EnvironmentUtil}}. Furthermore,
these tweaks would have to be performed only depending on the current OS, so the client code
would need to consider platform details. I believe this violates the basic principle of platform-independence
intended by Java.
> So here my suggestion: Have Commons Exec provide a case-preserving map that obeys the
casing rules of the platform for key lookup. This way, the simple code line
> {code:java}
> EnvironmentUtils.getProcEnvironment().get("PATH")
> {code}
> will consistently return the specified variable on Windows and Unix.
> Just to mention it: An alternative approach might be to have the map always be case-sensitive
but normalize variable names to upper-case on case-insensitive platforms.
> Regardless how this issue ends, the documentation for {{getProcEnvironment()}} should
clearly state how it deals with casing.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message