--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/archive/selectors.py Tue Apr 27 08:33:08 2010 +0300
@@ -0,0 +1,153 @@
+#============================================================================
+#Name : selectors.py
+#Part of : Helium
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+"""selectors for things like distribution policy"""
+
+import os
+import logging
+import fileutils
+import archive
+
+# Getting logger for the module
+_logger = logging.getLogger("archive.selectors")
+
+
+class DistributionPolicySelector:
+ """ A selector that selects files based on other criteria.
+
+ It is similar to the Ant file selector objects in design. This one selects files
+ based on whether the root-most Distribution.Policy.S60 file matches the given value.
+ """
+
+ def __init__(self, policy_files, value, ignoremissingpolicyfiles=False):
+ """ Initialization. """
+ self._negate = False
+ self.values = [v.strip() for v in value.split() if v.strip()!=""]
+ self._policy_files = policy_files
+ self._ignoremissingpolicyfiles = ignoremissingpolicyfiles
+
+ def get_value_and_negate(self, value):
+ """get value and negate it"""
+ if value.startswith('!'):
+ return (value[1:], True)
+ return (value, False)
+
+ def is_selected(self, path):
+ """ Determines if the path is selected by this selector. """
+ current_dir = os.path.abspath(os.path.dirname(path))
+ _logger.debug('is_selected: current dir = ' + current_dir + ' ' + str(os.path.exists(current_dir)))
+ policy_file = None
+ # finding the distribution policy from the filelist.
+ for filename in self._policy_files:
+ #slow method on case sensitive system
+ if os.sep != '\\':
+ for f_dir in os.listdir(current_dir):
+ if f_dir.lower() == filename.lower():
+ policy_file = os.path.join(current_dir, f_dir)
+ break
+ elif os.path.exists(os.path.join(current_dir, filename)):
+ policy_file = os.path.join(current_dir, filename)
+ _logger.debug('Using Policy file: ' + policy_file)
+ break
+
+ policy_value = None
+ if policy_file is None:
+ if not self._ignoremissingpolicyfiles:
+ _logger.error("POLICY_ERROR: Policy file not found under '%s' using names [%s]" % (current_dir, ", ".join(self._policy_files)))
+ policy_value = archive.mappers.MISSING_POLICY
+ else:
+ try:
+ policy_value = fileutils.read_policy_content(policy_file)
+ except Exception:
+ _logger.warning('POLICY_ERROR: Exception thrown parsing policy file: ' + policy_file)
+ policy_value = archive.mappers.MISSING_POLICY
+ # loop through the possible values
+ for value in self.values:
+ (val, negate) = self.get_value_and_negate(value)
+ _logger.debug('Policy value: ' + str(policy_value) + ' ' + val)
+ if (not negate and policy_value == val) or (negate and policy_value != val):
+ return True
+ return False
+
+
+class SymbianPolicySelector:
+ """ A selector that selects files based on other criteria.
+
+ It is similar to the Ant file selector objects in design. This one selects files
+ based on whether the root-most distribution.policy file matches the given value.
+ """
+
+ def __init__(self, policy_files, value):
+ """ Initialization. """
+ self._negate = False
+ self.values = [v.strip() for v in value.split() if v.strip()!=""]
+ self._policy_files = policy_files
+
+
+ def get_value_and_negate(self, value):
+ """get value and negate it"""
+ if value.startswith('!'):
+ return (value[1:], True)
+ return (value, False)
+
+ def is_selected(self, path):
+ """ Determines if the path is selected by this selector. """
+ current_dir = os.path.abspath(os.path.dirname(path))
+ _logger.debug('is_selected: current dir = ' + current_dir + ' ' + str(os.path.exists(current_dir)))
+ policy_file = None
+ # finding the distribution policy from the filelist.
+ for filename in self._policy_files:
+ if os.sep != '\\':
+ for f_dir in os.listdir(current_dir):
+ if f_dir.lower() == filename.lower():
+ policy_file = os.path.join(current_dir, f_dir)
+ _logger.debug('Using Policy file: ' + policy_file)
+ break
+ elif os.path.exists(os.path.join(current_dir, filename)):
+ policy_file = os.path.join(current_dir, filename)
+ _logger.debug('Using Policy file: ' + policy_file)
+ break
+
+ policy_value = None
+ if policy_file is None:
+ _logger.error("POLICY_ERROR: Policy file not found under '%s' using names [%s]" % (current_dir, ", ".join(self._policy_files)))
+ policy_value = archive.mappers.MISSING_POLICY
+ else:
+ try:
+ policy_value = fileutils.read_symbian_policy_content(policy_file)
+ except Exception:
+ _logger.warning('POLICY_ERROR: Exception thrown parsing policy file: ' + policy_file)
+ policy_value = archive.mappers.MISSING_POLICY
+ # loop through the possible values
+ for value in self.values:
+ (val, negate) = self.get_value_and_negate(value)
+ _logger.debug('Policy value: ' + str(policy_value) + ' ' + val)
+ if (not negate and policy_value == val) or (negate and policy_value != val):
+ return True
+ return False
+
+SELECTORS = {'policy': lambda config: DistributionPolicySelector(config.get_list('policy.filenames', ['Distribution.Policy.S60']), config['policy.value']),
+ 'symbian.policy': lambda config: SymbianPolicySelector(config.get_list('policy.filenames', ['distribution.policy']), config['policy.value']),
+ 'distribution.policy.s60': lambda config: DistributionPolicySelector(['Distribution.Policy.S60'], config['distribution.policy.s60'], config['ignore.missing.policyfiles'] == 'true'),
+ }
+
+def get_selector(name, config):
+ """get selector"""
+ if not 'ignore.missing.policyfiles' in config:
+ config['ignore.missing.policyfiles'] = 'false'
+ return SELECTORS[name](config)