OK

Line 4481:

String s = null;
s = R4LibraryClause.normalizeOSName(System.getProperty("os.name"));
m_configMutableMap.put(FelixConstants.FRAMEWORK_OS_NAME, s);

Here, "System.getProperty("os.name")" gives "Windows 7" (with a space)
So "s" is "windows7" without a space.

When method match is called (later, thus) it calls :
normalizeOSName((String) configMap.get(Constants.FRAMEWORK_OS_NAME)); <=> 
normalizeOSName("windows7") without the space.

This returns "win" instead of "windows7".

Here is your bug!

Possible fixes:
- completely ignore all spaces by removing them systematically in the input: 
value.replaceAll(" ", "");
Not very clean
- replace
if ((value.indexOf(" 7") >= 0) || value.equals("win7"))
with
if ((value.indexOf("7") >= 0))
(no space), but you will have a problem when Windows 2017 is out
- other possibilities?

Kind regards,

Ben

Le 12 juin 2014 à 23:26, Richard Hall <[email protected]> a écrit :

> It is initialized in Felix.java. Search for os.name to find where.
> On Jun 12, 2014 5:15 PM, "Benoît Thiébault" <[email protected]> wrote:
> 
>> OK, here are my latests findings.
>> 
>> I added a few System.out.println in the public static String
>> normalizeOSName(String value) method. Namely:
>> 
>> if (value.startsWith("win")) {
>>            String os = "win";
>> 
>> System.out.println("R4LibraryClause.normalizeOSName():value.startsWith('win')");
>>            System.out.println("value:" + value);
>> [...]
>>            System.out.println("Returned OS:" + os);
>>            return os;
>>        }
>> 
>> I also removed the bundle containing the native libraries from the
>> "bundles" folder in order to install it manually.
>> 
>> 1) When the framework starts, it starts all the bundles and calls the
>> normalizeOSName a first time. Code output:
>> R4LibraryClause.normalizeOSName():value.startsWith('win')
>> value:windows 7 <- notice the space between "windows" and "7"
>> Returned OS:windows7
>> 
>> -> OK
>> 
>> 2) I then install the native bundle: "install
>> file:org-keridwen-vtk-win7-64b-2.0.3-SNAPSHOT.jar"
>> 
>> The normalizeOSName method is called twice in a raw (I guess by the parse
>> method first, then by the match method). Code output:
>> R4LibraryClause.normalizeOSName():value.startsWith('win') <- first call,
>> works
>> value:win7 <- OK for the if statement line 392
>> Returned OS:windows7
>> os.name:Windows 7 <- System.out.println at the start of the match method
>> os.arch:amd64
>> R4LibraryClause.normalizeOSName():value.startsWith('win') <- second call,
>> fails
>> value:windows7 <- NOT OK, there is no space between "windows" and "7",
>> line 392 won't catch it
>> Returned OS:win <- NOT OK
>> normal_osname:win;
>> normal_processor:x86-64;
>> normal_osversion:6.1.0;
>> normal_language:fr;
>> currentOSName:win
>> osname[0]:windows7
>> R4LibraryClause.match()-checkOSNames returned false
>> 
>> So the parse() method succeeds while the match() method does not. The
>> input map configMap is suspect #1. Don't really know where it is initialized
>> 
>> Kind regards,
>> 
>> Ben
>> 
>> Le 12 juin 2014 à 22:33, Benoît Thiébault <[email protected]> a écrit
>> :
>> 
>>> Hi Richard,
>>> 
>>> Here is what I did: I added a few System.out.println in the
>> R4LibraryClause.match() and checkOSNames() methods and recompiled Felix
>> Framework (4.5.0-SNAPSHOT thus)
>>> 
>>> The modified code:
>>> public boolean match(final Map configMap) throws BundleException {
>>>       System.out.println("os.name:" + System.getProperty("os.name"));
>>>       System.out.println("os.arch:" + System.getProperty("os.arch"));
>>>       final String normal_osname = normalizeOSName((String)
>> configMap.get(Constants.FRAMEWORK_OS_NAME));
>>>       System.out.println("normal_osname:" + normal_osname + ";");
>>>       final String normal_processor = normalizeProcessor((String)
>> configMap.get(Constants.FRAMEWORK_PROCESSOR));
>>>       System.out.println("normal_processor:" + normal_processor + ";");
>>>       final String normal_osversion = normalizeOSVersion((String)
>> configMap.get(Constants.FRAMEWORK_OS_VERSION));
>>>       System.out.println("normal_osversion:" + normal_osversion + ";");
>>>       final String normal_language = (String)
>> configMap.get(Constants.FRAMEWORK_LANGUAGE);
>>>       System.out.println("normal_language:" + normal_language + ";");
>>> 
>>>       // Check library's osname.
>>>       if (!checkOSNames(normal_osname, getOSNames())) {
>>>           System.out.println("R4LibraryClause.match()-checkOSNames
>> returned false");
>>>           return false;
>>>       }
>>> 
>>>       // Check library's processor.
>>>       if (!checkProcessors(normal_processor, getProcessors())) {
>>>           System.out.println("R4LibraryClause.match()-checkProcessors
>> returned false");
>>>           return false;
>>>       }
>>> 
>>>       // Check library's osversion if specified.
>>>       if ((getOSVersions() != null) && (getOSVersions().length > 0)
>>>               && !checkOSVersions(normal_osversion, getOSVersions())) {
>>>           System.out.println("R4LibraryClause.match()-checkOSVersion
>> returned false");
>>>           return false;
>>>       }
>>> 
>>>       // Check library's language if specified.
>>>       if ((getLanguages() != null) && (getLanguages().length > 0) &&
>> !checkLanguages(normal_language, getLanguages())) {
>>>           System.out.println("R4LibraryClause.match()-checkLanguages
>> returned false");
>>>           return false;
>>>       }
>>> 
>>>       // Check library's selection-filter if specified.
>>>       if ((getSelectionFilter() != null) &&
>> (getSelectionFilter().length() >= 0)
>>>               && !checkSelectionFilter(configMap,
>> getSelectionFilter())) {
>>> 
>> System.out.println("R4LibraryClause.match()-checkSelectionFilter returned
>> false");
>>>           return false;
>>>       }
>>> 
>>>       System.out.println("R4LibraryClause.match() -> returned true");
>>>       return true;
>>>   }
>>> 
>>> private boolean checkOSNames(final String currentOSName, final String[]
>> osnames) {
>>>       final boolean win32 = currentOSName.startsWith("win") &&
>> !currentOSName.equals("windowsce");
>>>       System.out.println("currentOSName:" + currentOSName);
>>>       for (int i = 0; (osnames != null) && (i < osnames.length); i++) {
>>>           System.out.println("osname[" + i + "]:" + osnames[i]);
>>>           if (osnames[i].equals(currentOSName) ||
>> ("win32".equals(osnames[i]) && win32)) {
>>>               return true;
>>>           }
>>>       }
>>>       return false;
>>>   }
>>> 
>>> The output when run on Windows:
>>> os.name:Windows 7
>>> os.arch:amd64
>>> normal_osname:win;
>>> normal_processor:x86-64;
>>> normal_osversion:6.1.0;
>>> normal_language:fr;
>>> currentOSName:win
>>> osname[0]:windows7
>>> R4LibraryClause.match()-checkOSNames returned false
>>> 
>>> So the problem seems to be the normal_osname that is win and not
>> windows7…
>>> 
>>> Do you confirm?
>>> 
>>> Kind regards,
>>> Ben
>>> 
>>> Le 12 juin 2014 à 21:48, Richard S. Hall <[email protected]> a écrit
>> :
>>> 
>>>> Perhaps you start the JVM up suspended with debug enabled and set a
>> break point up at R4LibraryClause.match() and see precisely why it is
>> failing?
>>>> 
>>>> The code in there is pretty self explanatory.
>>>> 
>>>> -> richard
>>> 
>> 
>> --
>> Dr Benoît Thiébault
>> Project Manager
>> 
>>  Artenum Toulouse - Science & Groupware
>>  http://www.artenum.com
>> 
>>      Bâtiment Calfocenter
>>      10, rue Marguerite-Long
>>      31320 Castanet-Tolosan
>>      France
>>      Phone: +33 (0)5 82 95 19 00
>> 
>> 
>> 

-- 
Dr Benoît Thiébault
Project Manager

  Artenum Toulouse - Science & Groupware
  http://www.artenum.com

      Bâtiment Calfocenter
      10, rue Marguerite-Long
      31320 Castanet-Tolosan
      France
      Phone: +33 (0)5 82 95 19 00


Reply via email to