configurationengine/source/scripts/conesub_info.py
author terytkon
Sat, 06 Nov 2010 16:59:14 +0200
changeset 9 63964d875993
parent 4 0951727b8815
permissions -rw-r--r--
Merge changes to system model generator to SF tip.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
import sys, zipfile, os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import re, fnmatch
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
from optparse import OptionParser, OptionGroup
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import cone_common
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
from cone.public import api, plugin, utils, exceptions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
from cone.confml import persistentconfml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
from cone.storage.filestorage import FileStorage
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    27
from cone.report import report_util
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
VERSION = '1.0'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
REPORT_SHORTCUTS = {
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    'api': report_util.ReportShortcut(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
        os.path.join(ROOT_PATH, 'info_api_report_template.html'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        'api_report.html',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        "Create a report of the configuration's ConfML API."),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
    'value': report_util.ReportShortcut(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        os.path.join(ROOT_PATH, 'info_value_report_template.html'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        'value_report.html',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        "Create a report of the configuration's data values. Multiple "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        "configurations can also be given using --configurations"),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    'value_csv': report_util.ReportShortcut(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        os.path.join(ROOT_PATH, 'info_value_report_template.csv'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        'value_report.csv',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        "Create a report of the configuration's data values (CSV format)."),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    'api_csv': report_util.ReportShortcut(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        os.path.join(ROOT_PATH, 'info_api_report_template.csv'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        'api_report.csv',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        "Create a report of the configuration's ConfML API (CSV format)."),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
    'impl': report_util.ReportShortcut(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
        os.path.join(ROOT_PATH, 'info_impl_report_template.html'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
        'impl_report.html',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        'Create a report of all implementations in the configuration.'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
    'content': report_util.ReportShortcut(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        os.path.join(ROOT_PATH, 'info_content_report_template.html'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
        'content_report.html',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        'Create a report of the content files in the configuration.'),
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    66
    'ctr_csv': report_util.ReportShortcut(
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    67
        os.path.join(ROOT_PATH, 'info_ctr_report_template.csv'),
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    68
        'ctr_report.csv',
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    69
        'Create a report of CTR configurations (CSV format).'),
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    70
    'ctr': report_util.ReportShortcut(
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    71
        os.path.join(ROOT_PATH, 'info_ctr_report_template.html'),
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    72
        'ctr_report.html',
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    73
        'Create a report of CTR configurations.'),
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
def main():
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    77
    """ Get information about project / configurations. """
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    shortcut_container = report_util.ReportShortcutContainer(REPORT_SHORTCUTS,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
                                                             None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
    parser = OptionParser(version="%%prog %s" % VERSION)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    parser.add_options(cone_common.COMMON_OPTIONS)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
    parser.add_option("-c", "--configuration",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
                      action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
                      dest="configs",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
                      help="Defines a configuration to use in report generation or info printout. "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
                           "May be defined more than once, but multiple configuration will only "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
                           "do anything if the report type supports them. If multiple configurations "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
                           "are not supported, the first one will be used",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
                      metavar="CONFIG",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
                      default=[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
    parser.add_option("--config-wildcard",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
                      action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
                      dest="config_wildcards",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
                      help="Wildcard pattern for including configurations, e.g. product_langpack_*_root.confml",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
                      metavar="WILDCARD",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
                      default=[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
    parser.add_option("--config-regex",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
                      action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
                      dest="config_regexes",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
                      help="Regular expression for including configurations, e.g. product_langpack_\\d{2}_root.confml",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
                      metavar="REGEX",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
                      default=[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
    parser.add_option("-p", "--project",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
                       dest="project",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
                       help="defines the location of current project. Default is the current working directory.",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
                       default=".",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
                       metavar="STORAGE")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
    info_group = OptionGroup(parser, 'Info options',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
                    'The info functionality is meant for printing information about the       '\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
                    'contents of a cpf/zip file or Configuration Project (folder). Two        '\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
                    'separate use cases are currently supported:                              '\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
                    '1. Printing basic information about a project or configuration to        '\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
                    '   stdout.                                                               '\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
                    '2. Creating a report of the contents of a configuration or configurations.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
    info_group.add_option("--report-type",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
                   help="The type of the report to generate. This is a convenience "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
                        "switch for setting the used template.                     "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
                        "Possible values:                                        "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
                        + shortcut_container.get_shortcut_help_text(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
                   metavar="TYPE",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
    info_group.add_option("--report",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
                   help="The file where the configuration info report is written."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
                        "By default this value is determined by the used "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
                        "report type. Example: --report report.html.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
                   metavar="FILE",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
    info_group.add_option("--template",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
                   help="Template used in a report generation. By default "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
                        "this value is determined by the used report type. "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
                        "Example: --template report_template.html.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
                   metavar="FILE",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
    info_group.add_option("--impl-filter",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
                   help="The pattern used for filtering implementations for the "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
                        "report. See the switch --impl in action generate for "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
                        "more info. ",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
                   metavar="PATTERN",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
                   default='.*')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
    info_group.add_option("--view-file",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
                   help="External ConfML file containing the view used for filtering "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
                        "the features listed in the setting value report. The first view "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
                        "defined in the file will be used.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
                   metavar="FILE",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   159
    info_group.add_option("--print-active-root",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   160
                   action="store_true",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   161
                   help="Print active root in the current project and exit.")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   162
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
    parser.add_option_group(info_group)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
    (options, args) = parser.parse_args()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
    cone_common.handle_common_options(options)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   168
    if options.print_active_root:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
        print_active_root(options)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
        sys.exit(0)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   171
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
    if not shortcut_container.is_valid_shortcut(options.report_type):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        parser.error("Invalid report type: %s" % options.report_type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
    if (options.report_type or options.template) and \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        (not options.configs and not options.config_wildcards and not options.config_regexes):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        parser.error("Report type or template specified but configuration(s) not given!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
    if options.view_file and not os.path.isfile(options.view_file):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        parser.error("No such file: %s" % options.view_file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
    # Load view from the specified file if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
    view = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
    if options.view_file:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
            view = _load_view_from_file(options.view_file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
            print "Loaded view '%s' from '%s'" % (view.get_name(), options.view_file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        except ViewLoadError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
            print e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
            sys.exit(1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   190
    current = api.Project(api.Storage.open(options.project,"r", username=options.username, password=options.password))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
    print "Opened project in %s" % options.project
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
    # Get a list of configurations if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
    config_list = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
    if options.configs or options.config_wildcards or options.config_regexes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
            config_list = cone_common.get_config_list_from_project(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
                project          = current,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
                configs          = options.configs,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
                config_wildcards = options.config_wildcards,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
                config_regexes   = options.config_regexes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        except cone_common.ConfigurationNotFoundError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
            parser.error(str(e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
        # Specifying configurations using --configuration should always either result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        # in an error or a configuration, so if there are no configurations, it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        # means that the user specified only wildcards and/or patterns, and none
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
        # matched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
        if len(config_list) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
            parser.error("No matching configurations for wildcard(s) and/or pattern(s).")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
    if config_list is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        # One or more configurations have been specified
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
        if options.report_type is not None or options.template is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
            # Generating a report
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
            # Create a list of configurations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
            configs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
            for config_name in config_list:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
                configs.append(current.get_configuration(config_name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
            # Generate the report
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
            if options.report_type: report_name = options.report_type + '_info'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
            else:                   report_name = 'info'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
            template, report = shortcut_container.determine_template_and_report(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
                options.report_type,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
                options.template,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
                options.report,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
                report_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
            data_providers = {'impl_data'   : ImplDataProvider(configs[0], options.impl_filter),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
                              'api_data'    : ApiDataProvider(configs[0]),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
                              'content_data': ContentDataProvider(configs[0]),
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   235
                              'value_data'  : ValueDataProvider(configs, view),
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   236
                              'ctr_data'    : CtrDataProvider(configs)}
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   237
            report_util.generate_report(template, report, {'data': ReportDataProxy(data_providers)}, [ROOT_PATH])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
            # Printing configuration info
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
            config_name = config_list[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
            config = current.get_configuration(config_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
            print "Opened configuration %s" % config_name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
            print "Features %s" % len(config.get_default_view().list_all_features())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
            print "Impl files %s" % len(plugin.get_impl_set(config).list_implementation())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        print "Configurations in the project."
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
        configlist = current.list_configurations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
        configlist.sort()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        for config in configlist:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
            print config
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
    if current: current.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   254
def print_active_root(options):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   255
    storage = api.Storage.open(options.project,"r", username=options.username, password=options.password)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   256
    active_root = storage.get_active_configuration()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   257
    if active_root:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   258
        print "Active root: %s" % active_root
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   259
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   260
        print "No active root."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   261
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
# Report data proxy and data providers
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
class ReportDataProxy(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
    Proxy object for loading report data on demand.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
    It is used so that e.g. when generating an API report, the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
    implementations are not unnecessarily loaded. The class utilizes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
    ReportDataProviderBase objects to handle the actual data generation,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
    and logs any exceptions that happen there.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
    def __init__(self, data_providers):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        assert isinstance(data_providers, dict), "data_providers must be a dict!"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
        self._data_providers = data_providers
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
    def __getattr__(self, attrname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
        if attrname in self._data_providers:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
                return self._data_providers[attrname].get_data()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
            except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
                utils.log_exception(logging.getLogger('cone'),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
                                    "Exception getting %s: %s" % (attrname, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
            return super(ReportDataProxy, self).__getattr__(attrname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
class ReportDataProviderBase(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
    Report data provider base class for lazy-loading of report data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
    def get_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        Return the report data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        The data is generated on the first call to this, and later the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        cached data is returned.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        CACHE_ATTRNAME = "__datacache"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        if hasattr(self, CACHE_ATTRNAME):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
            return getattr(self, CACHE_ATTRNAME)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
            data = self.generate_data()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
            setattr(self, CACHE_ATTRNAME, data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
            return data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
    def generate_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        Generate the actual report data. Called when get_data() is called
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        the first time.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   314
        raise NotImplementedError()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
# ----------------------------------------------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
class ApiDataProvider(ReportDataProviderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
    def __init__(self, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        self._config = config
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
    def generate_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        columns = {'fqr':'Full reference',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
                   'name':'Name',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
                   'type':'Type',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
                   'desc':'Description',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
                   }
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        data = self._get_feature_api_data(self._config, columns)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        data.sort(key=lambda item: item['fqr'])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        return {'columns'   : columns,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
                'data'      : data}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
    def _get_feature_api_data(cls, config, column_dict):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        # Traverse through all features in the api
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        # and construct the data rows
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        data = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        storageroot = os.path.abspath(config.get_storage().get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        for elem in config.get_default_view().get_features('**'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
            elemfile = os.path.join(storageroot,elem._obj.find_parent(type=api.Configuration).get_full_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
            #print "elemfile %s " % elemfile
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
            featurerow = {'file': elemfile}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
            for col in column_dict:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
                try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
                    featurerow[col] = getattr(elem,col) or ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
                except AttributeError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
                    #logging.getLogger('cone').warning('Could not find attribute %s from %s' % (col, elem.fqr))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
                    featurerow[col] = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
            data.append(featurerow)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        return data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
class ImplDataProvider(ReportDataProviderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
    def __init__(self, config, impl_filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        self._config = config
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        self._impl_filters = impl_filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
    def generate_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        impl_set = plugin.filtered_impl_set(self._config, [self._impl_filters or '.*'])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        return impl_set.get_all_implementations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
class ContentDataProvider(ReportDataProviderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
    def __init__(self, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        self._config = config
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
    def generate_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        class Entry(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
            pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        data = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        layered_content = self._config.layered_content()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        for ref in sorted(layered_content.list_keys()):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
            entry = Entry()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
            entry.file = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
            entry.actual_files = layered_content.get_values(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
            data.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
        return data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   380
class CtrDataProvider(ReportDataProviderBase):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   381
    def __init__(self, configs):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   382
        self._configs = configs
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   383
    
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   384
    def generate_data(self):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   385
        lines = []
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   386
        for config in self._configs:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   387
            lines.extend(self._get_config_data(config))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   388
        return lines
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   389
    
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   390
    def _get_config_data(self, config):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   391
        ctrs = []
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   392
        config_name = config.get_name()
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   393
        ctrs_in_meta_index = config.meta.find_by_attribute('name','based_on_ctr')
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   394
        ctrs = config.meta[ctrs_in_meta_index].attrs['value'].split(',')
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   395
        lines = []
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   396
        ppbit = language = country = uda = ''
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   397
        for c in config.list_configurations():
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   398
            m = re.search(r'/ppbit/ppbit_(.*)/', c)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   399
            if m: ppbit = m.group(1)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   400
            m = re.search(r'/language/(.*)/', c)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   401
            if m: language = m.group(1)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   402
            m = re.search(r'/country/(.*)/', c)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   403
            if m: country = m.group(1)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   404
            m = re.search(r'/uda/(.*)/', c)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   405
            if m: uda = m.group(1)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   406
        for ctr in ctrs:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   407
            data = {'ctr_code':     ctr,
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   408
                    'config_name':  config_name,
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   409
                    'ppbit':        ppbit,
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   410
                    'language':     language,
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   411
                    'country':      country,
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   412
                    'uda':          uda
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   413
                    }
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   414
            lines.append(data)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   415
        return lines
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   416
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
class ValueDataProvider(ReportDataProviderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
    class FeatureGroup(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
        def __init__(self, name, features):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
            self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
            self.features = features
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
    class Feature(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
        def __init__(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
            self.ref  = kwargs['ref']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
            self.name = kwargs['name']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
            self.type = kwargs['type']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
            self.desc = kwargs['desc']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
            self.options = kwargs['options']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
    class Config(object):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   434
        def __init__(self, name, path, values, refs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   435
            self.name = name
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
            self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
            self.values = values
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   438
            self.refs = refs
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
    class SequenceColumn(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
        def __init__(self, ref, name, type):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
            self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
            self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
            self.type = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
        def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
            if type(self) == type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
                for varname in ('ref', 'name', 'type'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
                    if getattr(self, varname) != getattr(other, varname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
                        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
                return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
                return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
        def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
            return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
        def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
            return "SequenceColumn(ref=%r, name=%r, type=%r)" \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
                % (self.ref, self.name, self.type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
    class SequenceData(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
        def __init__(self, columns, rows):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
            self.columns = columns
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
            self.rows = rows
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
            self.is_sequence_data = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
        def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
            if type(self) == type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
                for varname in ('columns', 'rows'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
                    if getattr(self, varname) != getattr(other, varname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
                        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
                return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
                return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
        def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
            return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
        def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
            return "SequenceData(columns=%r, rows=%r)" \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
                % (self.columns, self.rows)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
    def __init__(self, configs, view):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
        assert len(configs) > 0, "configs must contain at least one configuration!"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
        self._configs = configs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
        self._view = view
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
    def generate_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
        configs = self._configs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
        view = self._view
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
        # Get the feature list from the first configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
        feature_groups = self._get_feature_groups(self._configs[0], view)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
        # Load setting values from all configurations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        output_configs = [] # List of self.Config objects, not api.Configuration objects
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
        for i, config in enumerate(self._configs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
            print "Loading configuration %s (%d of %d)" % (config.get_path(), i + 1, len(self._configs))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
            dview = config.get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
            values = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
            for group in feature_groups:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
                for entry in group.features:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
                    try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
                        feature = dview.get_feature(entry.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
                        values[entry.ref] = self._resolve_value(feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
                    except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
                        pass
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   511
            # Get the feature refs from last layer
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   512
            last_layer_refs = set(config.get_last_configuration().list_leaf_datas())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   513
            output_configs.append(self.Config(config.get_name(), config.get_path(), values, last_layer_refs))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
        # Add a 'modified' attribute to all features
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
        for group in feature_groups:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
            for feature in group.features:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
                modified = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
                first_value_set = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
                first_value = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
                for output_config in output_configs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
                    if feature.ref not in output_config.values:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
                        continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
                    if not first_value_set:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
                        first_value = output_config.values[feature.ref]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
                        first_value_set = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
                    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
                        if output_config.values[feature.ref] != first_value:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
                            modified = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
                            break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
                feature.modified = modified
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
        return {'feature_groups' : feature_groups,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
                'configs'        : output_configs}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
    def _resolve_value(self, feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
        Resolve the value of the given feature (must be a data proxy).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
        @param feature: The feature whose value is to be resolved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
        @return: The resolved value (value directly from the feature, name of a selection option,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
            or a SequenceData object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
        assert isinstance(feature, api._FeatureDataProxy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
        if isinstance(feature._obj, api.FeatureSequence):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
            return self._get_sequence_data(feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
        return self._resolve_option_value(feature, feature.get_value())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
    def _resolve_option_value(self, feature, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
        Resolve an option value for the given feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
        @param feature: The feature, can be a data proxy or the feature object itself.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
        @param value: The value to resolve.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
        @return: The resolved value; the name of the selected option if possible,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
            otherwise the value that was passed in.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
        if isinstance(feature, api._FeatureDataProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
            feature = feature._obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
        for option in self._get_options(feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
            if option.get_value() == value:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
                return option.get_name()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
        return value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
    def _get_sequence_data(self, seq_feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
        Return a SequenceData object based on the given sequence feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
        assert isinstance(seq_feature, api._FeatureDataProxy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
        assert isinstance(seq_feature._obj, api.FeatureSequence)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
        sub_feature_objs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
        columns = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
        for obj in seq_feature._obj._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
            if isinstance(obj, api.Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
                col = self.SequenceColumn(obj.ref, obj.name, obj.type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
                columns.append(col)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
                sub_feature_objs.append(obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
        rows = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
        for value_row in seq_feature.get_value():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
            row = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
            for index, value_item in enumerate(value_row):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
                ref = columns[index].ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
                sub_feature = sub_feature_objs[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
                value = self._resolve_option_value(sub_feature, value_item)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
                row[ref] = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
            rows.append(row)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
        return self.SequenceData(columns, rows)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
    def _get_feature_groups(self, config, view):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        Return a list of FeatureGroup objects generated based on the given configuration and view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
        @param configuration: The configuration to use.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
        @param view: The view to use. Can be None, in which case all features in the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
            configuration will be used.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
        feature_groups = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
        if view is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
            feature_list = self._get_feature_list(config.get_default_view().get_features('**'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
            feature_groups = [self.FeatureGroup('All settings', feature_list)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
            # Populate the view so that it contains the settings and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
            # get_features() can be used
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
            config._add(view)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
            view.populate()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
            # Recursively collect a flattened list of all groups
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
            def visit_group(group, name_prefix):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
                name = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
                # Ignore the name for the view, record only group-level names
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
                # (the view cannot directly contain settings according to the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
                # spec, they need to be inside a group)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
                if not isinstance(group, api.View):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
                    if name_prefix: name = name_prefix + ' -- ' + group.get_name()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   625
                    else:           name = group.get_name()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   626
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   627
                # Add features if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   628
                features = self._get_feature_list(group.get_features('*'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   629
                if len(features) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   630
                    feature_groups.append(self.FeatureGroup(name, features))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   631
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   632
                # Recurse to child groups
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   633
                for child in group._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   634
                    if isinstance(child, api.Group):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   635
                        visit_group(child, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   636
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   637
            visit_group(view, None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   639
        return feature_groups
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   640
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   641
    def _get_feature_list(self, feature_objects):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   642
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   643
        Return a list of feature data entries based on the given features.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   644
        @param feature_objects: List of api._FeatureDataProxy objects, e.g.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   645
            the output of api.Group.get_features().
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   646
        @return: List of ValueDataProvider.Feature objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   647
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   648
        refs = set()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   649
        feature_list = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   650
        for elem in feature_objects:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
            # Ignore elements with no type (they are not settings)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
            if not hasattr(elem, 'type') or elem.type in (None, ''):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   653
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   654
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   655
            # For sequences don't include sub-settings, only the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   656
            # sequence settings themselves
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   657
            feature = self._get_parent_sequence_or_self(elem._obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   658
            ref = feature.fqr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
            # Don't add if it's already in the list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
            if ref in refs: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
            else:           refs.add(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
            feature_data = self.Feature(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
                ref  = ref,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
                name = feature.name,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
                type = feature.type,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
                desc = feature.desc,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
                options = self._get_options(feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   670
            feature_list.append(feature_data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   671
        return feature_list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   672
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   673
    def _get_options(self, feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   674
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   675
        Return a list of api.Option objects for the given feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   676
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   677
        if isinstance(feature, api._FeatureDataProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   678
            feature = feature._obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   679
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   680
        options = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   681
        for obj in feature._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   682
            if isinstance(obj, api.Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   683
                options.append(obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   684
        return options
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   685
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   686
    def _get_parent_sequence_or_self(self, feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   687
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   688
        Return the parent sequence of the given feature, or the feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   689
        itself if it is not a sequence sub-setting.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   690
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   691
        current = feature._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   692
        while current is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   693
            if isinstance(current, api.FeatureSequence):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   694
                return current
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   695
            current = current._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   696
        return feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   697
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   698
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   699
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   700
# Helper functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   701
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   702
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   703
class ViewLoadError(RuntimeError):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   704
    """Exception raised if _load_view_from_file() fails"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   705
    pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   706
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   707
def _load_view_from_file(filename):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   708
    """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   709
    Load the last view from the given ConfML file.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   710
    @raise ViewLoadError: An error occurred when loading the file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   711
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   712
    file_abspath = os.path.abspath(filename)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   713
    file_dir = os.path.dirname(file_abspath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   714
    file_name = os.path.basename(file_abspath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   715
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   716
    # Open the view file inside a "project" so that XIncludes are
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   717
    # handled properly
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   718
    try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   719
        view_project = api.Project(FileStorage(file_dir, 'r'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   720
        view_config = view_project.get_configuration(file_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   721
        views = view_config._traverse(type=api.View)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   722
    except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   723
        import traceback
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   724
        logging.getLogger('cone').debug(traceback.format_exc())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   725
        raise ViewLoadError("Error parsing view ConfML file: %s" % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   726
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   727
    if len(views) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   728
        raise ViewLoadError("No views in specified view ConfML file '%s'" % filename)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   729
    elif len(views) == 1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   730
        return views[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   731
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   732
        print "Found %d view(s) in file '%s', using the last one" % (len(views), filename)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   733
        return views[-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   734
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   735
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   736
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   737
if __name__ == "__main__":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   738
    main()