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