configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_validators.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
from cone.public import api, exceptions
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    18
from cone.validation.implmlvalidation import ImplValidatorBase
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    19
from CRMLPlugin import crml_impl
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    20
from CRMLPlugin import crml_model
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    21
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    22
class CrmlValidatorBase(ImplValidatorBase):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    23
    SUPPORTED_IMPL_CLASSES = crml_impl.CrmlImpl
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    24
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    25
class CrmlReferenceValidator(CrmlValidatorBase):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    26
    PROBLEM_TYPES = ['model.implml.crml.invalid_ref']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    27
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    28
    def validate(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    29
        self.dview = self.context.configuration.get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    30
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    31
        for key in self.impl.repository.keys:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    32
            if isinstance(key, crml_model.CrmlSimpleKey):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    33
                self._check_ref(key.ref, key.line)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    34
            elif isinstance(key, crml_model.CrmlBitmaskKey):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    35
                for bit in key.bits:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    36
                    self._check_ref(bit.ref, bit.line)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    37
            elif isinstance(key, crml_model.CrmlKeyRange):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    38
                for subkey in key.subkeys:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    39
                    fullref = "%s.%s" % (key.ref, subkey.ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    40
                    self._check_ref(fullref, subkey.line)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    41
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    42
    def _check_ref(self, ref, line):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    43
        self.check_feature_reference(ref, line, self.PROBLEM_TYPES[0])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    44
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    45
class CrmlDuplicateUidValidator(CrmlValidatorBase):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    46
    PROBLEM_TYPES = ['model.implml.crml.duplicate_uid']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    47
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    48
    def validate(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    49
        # Collect a dictionary of CRML keys by UID
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    50
        keys_by_uid = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    51
        for key in self.impl.repository.keys:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    52
            if isinstance(key, (crml_model.CrmlSimpleKey, crml_model.CrmlBitmaskKey)):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    53
                try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    54
                    try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    55
                        uid = long(key.int)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    56
                    except ValueError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    57
                        uid = long(key.int, 16)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    58
                except ValueError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    59
                    # Silently ignore non-numeric UID values (they should be caught
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    60
                    # by other validation)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    61
                    continue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    62
                keys = keys_by_uid.get(uid, [])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    63
                keys.append(key)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    64
                keys_by_uid[uid] = keys
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    65
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    66
        # Check for duplicates
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    67
        for uid, keys in keys_by_uid.iteritems():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    68
            if len(keys) > 1:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    69
                if len(keys) > 2:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    70
                    key_lst = "keys on lines %s" % ', '.join([str(key.line) for key in keys[:-2]])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    71
                    key_lst += ' and %s' % keys[-2].line
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    72
                else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    73
                    key_lst = "key on line %s" % keys[-2].line
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    74
                prob = api.Problem(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    75
                    msg = "Duplicate key UID 0x%08X (duplicate with %s)" % (uid, key_lst),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    76
                    type = self.PROBLEM_TYPES[0],
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    77
                    line = keys[-1].line,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    78
                    file = self.impl.ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    79
                self.context.problems.append(prob)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    80
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    81
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    82
VALIDATOR_CLASSES = [CrmlReferenceValidator, CrmlDuplicateUidValidator]