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