configurationengine/source/cone/validation/problem_type_filter.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     1
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     3
# All rights reserved.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     4
# This component and the accompanying materials are made available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     6
# which accompanies this distribution, and is available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     8
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     9
# Initial Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    11
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    12
# Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    13
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    14
# Description: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    15
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    16
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    17
class ProblemTypeFilter(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    18
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    19
    Class for filtering problem types.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    20
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    21
    An instance of this class can be constructed with includes
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    22
    and excludes, and then it can be asked if a certain problem
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    23
    type matches and should be included.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    24
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    25
    def __init__(self, includes, excludes):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    26
        self._includes = [Pattern(expr) for expr in includes]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    27
        self._excludes = [Pattern(expr) for expr in excludes]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    28
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    29
    def match(self, problem_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    30
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    31
        Check whether the given problem type matches the filter or not.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    32
        @return: True if matches (should be included), False if not.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    33
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    34
        # No filters: always match
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    35
        if not self._includes and not self._excludes:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    36
            return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    37
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    38
        # Filter out entries that don't match includes
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    39
        if self._includes and not self._match(self._includes, problem_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    40
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    41
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    42
        # Filter out entries that match excludes
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    43
        if self._excludes and self._match(self._excludes, problem_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    44
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    45
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    46
        return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    47
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    48
    def filter(self, lst, key=lambda item: item.type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    49
        result = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    50
        for item in lst:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    51
            if self.match(key(item)):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    52
                result.append(item)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    53
        return result
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    54
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    55
    def _match(self, patterns, problem_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    56
        for p in patterns:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    57
            if p.match(problem_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    58
                return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    59
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    60
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    61
class Pattern(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    62
    def __init__(self, pattern):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    63
        self.elements = pattern.split('.')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    64
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    65
    def match(self, problem_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    66
        type_elements = problem_type.split('.')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    67
        for i in xrange(max(len(type_elements), len(self.elements))):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    68
            if i < len(type_elements):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    69
                type_elem = type_elements[i]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    70
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    71
                # The pattern is longer than the type, so it cannot
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    72
                # possibly match.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    73
                # E.g. type = 'foo', pattern = 'foo.bar.baz'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    74
                return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    75
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    76
            if i < len(self.elements):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    77
                pattern_elem = self.elements[i]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    78
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    79
                # The pattern ends and we have matched so far, so the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    80
                # type is a sub-type of an included one.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    81
                # E.g. type = 'foo.bar.baz', pattern = 'foo.bar'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    82
                return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    83
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    84
            if pattern_elem != '*' and type_elem != pattern_elem:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    85
                return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    86
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    87
        return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    88