harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Nathan Beyer" <ndbe...@apache.org>
Subject Re: [classlib][prefs] default provider of prefs
Date Wed, 31 Dec 2008 06:41:33 GMT
The only thing I'd consider would be doing a case-insensitive compare,
perhaps by doing the following.

osName = (osName == null ? null : osName.toLowerCase(Locale.ENGLISH));
// only comparing ASCII, so assume english localge

Also, need to check for null.

if (osName != null && osName.startsWith("windows"))

-Nathan

On Wed, Dec 31, 2008 at 12:21 AM, Regis <xu.regis@gmail.com> wrote:
> Thanks Nathan! So the code could be changed to:
>
>             String osName = AccessController.doPrivileged(new
> PrivilegedAction<String>() {
>                 public String run() {
>                     return System.getProperty("os.name"); //$NON-NLS-1$
>                 }
>             });
>
>             if (osName.startsWith("Windows")) {
>                 factoryClassName =
> "java.util.prefs.RegistryPreferencesFactoryImpl";
>             } else {
>                 factoryClassName =
> "java.util.prefs.FilePreferencesFactoryImpl";
>             }
>
>
>
> Nathan Beyer wrote:
>>
>> On Tue, Dec 30, 2008 at 11:54 PM, Regis <xu.regis@gmail.com> wrote:
>>>
>>> Yes, but the value of "os.name" is human readable string, it must be
>>> parsed
>>> by hand, I'm not sure the format of the string is consistent on different
>>> vm
>>> or different versions of Windows, so I used File.pathSeparatorChar, as I
>>> know only windows use "\\" as patch separator.
>>
>> According to what source is "os.name" to be used for human
>> readability? It's not guaranteed to be anything, but I and many, many,
>> many others have written code that utilizes it, as well as the
>> correlated property, "os.arch". Additionally, "os.name" and "os.arch"
>> are used as part of JNLP to define platform-specific resources [1].
>>
>> Here's a few sites that have attempted to catalog the various values,
>> so as to allow for utilizing the values.
>> http://mindprod.com/jgloss/properties.html#OSNAME
>> http://lopica.sourceforge.net/os.html
>>
>> -Nathan
>>
>> [1]
>> http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/syntax.html#resources
>>
>>
>>> Nathan Beyer wrote:
>>>>
>>>> The System Property 'os.name' would be more appropriate for determining
>>>> the OS.
>>>>
>>>> -Nathan
>>>>
>>>> On Tue, Dec 30, 2008 at 11:32 PM, Regis <xu.regis@gmail.com> wrote:
>>>>>
>>>>> Nathan Beyer wrote:
>>>>>>
>>>>>> I doubt there is any significant reason for it other than the default
>>>>>> is based on the OS and the native might have been an easy decision
>>>>>> point.
>>>>>
>>>>> Maybe.
>>>>>>
>>>>>> Moving it to Java code is probably fine - the code just needs to
use a
>>>>>> default based on the OS.
>>>>>
>>>>> I try the following patch, all tests are passed, so I think we could
>>>>> move
>>>>> it
>>>>> to java code safely. I used File.pathSeparatorChar to test the
>>>>> platform,
>>>>> is
>>>>> there any better way to do this?
>>>>>
>>>>>
>>>>> Index: modules/luni/src/main/native/luni/shared/luniglob.c
>>>>> =====================================================================
>>>>> --- modules/luni/src/main/native/luni/shared/luniglob.c
>>>>> +++ modules/luni/src/main/native/luni/shared/luniglob.c
>>>>> @@ -162,21 +162,6 @@ JNI_OnLoad (JavaVM * vm, void *reserved)
>>>>>          }
>>>>>      }
>>>>>
>>>>> -       /* Set default PreferencesFactory implementation */
>>>>> -       (*vmInterface)->GetSystemProperty (vmInterface,
>>>>> "java.util.prefs.PreferencesFactory", &propVal);
>>>>> -       if (propVal == NULL) {
>>>>> -           propRes = (*vmInterface)->SetSystemProperty (vmInterface,
>>>>> -               "java.util.prefs.PreferencesFactory",
>>>>> -#ifdef _WIN32
>>>>> -               "java.util.prefs.RegistryPreferencesFactoryImpl");
>>>>> -#else
>>>>> -               "java.util.prefs.FilePreferencesFactoryImpl");
>>>>> -#endif
>>>>> -           if (VMI_ERROR_NONE != propRes) {
>>>>> -               /* goto fail2; */
>>>>> -           }
>>>>> -       }
>>>>> -
>>>>>      /* Prefer Xalan compiler for better performance, see HARMONY-3209.
>>>>> */
>>>>>      (*vmInterface)->GetSystemProperty (vmInterface,
>>>>> "javax.xml.transform.TransformerFactory", &propVal);
>>>>>      if (propVal == NULL) {
>>>>> Index: modules/prefs/src/main/java/java/util/prefs/Preferences.java
>>>>> =====================================================================
>>>>> --- modules/prefs/src/main/java/java/util/prefs/Preferences.java
>>>>> +++ modules/prefs/src/main/java/java/util/prefs/Preferences.java
>>>>> @@ -16,6 +16,7 @@
>>>>>
>>>>>  package java.util.prefs;
>>>>>
>>>>> +import java.io.File;
>>>>>  import java.io.IOException;
>>>>>  import java.io.InputStream;
>>>>>  import java.io.OutputStream;
>>>>> @@ -127,6 +128,13 @@ public abstract class Preferences {
>>>>>               return
>>>>> System.getProperty("java.util.prefs.PreferencesFactory"); //$NON-NLS-1$
>>>>>           }
>>>>>       });
>>>>> +        if (factoryClassName == null) {
>>>>> +            if (File.pathSeparatorChar == '\\') {
>>>>> +                factoryClassName =
>>>>> "java.util.prefs.RegistryPreferencesFactoryImpl";
>>>>> +            } else {
>>>>> +                factoryClassName =
>>>>> "java.util.prefs.FilePreferencesFactoryImpl";
>>>>> +            }
>>>>> +        }
>>>>>          try {
>>>>>              ClassLoader loader =
>>>>> Thread.currentThread().getContextClassLoader();
>>>>>              if(loader == null){
>>>>>
>>>>>
>>>>>> -Nathan
>>>>>>
>>>>>> On Tue, Dec 30, 2008 at 4:25 AM, Regis <xu.regis@gmail.com>
wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> The provider of prefs is controlled by the property
>>>>>>> "java.util.prefs.PreferencesFactory" in Harmony, and we also
have
>>>>>>> different
>>>>>>> default values for it on Linux and Windows, but the default values
>>>>>>> are
>>>>>>> set
>>>>>>> in luni module at
>>>>>>> modules/luni/src/main/native/luni/shared/luniglob.c,
>>>>>>> are there any special concerns that we must do it in luni native
>>>>>>> code?
>>>>>>> Or
>>>>>>> is
>>>>>>> it possible set it in prefs module with java code, like this:
>>>>>>>
>>>>>>>      if (factoryClassName == null) {
>>>>>>>          if (isWindows) {
>>>>>>>              factoryClassName =
>>>>>>> "java.util.prefs.RegistryPreferencesFactoryImpl";
>>>>>>>          } else {
>>>>>>>              factoryClassName =
>>>>>>> "java.util.prefs.FilePreferencesFactoryImpl";
>>>>>>>          }
>>>>>>>      }
>>>>>>>
>>>>>>> I think there must be a way to get current platform at runtime
in
>>>>>>> java.
>>>>>>>
>>>>>>> --
>>>>>>> Best Regards,
>>>>>>> Regis.
>>>>>>>
>>>>> --
>>>>> Best Regards,
>>>>> Regis.
>>>>>
>>> --
>>> Best Regards,
>>> Regis.
>>>
>>
>
> --
> Best Regards,
> Regis.
>

Mime
View raw message