configurationengine/source/cone/validation/common.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
import sys
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    18
import logging
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    19
import inspect
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    20
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    21
def load_plugin_classes(entry_point_group, base_class):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    22
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    23
    Load plugin classes from plug-in entry points.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    24
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    25
    @param entry_point_group: Entry point group from which to load
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    26
        classes. Each entry point is expected to be an iterable of
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    27
        plugin class instances.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    28
    @param base_class: The base class that every loaded class must inherit.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    29
    @return: List of loaded plugin classes.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    30
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    31
    log = logging.getLogger('cone')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    32
    log.setLevel(logging.DEBUG)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    33
    validator_classes = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    34
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    35
    import pkg_resources
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    36
    working_set = pkg_resources.WorkingSet(sys.path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    37
    for entry_point in working_set.iter_entry_points(entry_point_group):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    38
        class_list = entry_point.load()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    39
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    40
        # Make sure that the class list is a list
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    41
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    42
            class_list = [c for c in class_list]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    43
        except:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    44
            log.warn("Entry point %s:%s is not iterable (%r)" % (entry_point_group, entry_point.name, class_list))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    45
            continue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    46
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    47
        for i, cls in enumerate(class_list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    48
            if not inspect.isclass(cls):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    49
                log.warn("Object %d from entry point %s:%s is not a class (%r)" % (i, entry_point_group, entry_point.name, cls))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    50
            elif not issubclass(cls, base_class):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    51
                log.warn("Object %d from entry point %s:%s is not a sub-class of %s.%s (%r)" \
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    52
                         % (i, entry_point, entry_point.name,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    53
                            base_class.__module__,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    54
                            base_class.__name__,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    55
                            cls))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    56
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    57
                msg = "Validator class %r loaded from egg entry point %s:%s, item %d" % (cls, entry_point_group, entry_point.name, i)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    58
                log.debug(msg)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    59
                #print msg
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    60
                validator_classes.append(cls)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    61
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    62
    return validator_classes
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    63
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    64
def filter_classes(classes, filter):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    65
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    66
    Filter the given list of validator by the given ProblemTypeFilter object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    67
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    68
    @param classes: The class list for filter. Each 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    69
        class is assumed to have a PROBLEM_TYPES attribute that defines
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    70
        an iterable of the types of problems that the problem yields.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    71
    @param filter: The filter object to use. Can be None, in which case
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    72
        the class list is simply returned back.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    73
    @return: The filtered list.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    74
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    75
    if filter == None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    76
        return classes
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    77
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    78
        result = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    79
        for klass in classes:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    80
            for problem_type in klass.PROBLEM_TYPES:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    81
                if filter.match(problem_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    82
                    result.append(klass)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    83
                    break
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    84
        return result