configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrml_parser.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
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import sys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import xml.parsers.expat
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import codecs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
from hcrplugin.hcr_exceptions import *
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
from hcrplugin.hcrrepository import HcrRecord, HcrRepository
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
from hcrplugin.hcr_writer import HcrWriter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
from hcrplugin.header_writer import *
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
    from cElementTree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    try:    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
        from elementtree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
            from xml.etree import cElementTree as ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
            from xml.etree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
import __init__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
from cone.public import exceptions,plugin,utils,api
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
class HcrmlImpl(plugin.ImplBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    <class description>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    IMPL_TYPE_ID = "hcrml"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    def __init__(self, resource_ref, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        plugin.ImplBase.__init__(self, resource_ref, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        self.logger = logging.getLogger('cone.hcrml(%s)' % resource_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        self.configuration = configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        self.hcrml_file = resource_ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        Generate the given implementation. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        @return: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
        outputfile = self.__get_output_filename()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        if outputfile != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
            # Create the path to the output file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
            output_path = os.path.dirname(outputfile)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
            if output_path != '' and not os.path.exists(output_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
                os.makedirs(output_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        # For output type 'hcr', write the binary repository file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
        if self.output_obj.type == 'hcr':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
            self.logger.info("Generating binary repository to '%s'" % outputfile)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
            writer = HcrWriter()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
            repo = self.output_obj.get_hcr_repository()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
            data = writer.get_repository_bindata(repo)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
            f = open(outputfile,'wb')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
            try:        f.write(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
            finally:    f.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        elif self.output_obj.type == 'header':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
            self.logger.info("Generating header file to '%s'" % outputfile)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
            writer = HeaderWriter(outputfile, self.output_obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
            writer.write()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        elif self.output_obj.type == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
            # The HCRML file contains no <output> element, so no output should
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
            # be generated
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
            pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    def get_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        return self.refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        Return a list of output files as an array. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        fname = self.__get_output_filename()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        return [fname] if fname else []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
    def __get_output_filename(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        if self.output_obj.file != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
            return os.path.normpath(os.path.join(self.output, self.output_obj.file))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
class HcrmlReader(plugin.ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
    NAMESPACE = 'http://www.symbianfoundation.org/xml/hcrml/1'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
    FILE_EXTENSIONS = ['hcrml']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
    def __init__(self, resource_ref, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        self.configuration = configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        self.hcrml_file = resource_ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        self.refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        self.namespaces = [self.NAMESPACE]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        self.doc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
    def read_impl(cls, resource_ref, configuration, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        reader = HcrmlReader(resource_ref, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        reader.doc = etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        impl = HcrmlImpl(resource_ref, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        impl.output_obj = reader.read_hcrml_output()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        impl.refs = reader.refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
        return impl
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
    def read_hcrml_output(self, ignore_includes=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        output = Output()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        # There should only be one <output> element, so use find()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        out_elem = self.doc.find("{%s}output" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        if out_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
            version = out_elem.get('version')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
            read_only = out_elem.get('readOnly')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
            file = out_elem.get('file')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
            type = out_elem.get('type')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
            if type == None or type == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
                raise NoTypeDefinedInOutPutTagError("Type attribute missing in hcrml file")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
            if type not in ('hcr', 'header'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
               raise InvalidTypeDefinedInOutPutTagError("Type attribute invalid in hcrml file: %s" % type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
           
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
            output.version = version
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
            output.read_only = read_only
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
            output.file = file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
            output.type = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
            # An <output> element may contain <include> elements for including other
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
            # HCRML files, so read and include categories from those
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
            if not ignore_includes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
                included_files = self.read_hcrml_includes(out_elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
                read_categories = self.read_categories_from_hcrml_files(included_files)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
                output.categories.extend(read_categories)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        """ output tag is not mandatory, but there should be some categories included """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        for cat_elem in self.doc.getiterator("{%s}category" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
            category = self.read_hrcml_category(cat_elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
            output.categories.append(category)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        return output 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
    def read_hcrml_includes(self, output_elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        Read all <include> elements under an <output> element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
        @return: List of other HCRML files to include.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        include_refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        for include_elem in output_elem.findall("{%s}include" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
            ref = include_elem.get('ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
            if ref != None: include_refs.append(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        if include_refs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
            # There are include refs, construct the list of files that should
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
            # be included
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
            all_files = self.configuration.list_resources()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
            included_files = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
            for ref in include_refs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
                files_by_ref = self.filter_file_list_by_include_ref(all_files, ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
                result.extend(files_by_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        # Make sure that no file is in the list more than once
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        result = list(set(result))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
    def read_categories_from_hcrml_files(self, files):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
        Read all categories from the list of the given HCRML files.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        categories = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        for file in files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
            # Skip the current file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
            if os.path.normpath(file) == os.path.normpath(self.hcrml_file):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            # Read the <output> element and append its categories to the result list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
            reader = HcrmlReader(file, self.configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
            reader.doc = self._read_xml_doc_from_resource(file, self.configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
            # Read the output element, but ignore includes, since we are
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
            # currently reading from inside an include
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
            output_obj = reader.read_hcrml_output(ignore_includes=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
            categories.extend(output_obj.categories)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        return categories
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
    def read_hrcml_category(self,cat_elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        category_uid = cat_elem.get('uid')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        if category_uid == None or category_uid == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
           raise NoCategoryUIDInHcrmlFileError("No category uid attribute implemented in hcrml file!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        name = cat_elem.get('name')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        if name == None or name == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
           raise NoCategoryNameInHcrmlFileError("No category name attribute implemented in hcrml file!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
        category = Category()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        category.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
            category.category_uid = long(category_uid)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
        except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
            category.category_uid = long(category_uid, 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        category.xml_elem = cat_elem  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
        for setting_elem in cat_elem.getiterator("{%s}setting" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
             setting = self.read_hcrml_setting(setting_elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
             category.settings.append(setting)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        return category
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
    def read_hcrml_setting(self,setting_elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        ref = setting_elem.get('ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        if ref == None or ref == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
            raise NoRefInHcrmlFileError("No ref in setting tag attribute implemented in hcrml file!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
            self.refs.append(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        type = setting_elem.get('type')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        if type == None or type == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
            raise NoTypeAttributeInSettingHcrmlFileError("No type in setting tag attribute implemented in hcrml file ref: %s" % ref )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        name = setting_elem.get('name')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        if name == None or name == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
            raise NoNameAttributeInSettingHcrmlFileError("No type in setting tag attribute implemented in hcrml file ref: %s" % ref )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        id = setting_elem.get('id')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        if id == None or id == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
            raise NoIdAttributeInSettingHcrmlFileError("No id in setting tag attribute implemented in hcrml file ref: %s" % ref )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        comment = setting_elem.get('comment')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        if comment == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
            comment = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
        setting = Setting(self.configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
        setting.comment = comment
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
        setting.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        setting.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
            setting.id = long(id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
            setting.id = long(id, 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        setting.type = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        setting.xml_elem = setting_elem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        for flag_elem in setting_elem.getiterator("{%s}flags" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
             flag = self.read_hrcml_flags(setting_elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
             setting.flag = flag
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        return setting
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
    def read_hrcml_flags(self,flag_elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
         Uninitialised = flag_elem.get('Uninitialised') 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
         Modifiable = flag_elem.get('Modifiable')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
         Persistent = flag_elem.get('Persistent')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
         flag = Flag()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
         flag.Uninitialised = Uninitialised
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
         flag.Modifiable = Modifiable
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
         flag.Persistent = Persistent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
         return flag
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
     
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
    def filter_file_list_by_include_ref(self, files, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        pattern = ref + '$'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
        pattern = pattern.replace('.', r'\.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
        pattern = pattern.replace('*', '.*')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        pattern = '(^|.*/)' + pattern
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
        for file in files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
            if re.match(pattern, file.replace('\\', '/')) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
                result.append(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
class Flag(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
        self.Uninitialised = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
        self.Modifiable    = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        self.Persistent    = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
class Setting(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
    def __init__(self,configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        self.name   = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        self.ref    = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        self.type   = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        self.id = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        self.flag = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        self.comment = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        self.configuration = configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
    def value(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        dview = self.configuration.get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        feature = dview.get_feature(self.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        value = feature.get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        if self.type in (HcrRecord.VALTYPE_ARRAY_INT32, HcrRecord.VALTYPE_ARRAY_UINT32):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
            # Convert string values to numbers
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
            value = map(lambda x: self.__str_to_long(x), value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        elif self.type == HcrRecord.VALTYPE_BIN_DATA and feature.get_type() == 'string':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
            value = self.__hex_to_bindata(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        return value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
    def __str_to_long(self, str_value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
            return long(str_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
            return long(str_value, 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
    def __hex_to_bindata(self, hexdata):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        orig_hexdata = hexdata
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        hexdata = hexdata.replace(' ', '').replace('\r', '').replace('\n', '').replace('\t', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        if len(hexdata) % 2 != 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
            raise ValueError("Failed to convert %r into binary data: String length %d (whitespace stripped) is not divisible by 2", orig_hexdata, len(hexdata))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        for c in hexdata:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
            if c not in "0123456789abcdefABCDEF":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
                raise ValueError("Failed to convert %r into binary data: Not a valid hex string", hexdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
        temp = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
        for i in xrange(len(hexdata) / 2):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
            start = i * 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
            end   = start + 2 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
            temp.append(chr(int(hexdata[start:end], 16)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        return ''.join(temp)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
class Category(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        self.name   = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        self.category_uid    = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
        self.settings = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
    def get_hcr_records(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        Return a list of HcrRecord objects created based on this category's settings.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        for setting in self.settings:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
            record = HcrRecord(setting.type, setting.value, self.category_uid, setting.id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
            flag = setting.flag
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
            if flag:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
                record.flags = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
                if flag.Uninitialised == '1':   record.flags |= HcrRecord.FLAG_UNINITIALIZED
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
                if flag.Modifiable == '1':      record.flags |= HcrRecord.FLAG_MODIFIABLE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
                if flag.Persistent == '1':      record.flags |= HcrRecord.FLAG_PERSISTENT
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
            result.append(record)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
        return result 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
class Output(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
        self.file = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        self.type = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        self.version = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
        self.read_only = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
        self.categories = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
    def get_hcr_records(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        Return a list of HcrRecord objects created based on this output object's categories.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        for category in self.categories:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
            result.extend(category.get_hcr_records())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
    def get_hcr_repository(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
        Return a HcrRepository object created based on this output.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
        The type of this Output object should be 'hcr', otherwise and an exception is raised.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        if self.type != 'hcr':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
            raise RuntimeError("get_hcr_repository() called on an Output object with type '%s' (should be 'hcr')" % self.type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
        return HcrRepository(self.get_hcr_records())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389