configurationengine/source/scripts/conesub_validate.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, os, shutil
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    18
import logging
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    19
from optparse import OptionParser, OptionGroup
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    20
import cone_common
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    21
from cone.report import report_util
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    22
from cone.public import api, exceptions, utils, plugin, parsecontext
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    23
import cone.validation.parsecontext
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    24
import cone.validation.schemavalidation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    25
import cone.validation.implmlvalidation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    26
import cone.validation.confmlvalidation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    27
from cone.validation.problem_type_filter import ProblemTypeFilter
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    28
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    29
ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    30
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    31
VERSION     = '1.0'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    32
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    33
logger    = logging.getLogger('cone')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    34
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    35
REPORT_SHORTCUTS = {
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    36
    'xml': report_util.ReportShortcut(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    37
        os.path.join(ROOT_PATH, 'validation_report_template.xml'),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    38
        'validation_report.xml',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    39
        "Create a validation report of xml type."),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    40
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    41
    'html': report_util.ReportShortcut(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    42
        os.path.join(ROOT_PATH, 'validation_report_template.html'),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    43
        'validation_report.html',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    44
        "Create a validation report of html type."),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    45
}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    46
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    47
def main():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    48
    """ Validate a configuration, or individual confml/implml files. """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    49
    shortcut_container = report_util.ReportShortcutContainer(REPORT_SHORTCUTS,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    50
                                                             'html')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    51
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    52
    parser = OptionParser(version="ConE validate %s" % VERSION)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    53
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    54
    parser.add_options(cone_common.COMMON_OPTIONS)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    55
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    56
    parser.add_option("-c", "--configuration",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    57
                        dest="configuration",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    58
                        help="Defines the name of the configuration for the action",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    59
                        metavar="CONFIG")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    60
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    61
    parser.add_option("-p", "--project",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    62
                       dest="project",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    63
                       default=".",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    64
                       help="defines the location of current project. Default is the "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    65
                            "current working directory.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    66
                       metavar="STORAGE")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    67
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    68
    group = OptionGroup(parser, 'Validate options',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    69
                        'The validate action is intended for performing validation on a     '\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    70
                        'configuration or individual files.                                 ')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    71
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    72
    group.add_option('--confml-file',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    73
                     action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    74
                     help='Validate only the given single ConfML file.',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    75
                     metavar="FILE",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    76
                     default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    77
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    78
    group.add_option('--implml-file',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    79
                     action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    80
                     help='Validate only the given single ImplML file.',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    81
                     metavar="FILE",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    82
                     default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    83
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    84
    group.add_option("--template",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    85
                     help="Template used in report generation. "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    86
                          "Example: --template=report_template.html.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    87
                     metavar="FILE",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    88
                     default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    89
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    90
    group.add_option("--report-type",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    91
                   help="The type of the report to generate. This is a convenience "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    92
                        "switch for setting the used template. If --template is given, this option has no effect. "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    93
                        "Possible values:                                        "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    94
                        + shortcut_container.get_shortcut_help_text(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    95
                   metavar="TYPE",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    96
                   default=None)    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    97
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    98
    group.add_option("--report",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    99
                   help="Specifies the location of the validation report. "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   100
                        "Example --report=report.html.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   101
                   metavar="FILE",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   102
                   default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   103
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   104
    group.add_option("--dump-schema-files",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   105
                     help="Dump the XML schema files used for validation into the specified directory.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   106
                     metavar="DIR",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   107
                     default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   108
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   109
    group.add_option("--exclude-filter",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   110
                     action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   111
                     help="Exclude validation problems by given filter. "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   112
                          "Examples: --exclude-filter=schema, --exclude-filter=schema.implml, --exclude-filter=schema.confml, --exclude-filter=schema.implml.ruleml",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   113
                     default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   114
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   115
    group.add_option("--include-filter",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   116
                     action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   117
                     help="Include validation problems by given filter."\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   118
                          "Examples: --include-filter=schema.implml, --include-filter=schema.implml.ruleml",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   119
                     default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   120
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   121
    parser.add_option_group(group)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   122
    (options, _) = parser.parse_args()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   123
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   124
    cone_common.handle_common_options(options)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   125
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   126
    if not shortcut_container.is_valid_shortcut(options.report_type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   127
        parser.error("Invalid report type: %s" % options.report_type)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   128
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   129
    if options.dump_schema_files:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   130
        dump_dir = options.dump_schema_files
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   131
        print "Dumping XML schema files to '%s'" % dump_dir
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   132
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   133
        cone.validation.schemavalidation.dump_schema_files(dump_dir)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   134
        return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   135
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   136
    pt_filter = ProblemTypeFilter(includes = options.include_filter or [],
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   137
                               excludes = options.exclude_filter or [])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   138
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   139
    problems = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   140
    if options.confml_file or options.implml_file:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   141
        if options.confml_file:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   142
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   143
            func = cone.validation.schemavalidation.validate_confml_data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   144
            for file in options.confml_file:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   145
                problems.extend(validate_file(file, func))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   146
        if options.implml_file:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   147
            func = cone.validation.schemavalidation.validate_implml_data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   148
            for file in options.implml_file:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   149
                problems.extend(validate_file(file, func))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   150
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   151
        problems = validate_configuration(options.project, options.configuration, pt_filter)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   152
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   153
    if problems is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   154
        filters = {'filter_by_severity':filter_by_severity}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   155
        problems = pt_filter.filter(problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   156
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   157
        print "Total %d problem(s) after filtering" % len(problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   158
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   159
        print "Generating report..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   160
        problems.sort(key=lambda p: (p.severity, p.file, p.line))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   161
        template, report = shortcut_container.determine_template_and_report(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   162
            options.report_type,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   163
            options.template,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   164
            options.report,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   165
            'validation_report')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   166
        report_util.generate_report(template, report, {'problems': problems},extra_filters=filters)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   167
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   168
def extend_without_duplicates(source, target):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   169
    for item in source:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   170
        if item not in target:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   171
            target.append(item)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   172
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   173
def validate_file(filename, validator_func):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   174
    if not os.path.isfile(filename):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   175
        print "'%s' does not exist or is not a file!" % filename
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   176
        return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   177
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   178
        print "Validating file '%s'" % filename
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   179
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   180
    f = open(filename, 'rb')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   181
    try:        data = f.read()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   182
    finally:    f.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   183
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   184
    problems = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   185
    try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   186
        validator_func(data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   187
    except exceptions.ParseError, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   188
        problems.append(api.Problem.from_exception(e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   189
    print "Found %d problem(s)" % len(problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   190
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   191
    for p in problems:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   192
        p.file = filename
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   193
    return problems
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   194
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   195
def validate_configuration(project_path, config_path, problem_type_filter):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   196
    print "Project:       %s" % project_path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   197
    try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   198
        project = api.Project(api.Storage.open(project_path, 'r'))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   199
    except exceptions.StorageException:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   200
        print "No such project."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   201
        return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   202
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   203
    confml_parse_context = cone.validation.parsecontext.ValidationParseContext()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   204
    parsecontext.set_confml_context(confml_parse_context)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   205
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   206
    if config_path is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   207
        config_path = project.get_storage().get_active_configuration()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   208
        if config_path is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   209
            print "Project does not have an active configuration, please specify the configuration using --configuration."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   210
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   211
    print "Configuration: %s" % config_path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   212
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   213
    try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   214
        config  = project.get_configuration(config_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   215
    except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   216
        print "No such configuration in project."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   217
        return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   218
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   219
    result = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   220
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   221
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   222
    print "Finding ConfML files in configuration..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   223
    configs = config._traverse(type=api.Configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   224
    print "%d ConfML file(s)" % len(configs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   225
    print "%d problem(s) while parsing" % len(confml_parse_context.problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   226
    result.extend(confml_parse_context.problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   227
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   228
    # Schema-validate ConfML files if not filtered out
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   229
    if problem_type_filter.match('schema.confml'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   230
        print "Performing XML schema validation on ConfML files..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   231
        schema_problems = cone.validation.schemavalidation.validate_confml_file(config, config_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   232
        for conf in configs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   233
            path = conf.get_full_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   234
            problems = cone.validation.schemavalidation.validate_confml_file(config, path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   235
            schema_problems.extend(problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   236
        print "%d problem(s)" % len(schema_problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   237
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   238
        # Add the schema problems with duplicates removed, since XML parse
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   239
        # errors might have already been recorded in the ConfML parsing phase
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   240
        extend_without_duplicates(source=schema_problems, target=result)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   241
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   242
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   243
    # Validate the ConfML model if not filtered out
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   244
    validator_classes = cone.validation.confmlvalidation.get_validator_classes(problem_type_filter)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   245
    if validator_classes:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   246
        print "Validating ConfML model..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   247
        model_problems = cone.validation.confmlvalidation.validate_configuration(config, validator_classes).problems
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   248
        print "%d problem(s)" % len(model_problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   249
        result.extend(model_problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   250
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   251
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   252
    print "Finding ImplML files in configuration..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   253
    impls = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   254
    for file in config.get_layer().list_implml():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   255
        if plugin.ImplFactory.is_supported_impl_file(file):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   256
            impls.append(file)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   257
    print "Found %d supported files" % len(impls)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   258
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   259
    # Schema-validate ImplML files if not filtered out
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   260
    if problem_type_filter.match('schema.implml'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   261
        print "Performing XML schema validation on ImplML files..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   262
        schema_problems = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   263
        for impl in impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   264
            probs = cone.validation.schemavalidation.validate_implml_file(config, impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   265
            schema_problems.extend(probs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   266
        print "%d problem(s)" % len(schema_problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   267
        result.extend(schema_problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   268
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   269
    # Validate the ImplML model if not filtered out
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   270
    if problem_type_filter.match('model.implml'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   271
        print "Parsing implementations..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   272
        implml_parse_context = cone.validation.parsecontext.ValidationParseContext()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   273
        parsecontext.set_implml_context(implml_parse_context)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   274
        impl_set = plugin.create_impl_set(impls, config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   275
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   276
        # Add the model-level problems with duplicates removed, since XML parse
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   277
        # errors might have already been recorded in the schema validation phase
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   278
        extend_without_duplicates(source=implml_parse_context.problems, target=result)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   279
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   280
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   281
        validator_classes = cone.validation.implmlvalidation.get_validator_classes(problem_type_filter)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   282
        if validator_classes:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   283
            print "Validating implementations..."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   284
            impl_problems = cone.validation.implmlvalidation.validate_impl_set(impl_set, config, validator_classes)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   285
            print "%d problem(s)" % len(impl_problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   286
            result.extend(impl_problems)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   287
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   288
    return result
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   289
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   290
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   291
def filter_by_severity(problems, severity):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   292
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   293
    Filter problems by severity
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   294
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   295
    return [p for p in problems if p.severity == severity]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   296
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   297
if __name__ == "__main__":
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   298
    main()