configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_validators.py
changeset 3 e7e0ae78773e
equal deleted inserted replaced
2:87cfa131b535 3:e7e0ae78773e
       
     1 #
       
     2 # Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description: 
       
    15 #
       
    16 
       
    17 from cone.public import api, exceptions
       
    18 from cone.validation.implmlvalidation import ImplValidatorBase
       
    19 from CRMLPlugin import crml_impl
       
    20 from CRMLPlugin import crml_model
       
    21 
       
    22 class CrmlValidatorBase(ImplValidatorBase):
       
    23     SUPPORTED_IMPL_CLASSES = crml_impl.CrmlImpl
       
    24 
       
    25 class CrmlReferenceValidator(CrmlValidatorBase):
       
    26     PROBLEM_TYPES = ['model.implml.crml.invalid_ref']
       
    27     
       
    28     def validate(self):
       
    29         self.dview = self.context.configuration.get_default_view()
       
    30         
       
    31         for key in self.impl.repository.keys:
       
    32             if isinstance(key, crml_model.CrmlSimpleKey):
       
    33                 self._check_ref(key.ref, key.line)
       
    34             elif isinstance(key, crml_model.CrmlBitmaskKey):
       
    35                 for bit in key.bits:
       
    36                     self._check_ref(bit.ref, bit.line)
       
    37             elif isinstance(key, crml_model.CrmlKeyRange):
       
    38                 for subkey in key.subkeys:
       
    39                     fullref = "%s.%s" % (key.ref, subkey.ref)
       
    40                     self._check_ref(fullref, subkey.line)
       
    41     
       
    42     def _check_ref(self, ref, line):
       
    43         self.check_feature_reference(ref, line, self.PROBLEM_TYPES[0])
       
    44 
       
    45 class CrmlDuplicateUidValidator(CrmlValidatorBase):
       
    46     PROBLEM_TYPES = ['model.implml.crml.duplicate_uid']
       
    47     
       
    48     def validate(self):
       
    49         # Collect a dictionary of CRML keys by UID
       
    50         keys_by_uid = {}
       
    51         for key in self.impl.repository.keys:
       
    52             if isinstance(key, (crml_model.CrmlSimpleKey, crml_model.CrmlBitmaskKey)):
       
    53                 try:
       
    54                     try:
       
    55                         uid = long(key.int)
       
    56                     except ValueError:
       
    57                         uid = long(key.int, 16)
       
    58                 except ValueError:
       
    59                     # Silently ignore non-numeric UID values (they should be caught
       
    60                     # by other validation)
       
    61                     continue
       
    62                 keys = keys_by_uid.get(uid, [])
       
    63                 keys.append(key)
       
    64                 keys_by_uid[uid] = keys
       
    65         
       
    66         # Check for duplicates
       
    67         for uid, keys in keys_by_uid.iteritems():
       
    68             if len(keys) > 1:
       
    69                 if len(keys) > 2:
       
    70                     key_lst = "keys on lines %s" % ', '.join([str(key.line) for key in keys[:-2]])
       
    71                     key_lst += ' and %s' % keys[-2].line
       
    72                 else:
       
    73                     key_lst = "key on line %s" % keys[-2].line
       
    74                 prob = api.Problem(
       
    75                     msg = "Duplicate key UID 0x%08X (duplicate with %s)" % (uid, key_lst),
       
    76                     type = self.PROBLEM_TYPES[0],
       
    77                     line = keys[-1].line,
       
    78                     file = self.impl.ref)
       
    79                 self.context.problems.append(prob)
       
    80 
       
    81 
       
    82 VALIDATOR_CLASSES = [CrmlReferenceValidator, CrmlDuplicateUidValidator]