configurationengine/source/cone/public/api.py
author m2lahtel
Thu, 21 Oct 2010 16:36:53 +0300
changeset 5 d2c80f5cab53
parent 4 0951727b8815
permissions -rw-r--r--
Updated to version 1.2.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     1
from __future__ import with_statement
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
# Description: 
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
Cone public API.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
The core interface to the ConE functionality.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import sys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import logging
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    25
import mimetypes
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    26
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    27
from cone.public import exceptions, utils, container, mapping
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    28
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    29
def get_file_logger():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    30
    return logger
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
class Base(container.ObjectContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    The Base class is intended for capturing same kind of naming scheme.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        if len(utils.dottedref.split_ref(ref)) > 1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
            raise exceptions.InvalidRef("Invalid reference for Base object %s!" % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        container.ObjectContainer.__init__(self, ref)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    43
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    44
            for arg in kwargs.keys():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    45
                if kwargs.get(arg) != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    46
                    setattr(self, arg, kwargs.get(arg))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    47
        except AttributeError,e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    48
            raise e
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    49
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        dict = self._dict()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        return "%s(%s)" % (self.__class__.__name__, dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    54
#    def __reduce_ex__(self, protocol_version):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    55
#        tpl = super(Base, self).__reduce_ex__(protocol_version)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    56
#        return tpl
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    57
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    58
#    def __getstate__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    59
#        state = self._dict(internals=True, ignore_empty=True)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    60
#        # pop out the _name so that it wont appear as redundant data (ref is the same)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    61
#        state.pop('_name', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    62
#        state.pop('_parent', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    63
#        return state
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    64
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    65
#    def __setstate__(self, state):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    66
#        super(Base, self).__setstate__(state)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    67
#        self.ref = state.get('ref','')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    68
#        for arg in state.keys():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    69
#            self.__dict__.setdefault(arg, state.get(arg))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    70
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
    def _get_mapper(self,modelname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        Return a instance of appropriate mapper for given model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        return mapping.BaseMapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    def _compare(self, other, dict_keys=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        Compare the attributes of elements 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        if isinstance(other, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
            keys = dict_keys or self._dict().keys() 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
            for key in keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
                self_attr = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
                other_attr = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
                try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
                    self_attr = getattr(self, key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
                    other_attr = getattr(other, key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
                except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
                    # If the attribute is not found from either elements
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
                    # ignore it entirely
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
                    if self_attr == None and other_attr == None: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
                        continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
                if  self_attr != other_attr:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
                    return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
            # If all given keys match report this as as similar element
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    def _clone(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        A generic implementation for cloning the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        Copies all (public) members in dictionary.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        To clone objects recursively set the recursion level with recursion param.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        @param recursion: Boolean to define recursion on or off
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        @param recursion_depth: positive integer to define recursion depth. default is -1 which will 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        perform recursion to all objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        dict = self._dict()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        if kwargs.get('class_instance'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
            class_instance = kwargs.get('class_instance')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
            del kwargs['class_instance']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
            class_instance = self.__class__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        obj = class_instance(**dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        # Remove all children created at the construction phase 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        # This is needed when the recursion adds children to the object so that there are not duplicates
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        obj._order = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        obj._children = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        # handle the recursion argument
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        recursion = kwargs.get('recursion', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        if recursion:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
            recursion_depth = kwargs.get('recursion_depth', -1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
            if recursion_depth < 0 or recursion_depth > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
                # decrease the recursion
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
                kwargs['recursion_depth'] = recursion_depth - 1 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
                for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
                    obj._add(child._clone(**kwargs), container.APPEND)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   133
    def _dict(self, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        Return the public variables in a dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        dict = {}
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   138
        # loop through the items in this object internal __dict__
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   139
        # and add all except internal variables and function overrides  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   140
        for (key,value) in self.__dict__.items():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   141
            if not kwargs.get('internals', False) and key.startswith('_'):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
                continue
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   143
            elif not kwargs.get('callables', False) and callable(value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   144
                continue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   145
            elif kwargs.get('ignore_empty') and not value:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   146
                # ignore empty values
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   147
                pass
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
            else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   149
                dict[key] = value
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        return dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        return Base(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
    def fqr(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        Return a Fully Qualified Ref, which is the full name of the reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        Joins the namespace and ref to one string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
        @return: A string 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        return utils.dottedref.join_refs([self.namespace, self.get_ref()])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
    def namespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
        @return: The namespace of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        containerpath = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        path = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        parentcontainer = self.find_parent(container=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        parent = self.find_parent(type=Base)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        paths = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        while parent and parent != parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
            """ Skip the element if it is supposed to be hidden. Begins with _. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
            if not parent.get_ref().startswith('_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
                paths.append(parent.get_ref())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
            parent = parent._get_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        if parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
            paths.append(parentcontainer.namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
        paths.reverse()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
        return utils.dottedref.join_refs(paths)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   184
    def path(self, toparent=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   185
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   186
        Get the path to this Base object..
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   187
        @param toparent: the _parent object up to which the path is relative. Default value is None.,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   188
        which gives the fully qualified path in the topology.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   189
        @return: The path to this Base object from toparent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   190
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   191
        return self._path(toparent)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   192
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   193
    def parent_path(self, toparent=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   194
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   195
        Get the path to the parent of this Base object..
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   196
        @param toparent: the _parent object up to which the path is relative. Default value is None.,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   197
        which gives the fully qualified path in the topology.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   198
        @return: The path to this Base object from toparent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   199
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   200
        if self._parent != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   201
            return self._parent.path(toparent)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   202
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   203
            return ''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   204
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
    def get_fullref(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        Return a full reference, reference including a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
        possible index of the object in list. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
        e.g. ref can be bar[1] or just the normal bar. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        @return: The full reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        if self.parent and utils.is_list(self.parent._get(self.ref)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
            return "%s[%s]" % (self.ref, self.get_index())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
            return self.ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
    def get_fullfqr(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
        Return a full reference, reference including a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
        possible index of the object in list. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        ref and adds index.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
        @return: A string 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
        return utils.dottedref.join_refs([self.get_fullnamespace(), self.get_fullref()])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
    def get_fullnamespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        @return: The full namespace of the object with possible indexes of the parent objects
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        containerpath = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        path = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        parentcontainer = self.find_parent(container=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        parent = self.find_parent(type=Base)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        paths = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        while parent and parent != parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
            paths.append(parent.get_fullref())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
            parent = parent.parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        if parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
            paths.append(parentcontainer.namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
        paths.reverse()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        return utils.dottedref.join_refs(paths)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
    def get_storage(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        Get the root storage from the root object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
        if self._find_parent():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
            return self._find_parent().get_storage()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
            raise exceptions.StorageException("Storage is not found from root!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
    def get_project(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        Get the root project from the root object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        if isinstance(self, Project):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
                return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        elif self._find_parent():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
            return self._find_parent().get_project()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
            raise exceptions.NotFound("Project not found!!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
    def get_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        Get the default view from the root object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
            return self._find_parent().get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
            raise exceptions.NotFound("Default View is not found! No root configuration?")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
    def get_root(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
        Get the root object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
            return self._find_parent().get_root()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
            return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
    def get_root_configuration(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
        Get the root object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
        if self.find_parent(type=Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
            return self.find_parent(type=Configuration).get_root_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
        elif isinstance(self, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
            return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   293
    def get_configuration(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   294
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   295
        Return the containing configuration of this object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   296
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   297
        parent = self._find_parent_or_default(type=Configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   298
        return parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   299
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   300
    def get_configuration_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   301
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   302
        Return the path of containing configuration of this object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   303
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   304
        parent = self._find_parent_or_default(type=Configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   305
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   306
            return parent.get_full_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   307
        except AttributeError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   308
            return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   309
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
    def get_index(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        @return : the index of the data element for sequential data defined inside the same configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        0 for normal data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        # Get the list of items from parent which contains this element and ask my own index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
        # Make sure that the returned element is a list with get_list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        selflist = utils.get_list(self._get_parent()._get(self.get_ref()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        return selflist.index(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
    def find_parent(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
        find the closest parent object of given type.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        e.g. find_parent(type=Configuration) returns the closest parent 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        Configuration parent instance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        @param type: class definitiob
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        type = kwargs.get('type', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        container = kwargs.get('container', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
            parent = self._find_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
            if type and isinstance(parent, type):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
                    return parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
            elif container and hasattr(parent, 'container'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
                    return parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
                return parent.find_parent(**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        A generic add function to add child objects. The function is intended to act as
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        raise exceptions.NotSupportedException("Cannot add %s object to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
    def get_elem(self, fqr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
        A generic get function to get child objects and members. The function uses getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        to traverse downwards the the object tree. The returned object is the final object or attribute 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
        if it is found. Raises AttributeError if the child is not found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        Example: obj.get('test.bar'), returns child obj.test.bar
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
        @param fqr: the fully qualified ref to the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
        @raise AttributeError: if the given ref is not found.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   363
    def get_store_interface(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   364
        # if the project cannot be retrieved return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   365
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   366
            return self.get_project()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   367
        except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   368
            return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   369
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   370
    def get_id(self): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   371
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   372
            return self._id
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   373
        except AttributeError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   374
            return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   375
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   376
    def set_id(self,value): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   377
        self._id = value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   378
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   379
    def del_id(self): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   380
        delattr(self,'_id')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   381
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   382
    """ The id as a property """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   383
    id = property(get_id,set_id, del_id)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
class Project(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
    A project is a container that can hold several Configuration objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
    def __init__(self, storage, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
        Project constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
        Base.__init__(self, "")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
        """ Try to set the model and tet the actual configuration class """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
            self._model = storage.persistentmodule.MODEL
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
            self._model = None
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   400
        self.loaded = {}
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
        self.set_storage(storage)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
        self.update()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   403
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   404
    def __getstate__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   405
        state = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   406
        state['storage'] = self.storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   407
        return state
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   408
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   409
    def __setstate__(self, state):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   410
        self.__init__(state['storage'])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
    def __add_loaded__(self, ref, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
        Add the object to loaded 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
        self.loaded[ref] = {'counter': 0, 'obj': obj}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
    def __get_loaded__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
        Get a loaded object if it is existing and increase the reference counter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
        @return: The loaded object if it exists. None if it does not. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
        if self.loaded.has_key(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
            return self.loaded[ref]['obj']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
    def __loaded__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
        Get a loaded object if it is existing and increase the reference counter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
        @return: The loaded object if it exists. None if it does not. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
        if self.loaded.has_key(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
            self.loaded[ref]['counter'] += 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
            raise exceptions.NotFound("ref %s is not found from loaded!" % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
    def __unloaded__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
        returns True when the reference count is zero and object can be released.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
        if self.loaded.has_key(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
            self.loaded[ref]['counter'] -= 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
            if self.loaded[ref]['counter'] == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
                del self.loaded[ref]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
                return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
            else: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
                return False
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   451
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   452
            # Return False in case the object is loaded at all in this project 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   453
            # increases performance as unloading is not done on unchanged objects
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   454
            return False
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
        if isinstance(obj, Configuration) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
        or isinstance(obj, ConfigurationProxy): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
    def update(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        update the root confml files as configurations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
        root_confmls = self.get_storage().list_resources(".")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
        root_confmls = utils.resourceref.filter_resources(root_confmls, "\.confml")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
        for rootml in root_confmls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
            self._add(ConfigurationProxy(rootml))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
    def get_storage(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
        Get the Storage instance of this Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
        return self.storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
    def set_storage(self, storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
        Set the Storage instance of this Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   483
        if storage != None and not isinstance(storage, Storage):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
            raise exceptions.StorageException("The given storage is not a instance of Storage!")
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   485
        self.storage = storage
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
    def list_configurations(self, filter_or_filters=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
        List the direct child objects of the project (Root configurations)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
        @param filter_or_filters: A regular expression or list of regular expressions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
            used for filtering the configuration paths. If None, all configurations are
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
            returned.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        @return: a list for configuration file paths
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
        filters = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
        if isinstance(filter_or_filters, basestring):   filters = [filter_or_filters]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
        elif filter_or_filters is not None:             filters = filter_or_filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
        configs = [obj.get_path() for obj in self._objects()]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
        if filters is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
            result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
            for config in configs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
                for filter in filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
                    if re.match(filter, config) is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
                        result.append(config)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
                        break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
            return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
            return configs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
    def list_all_configurations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
        List all configuration objects of the project (all configurations)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
        @return: a list for configuration file paths
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   517
        # TODO
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   518
        # huge performance problem 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   519
        return [obj.get_full_path() for obj in self._traverse(type=(Configuration, ConfigurationProxy))]
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
    def get_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
        Get a configuration object from the given path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
        @param path: path to configuration 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
        @return: a instance of Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
        # Load the configuration object if it is not already loaded
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
            return self._get(utils.resourceref.to_objref(utils.resourceref.norm(path)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
            if self.storage.is_resource(utils.resourceref.norm(path)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
                proxy = ConfigurationProxy(utils.resourceref.norm(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
                proxy._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
                return proxy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
                raise e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
    def is_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
        Return true if the given path is a configuration object in this Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
        @param path: path to configuration 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
        @return: Boolean return value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
        # Changed from list_all_configurations to list_configurations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
        # (list_all_configurations causes a insane performance problem with _traverse)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   546
        #
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   547
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   548
            return self.storage.is_resource(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   549
        except exceptions.NotSupportedException:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   550
            return path in self.list_configurations()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   551
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   552
    def add_configuration(self, config, overwrite_existing=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
        Add a Configuration object to this project
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   555
        @param config: The configuration object to add
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   556
        @param overwrite_existing: When this is set true any existing configuration is 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   557
        overwritten. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   558
        """ 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
        if isinstance(config, Configuration):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   560
            if not overwrite_existing and self.is_configuration(config.get_path()):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
                raise exceptions.AlreadyExists("%s" % config.get_path())
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   562
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   563
            proxy = ConfigurationProxy(config.path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   564
            proxy._set_obj(config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   565
            self._add(proxy)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   566
            #self._add(config)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
            self.__add_loaded__(config.get_path(), config)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
            self.__loaded__(config.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
            raise exceptions.IncorrectClassError("Only Configuration instance can be added to Project!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   572
    def create_configuration(self, path, overwrite_existing=False, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
        Create a Configuration object to this project
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   575
        @param path: The path of the new configuration file
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   576
        @param overwrite_existing: When this is set true any existing configuration is 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   577
        overwritten. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   578
        @param **kwargs: normal keyword arguments that are passed on to the newly 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   579
        created Configuration object. See Configuration object constructor description on what
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   580
        you can pass on here.  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   581
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   582
        config = self.get_configuration_class()(utils.resourceref.norm(path), **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   583
        self.add_configuration(config, overwrite_existing)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
        return config
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
    def remove_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
        Remove a Configuration by its reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
        # remove configuration as an object and try to remove it from the storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
        self._remove(utils.resourceref.to_objref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
            self.storage.delete_resource(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
        except exceptions.NotSupportedException:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
            pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
    def import_configuration(self, configuration):  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        Import a configuration object from another storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
        self.storage.import_resources(configuration.list_resources(), configuration.get_storage())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   605
    def export_configuration(self, configuration, export_storage, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
        Export a configuration object to another storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
        # First clone the configuration and then import the rest of the configuration resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
        if isinstance(configuration, ConfigurationProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
            configuration = configuration._get_obj()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
        export_storage.unload(configuration.get_full_path(),configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
        for child in configuration._traverse(type=Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
            export_storage.unload(child.get_full_path(),child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
        
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   617
        ruleml_eval_globals_files = []
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   618
        for child in configuration._traverse(type=RulemlEvalGlobals):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   619
            if child.file != None:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   620
                ruleml_eval_globals_files.append(RulemlEvalGlobals.get_script_file_full_path(child))
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   621
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
        #If the configuration is not in the root of the project adding the path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
        #to final exporting source path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
        #l = []
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   625
        empty_folders = kwargs.get('empty_folders',False)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   626
        layer = configuration.get_layer()
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   627
        all_resources = []
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   628
        layer_content = layer.list_content(empty_folders)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   629
        layer_doc = layer.list_doc(empty_folders)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   630
        layer_implml = layer.list_implml(empty_folders)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   631
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   632
        include_filters = kwargs.get('include_filters',{})
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   633
        exclude_filters = kwargs.get('exclude_filters',{})
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   634
        
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   635
        include_content_filter = include_filters.get('content')
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   636
        exclude_content_filter = exclude_filters.get('content')
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   637
        
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   638
        # perform filtering of content files
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   639
        if exclude_content_filter:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   640
            f = lambda x: not re.search(exclude_content_filter, x, re.IGNORECASE)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   641
            layer_content = filter(f,layer_content)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   642
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   643
        if include_content_filter:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   644
            f = lambda x: re.search(include_content_filter, x, re.IGNORECASE)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   645
            layer_content = filter(f,layer_content)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   646
        
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   647
        all_resources.extend(layer_content) 
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   648
        all_resources.extend(layer_doc)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   649
        all_resources.extend(layer_implml)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   650
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
        cpath = utils.resourceref.get_path(configuration.get_path()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
        resr = [utils.resourceref.join_refs([cpath,related]) \
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   653
                for related in all_resources]
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   654
        resr.extend(ruleml_eval_globals_files)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   655
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   656
        self.storage.export_resources(resr ,export_storage, kwargs.get("empty_folders", False))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   657
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   658
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
    def get_configuration_class(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
        return the default configuration class that is used with the model. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
        return utils.get_class(self._model, Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
    def save(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
        Save the object to the permanent Storage object. Calls the save operation for 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
        all the children and also for the Storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   670
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   671
            if isinstance(child, (Configuration, ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   672
                child.save()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   673
        self.storage.save()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   674
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   675
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   676
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   677
        Close the Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   678
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   679
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   680
            if isinstance(child, (Configuration, ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   681
                child.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   682
        self.storage.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   683
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   684
    def load(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   685
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   686
        Load an object from a reference. The given reference is loaded once from storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   687
        and stored as a loaded object to the Project. Sequential loads to the same ref will
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   688
        return the same object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   689
        @param path: The reference where to load the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   690
        @raise StorageException: if the given object cannot be loaded as an 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   691
        object from this storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   692
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   693
        if not self.__get_loaded__(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   694
            configuration = self.get_storage().load(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   695
            if configuration.get_ref() == 'unknown':
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   696
                configuration.set_ref(utils.resourceref.to_dref(path))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   697
            self.__add_loaded__(path, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   698
        """ increase the ref counter """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   699
        self.__loaded__(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   700
        return self.__get_loaded__(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   701
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   702
    def unload(self, path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   703
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   704
        Release the given ref, which decreases the reference counter of the given ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   705
        @param path: The reference where to store the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   706
        @param object: The object instance to dump 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   707
        @raise StorageException: if the given object cannot be dumped to this storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   708
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   709
        if self.__unloaded__(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   710
            self.get_storage().unload(path, object)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   711
            # remove the configuration from this this project, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   712
            # with proxy set the _obj reference to None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   713
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   714
                conf =  self.get_configuration(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   715
                if isinstance(conf, ConfigurationProxy):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   716
                    conf._set_obj(None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   717
            except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   718
                # if the configuration is not found at all then ignore the resetting
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   719
                pass
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   720
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   721
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   722
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   723
        Return the path of the project, which is always root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   724
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   725
        return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   726
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   727
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   728
class CompositeConfiguration(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   729
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   730
    A base class for composite Configuration objects.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   731
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   732
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   733
#        self.meta       = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   734
#        self.desc       = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   735
        super(CompositeConfiguration, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   736
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   737
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   738
    def _configuration_class(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   739
        return Configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   740
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   741
    def add_configuration(self, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   742
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   743
        Add an existing Configuration to this configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   744
        @param config: A Configuration instance:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   745
        @return: None 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   746
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   747
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   748
        Merge the default view features from added config to this configs _default_view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   749
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   750
        # if the Configuration has a separate resource path, add it automatically behind proxy 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   751
        if utils.resourceref.is_path(config.path) and isinstance(config, Configuration):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   752
            proxy = ConfigurationProxy(config.path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   753
            proxy._set_obj(config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   754
            self._add(proxy)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   755
            # Add the new configuration to the list of "modified/loaded" configurations
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   756
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   757
                prj = self.get_project()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   758
                prj.__add_loaded__(config.get_full_path(), config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   759
                prj.__loaded__(config.get_full_path())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   760
            except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   761
                # if the parent is not found this configuration is not (yet) a part of project and cant be stored 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   762
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   763
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   764
            self._add(config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   765
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   766
    def include_configuration(self, configref, policy=0):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   767
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   768
        Add an existing Configuration to this configuration by its resource reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   769
        @param config: A Configuration instance:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   770
        @return: None 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   771
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   772
        # add the configuration load proxy to this configuration instead 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   773
        # adding the configuration directly
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   774
        self._add(ConfigurationProxy(configref), policy)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   775
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   776
    def create_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   777
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   778
        Create a new configuration by its name to the Configuration. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   779
        1. Create new Configuration object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   780
        2. Create new ConfigurationProxy 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   781
        3. Add proxy to this object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   782
        4. Set proxy to point to the created Configuration object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   783
        @param path: The reference of the configuration to create
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   784
        @return: The new configuration object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   785
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   786
        # normalise the path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   787
        normpath = utils.resourceref.norm(path)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   788
        cklass = self._configuration_class()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   789
        conf = cklass(normpath, namespace=self.namespace)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   790
        self.add_configuration(conf)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   791
        return conf
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   792
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   793
    def remove_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   794
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   795
        Remove a Layer object from the Configuration by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   796
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   797
        self._remove(utils.resourceref.to_objref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   798
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   799
    def list_configurations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   800
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   801
        List all Layer objects in the Configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   802
        @return: a copy array of layer references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   803
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   804
        return [config.get_path() for config in self._objects(type=(Configuration, ConfigurationProxy))] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   805
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   806
    def list_all_configurations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   807
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   808
        List all Layer objects in the Configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   809
        @return: a copy array of layer references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   810
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   811
        return [config.get_path_for_parent(self) for config in self._traverse(type=(Configuration, ConfigurationProxy))] 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   812
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   813
    def get_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   814
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   815
        Get a Layer object by if path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   816
        @return: a Layer object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   817
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   818
        return self._get(utils.resourceref.to_objref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   819
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   820
    def get_configuration_by_index(self, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   821
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   822
        Get a Layer object by if indexing number
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   823
        @return: a Layer object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   824
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   825
        configs = self._objects(type=(Configuration, ConfigurationProxy))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   826
        return configs[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   827
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   828
    def get_last_configuration(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   829
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   830
        Get the last Layer object from this configuration hierarchy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   831
        @return: a Layer object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   832
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   833
        last_config = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   834
        try: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   835
            last_config = last_config.get_configuration_by_index(-1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   836
            return last_config.get_last_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   837
        except IndexError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   838
            return self 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   839
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   840
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   841
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   842
        A generic add function to add child objects. The function is intended to act as
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   843
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   844
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   845
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   846
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   847
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   848
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   849
        if isinstance(child, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   850
            self.add_configuration(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   851
        elif isinstance(child, ConfigurationProxy):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   852
            self._add(child)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   853
        elif isinstance(child, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   854
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   855
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   856
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   857
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   858
    def layered_resources(self, layers=None, empty_folders=False, folder=None, resource_type=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   859
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   860
        Fetch resource paths by layers so that if a resource with the same name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   861
        exists on multiple layers, the one on the latest layer is the active one.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   862
        @param layers: List of layer indices to specify the layer to use, None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   863
            for all layers.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   864
        @param empty_folders: If True, empty folders are returned also.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   865
        @param folder: Name of a specific folder from which to get resources, or None.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   866
            If None, resource_type must be specified.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   867
        @param resource_type: Type of the resources to find. Must be one of
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   868
            ('confml', 'implml', 'content', 'doc') or None.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   869
            If None, folder must be specified.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   870
        @return: A container.DataContainer instance containing the resource paths.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   871
            For example: {'foo.txt': ['layer1/content/foo.txt',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   872
                                      'layer2/content/foo.txt'],
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   873
                          'bar.txt': ['layer1/content/bar.txt']}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   874
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   875
        MAPPING = {'confml':    lambda layer: layer.confml_folder(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   876
                   'implml':    lambda layer: layer.implml_folder(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   877
                   'content':   lambda layer: layer.content_folder(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   878
                   'doc':       lambda layer: layer.doc_folder()}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   879
        if resource_type is not None and resource_type not in MAPPING:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   880
            raise ValueError("Invalid resource type %r, should be one of %r" % (resource_type, MAPPING.keys()))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   881
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   882
        if folder and resource_type:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   883
            raise ValueError('Only one of folder and resource_type must be specified!')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   884
        if not folder and not resource_type:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   885
            raise ValueError('Either folder or resource_type must be specified!')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   886
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   887
        configuration_array = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   888
        if layers == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   889
            configuration_array = self.list_configurations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   890
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   891
            all = self.list_configurations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   892
            for i in layers:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   893
                configuration_array.append(all[i])
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   894
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   895
        # Add the current configuration as the last one in the list, in case
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   896
        # the current configuration happens to be a layer root itself
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   897
        configuration_array.append('')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   898
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   899
        # Set up the get_folder function based on the parameters
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   900
        if resource_type:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   901
            get_folder = MAPPING[resource_type]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   902
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   903
            def get_folder(layer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   904
                cpath = layer.get_current_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   905
                return Folder(layer.storage, utils.resourceref.join_refs([cpath, folder]))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   906
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   907
        result = container.DataContainer()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   908
        for configuration_path in configuration_array:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   909
            folder_obj = get_folder(self.get_configuration(configuration_path).get_layer())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   910
            folder_path = folder_obj.get_current_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   911
            for res_path in folder_obj.list_resources("", recurse=True, empty_folders=empty_folders):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   912
                if res_path == '': continue # ZipStorage sometimes returns empty paths
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   913
                res_fullpath = utils.resourceref.join_refs([folder_path, res_path])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   914
                result.add_value(res_path, res_fullpath)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   915
        return result
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   916
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   917
    def layered_confml(self, layers=None, empty_folders=False):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   918
        return self.layered_resources(layers, empty_folders, resource_type='confml')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   919
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   920
    def layered_implml(self, layers=None, empty_folders=False):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   921
        return self.layered_resources(layers, empty_folders, resource_type='implml')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   922
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   923
    def layered_content(self, layers=None, empty_folders=False):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   924
        return self.layered_resources(layers, empty_folders, resource_type='content')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   925
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   926
    def layered_doc(self, layers=None, empty_folders=False):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   927
        return self.layered_resources(layers, empty_folders, resource_type='doc')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   928
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   929
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   930
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   931
class Configuration(CompositeConfiguration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   932
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   933
    A Configuration is a container that can hold several Layer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   934
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   935
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   936
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   937
        self.path = kwargs.get('path') or ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   938
        self.namespace = kwargs.get('namespace', '')
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   939
        self.name = kwargs.get('name',utils.resourceref.to_objref(self.path))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   940
        self.version = kwargs.get('version')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   941
        super(Configuration, self).__init__(utils.resourceref.to_objref(self.path), **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   942
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   943
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   944
    def __getstate__(self):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   945
        state = self.__dict__.copy()
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   946
        if state.has_key('_children'):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   947
            childs = state.get('_children')
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   948
            if childs.has_key('?default_view'):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   949
                childs.pop('?default_view')
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   950
                state['_children'] = childs
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   951
        return state
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
   952
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   953
    def _default_object(self, name):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   954
        return self._default_class()(name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   955
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   956
    def _default_class(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   957
        return self._feature_class()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   958
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   959
    def _feature_class(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   960
        return Feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   961
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   962
    def _view_class(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   963
        return View
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   964
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   965
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   966
        if isinstance(obj, Configuration) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   967
        or isinstance(obj, Feature) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   968
        or isinstance(obj, Data) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   969
        or isinstance(obj, ConfigurationProxy) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   970
        or isinstance(obj, View) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   971
        or isinstance(obj, Base): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   972
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   973
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   974
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   975
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   976
    def _dict(self, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   977
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   978
        Return the public variables in a dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   979
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   980
        dict = super(Configuration, self)._dict(**kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   981
        dict['namespace'] = self.namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   982
        return dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   983
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   984
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   985
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   986
        Return the name of the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   987
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   988
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   989
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   990
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   991
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   992
        Set the name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   993
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   994
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   995
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   996
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   997
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   998
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   999
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1000
        return self.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1001
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1002
    def set_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1003
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1004
        Set the path of the configuration resource, and update the name and ref to correspond
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1005
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1006
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1007
        self.set_ref(utils.resourceref.to_objref(self.path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1008
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1009
    def get_full_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1010
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1011
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1012
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1013
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1014
            parentconfig = self._find_parent(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1015
            parent_path = utils.resourceref.get_path(parentconfig.get_path()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1016
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1017
            parent_path = ""
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1018
        return utils.resourceref.join_refs([parent_path, self.path])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1019
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1020
    def get_path_for_parent(self, parent):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1021
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1022
        Return the path to this configuration for a defined parent Configuration object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1023
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1024
        parent_path = ""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1025
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1026
            parentconfig = self._find_parent(type=Configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1027
            if parent != parentconfig:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1028
                parent_path = utils.resourceref.get_path(parentconfig.get_path_for_parent(parent)) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1029
        except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1030
            pass
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1031
        return utils.resourceref.join_refs([parent_path, self.path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1032
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1033
    def get_layer(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1034
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1035
        Get the layer object where this Configuration is located. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1036
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1037
        if not hasattr(self, "layer"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1038
            layerpath = utils.resourceref.get_path(self.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1039
            # hardcoded removal of confml folder from the layer path it is there
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1040
            layerpath = utils.resourceref.remove_end(layerpath, '/confml')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1041
            self.layer = Layer(self.get_storage(), layerpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1042
            """ Add the sublayers to this layer if they are different from this configuration """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1043
            for configpath in self.list_configurations():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1044
                sublayer_path = utils.resourceref.get_path(self.get_configuration(configpath).get_full_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1045
                sublayer_path = utils.resourceref.remove_end(sublayer_path, '/confml')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1046
                if sublayer_path != utils.resourceref.get_path(self.get_path()):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1047
                    self.layer.add_layer(self.get_configuration(configpath).get_layer())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1048
        return self.layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1049
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1050
    def set_namespace(self, namespace):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1051
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1052
        @param namespace: The new namespace of the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1053
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1054
        self._namespace =  namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1055
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1056
    def get_namespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1057
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1058
        @return: The reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1059
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1060
        return self._namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1061
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1062
    def del_namespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1063
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1064
        @return: The reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1065
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1066
        self._namespace = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1067
    namespace = property(get_namespace, set_namespace, del_namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1068
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1069
    def list_resources(self, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1070
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1071
        List all resources used in this configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1072
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1073
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1074
        1. First ensure that all configuration resource files are added 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1075
        2. Then add all layer resources 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1076
        3. Make the list distinct
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1077
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1078
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1079
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1080
        resources = [self.get_full_path()]
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1081
        for config in self._traverse(type=(Configuration,ConfigurationProxy)):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1082
            resources.append(config.get_full_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1083
        layer = self.get_layer()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1084
        for resref in layer.list_all_resources():
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1085
            resources.append(utils.resourceref.join_refs([layer.get_current_path(), resref]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1086
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1087
        return utils.distinct_array(resources)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1088
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1089
    def get_resource(self, ref, mode="r"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1090
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1091
        Get the given resource as a Resource object. The resource is searched relative to the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1092
        Configuration path, e.g. Configuration('test/foo/root.confml') => searches from 'test/foo'.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1093
        @param ref: the reference path to the requested resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1094
        @return: a instance of Resource. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1095
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1096
        mypath = utils.resourceref.get_path(self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1097
        myref = utils.resourceref.join_refs([mypath, ref])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1098
        return self.get_storage().open_resource(myref, mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1099
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1100
    def get_all_resources(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1101
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1102
        Get all resources in resource list of Resource objects
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1103
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1104
        resources = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1105
        res_list = self.list_resources()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1106
        for res in res_list:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1107
            resources.append(self.get_storage().open_resource(res))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1108
        return resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1109
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1110
    def get_root_resource(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1111
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1112
        Get the configuration reference resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1113
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1114
        return self.get_storage().open_resource(self.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1115
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1116
    def get_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1117
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1118
        Get a feature object by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1119
        @param ref: The reference to the feature object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1120
        @return: A Feature object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1121
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1122
        return self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1123
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1124
    def create_feature(self, ref, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1125
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1126
        Create a feature object to the configuration.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1127
        @param ref: The ref for the Feature object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1128
        @param **kwargs: keyword arguments  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1129
        e.g. to add fea2 under fea1 add_feature(fea2, 'fea1')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1130
        @return: the new feature object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1131
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1132
        fea = self._feature_class()(ref, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1133
        self._add(fea)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1134
        return fea
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1135
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1136
    def add_feature(self, feature, namespace=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1137
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1138
        Add a feature object to the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1139
        @param feature: The Feature object to add.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1140
        @param namespace: The sub namespace for the feature. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1141
        e.g. to add fea2 under fea1 add_feature(fea2, 'fea1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1142
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1143
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1144
        if namespace and self._has(namespace):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1145
            # Add the feature directly with an existing feature's add_feature functionality
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1146
            self.get_feature(namespace).add_feature(feature)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1147
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1148
            self._add_to_path(namespace, feature)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1149
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1150
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1151
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1152
        remove feature by its reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1153
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1154
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1155
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1156
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1157
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1158
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1159
        List immediate features found under the this configuration (the top nodes). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1160
        The features are also available via the _default_view of the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1161
        @return: a list of feature references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1162
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1163
        return [fea.get_ref() for fea in self._objects(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1164
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1165
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1166
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1167
        List all features found under the this configuration. The features are also 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1168
        available via the _default_view of the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1169
        @return: a list of feature references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1170
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1171
        return [fea.fqr for fea in self._traverse(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1172
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1173
    def add_data(self, data, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1174
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1175
        Add a data object to this configuration object.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1176
        @param data: The Data object or list of Data objects to add.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1177
        @return: None
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1178
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1179
        data_objs = utils.get_list(data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1180
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1181
        if policy == container.PREPEND:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1182
            data_objs = reversed(data_objs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1183
            policy_first = container.PREPEND
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1184
            policy_rest = container.PREPEND
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1185
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1186
            policy_first = policy
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1187
            policy_rest = container.APPEND
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1188
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1189
        for i, data_obj in enumerate(data_objs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1190
            if not self._has(data_obj.attr):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1191
                self._add(DataContainer(data_obj.attr, container=True))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1192
            (namespace, name) = utils.dottedref.psplit_ref(data_obj.get_fearef())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1193
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1194
            if i == 0:  p = policy_first
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1195
            else:       p = policy_rest
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1196
            self._get(data_obj.attr)._add_to_path(namespace, data_obj, p)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1197
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1198
    def get_data(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1199
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1200
        Get a data object by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1201
        @param ref: The reference to the data object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1202
        @return: A Data object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1203
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1204
        return self.data._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1205
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1206
    def remove_data(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1207
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1208
        remove feature by its reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1209
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1210
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1211
        self.data._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1212
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1213
    def list_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1214
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1215
        List all datas found under the this configuration. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1216
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1217
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1218
        if self._has('data'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1219
            return [dataelem.fqr for dataelem in self.data._objects(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1220
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1221
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1222
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1223
    def get_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1224
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1225
        List immediate datas found under the this configuration (the top nodes). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1226
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1227
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1228
        if self._has('data'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1229
            return [dataelem for dataelem in self.data._objects(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1230
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1231
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1232
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1233
    def list_all_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1234
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1235
        List all Data elements found under the this configuration (or subconfigurations). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1236
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1237
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1238
        return [dataelem.fqr for dataelem in self._traverse(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1239
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1240
    def get_all_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1241
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1242
        List all Data elements found under the this configuration (or subconfigurations). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1243
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1244
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1245
        return [dataelem for dataelem in self._traverse(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1246
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1247
    def list_leaf_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1248
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1249
        List all leaf Data elements (i.e. actually modified settings) found under this configuration (or subconfigurations). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1250
        @return: A list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1251
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1252
        return [dataelem.fqr for dataelem in self._find_leaves(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1253
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1254
    def get_leaf_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1255
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1256
        Get all leaf Data elements (i.e. actually modified settings) found under this configuration (or subconfigurations). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1257
        @return: A list of Data objects. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1258
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1259
        return [dataelem for dataelem in self._find_leaves(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1260
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1261
    def get_view(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1262
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1263
        Get a view object by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1264
        @param ref: The reference to the view object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1265
        @return: A View object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1266
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1267
        # Populate the view object before returning it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1268
        view = self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1269
        view.populate()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1270
        return view
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1271
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1272
    def create_view(self, viewname):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1273
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1274
        Create a view object to the configuration.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1275
        @param viewname: The name of the view to add. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1276
        @return: view object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1277
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1278
        viewobj = self._view_class()(viewname)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1279
        self.add_view(viewobj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1280
        return viewobj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1281
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1282
    def add_view(self, viewobj):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1283
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1284
        Add a view object to the configuration.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1285
        @param viewobj: The existing view object to add. 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1286
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1287
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1288
        assert(isinstance(viewobj, View))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1289
        return self._add(viewobj)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1290
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1291
    def remove_view(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1292
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1293
        Remove a view object from the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1294
        @param ref: The reference to the View. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1295
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1296
        @raise NotFound: when view is not found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1297
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1298
        return self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1299
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1300
    def list_views(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1301
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1302
        List all views found under the this configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1303
        @return: a list of view references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1304
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1305
        return [view._path(self) for view in self._traverse(type=View)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1306
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1307
    def save(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1308
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1309
        Save the object to the permanent Storage object. Calls the save operation of 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1310
        all the children.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1311
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1312
        # Change the recursion order so that the current object 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1313
        # is saved first and then its childen.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1314
        # This increases performance in cases where this object requires information about its childen (no unload -> load cases)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1315
        self.get_project().unload(self.get_full_path(), self)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1316
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1317
            if isinstance(child, (Configuration,ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1318
                child.save()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1319
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1320
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1321
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1322
        Close the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1323
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1324
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1325
            if isinstance(child, (Configuration, ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1326
                child.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1327
#        if self.get_full_path() != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1328
#            self.get_project().unload(self.get_full_path(), self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1329
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1330
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1331
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1332
        A generic add function to add child objects. The function is intended to act as
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1333
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1334
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1335
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1336
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1337
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1338
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1339
        if isinstance(child, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1340
            self.add_feature(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1341
        elif isinstance(child, View):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1342
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1343
        elif isinstance(child, (Data)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1344
            self.add_data(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1345
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1346
            super(Configuration, self).add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1347
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1348
    def get_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1349
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1350
        Get the default view from this configuration hierarchy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1351
        This returns always the view from the Root configuration point of view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1352
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1353
        try:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1354
            parent = self._find_parent_or_default()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1355
            if parent and isinstance(parent, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1356
                return parent.get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1357
            else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1358
                if not self._has('?default_view'):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1359
                    self._create_default_view()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1360
                return self._get('?default_view')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1361
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1362
            raise e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1363
        # raise exceptions.NotFound("Default View is not found! No root configuration?")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1364
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1365
    def recreate_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1366
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1367
            parent = self._find_parent_or_default() 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1368
            if parent and isinstance(parent, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1369
                parent.recreate_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1370
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1371
                self._create_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1372
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1373
            raise e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1374
        # raise exceptions.NotFound("Default View is not found! No root configuration?")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1375
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1376
    def _create_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1377
        # Rebuild the default view for this Configuration
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1378
        default_view = View("?default_view", data=True)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1379
        #self._default_view._parent= self
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1380
        self._add(default_view)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1381
        # First add all features of the configuration to the view. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1382
        # Then add all data elements under the features
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1383
        for child in self._traverse(type=Feature):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1384
            # TODO print "Adding : %s -> %s" % (child.namespace, child)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1385
            default_view.add_feature(child, child.namespace)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1386
        for child in self._traverse(type=Data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1387
            #parent_config = child._find_parent_or_default(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1388
            #print "Adding data %s: fqr: %s from file %s." % (child.get_value(), child.fqr, parent_config.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1389
            try:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1390
                fea = default_view.get_feature(child.fqr)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1391
                fea.add_data(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1392
            except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1393
                data_parent_config = child._find_parent_or_default(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1394
                logging.getLogger('cone').info("Warning: Feature '%s' for data in %s not found." % (child.fqr, data_parent_config.get_path()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1395
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1396
class ConfigurationProxy(container.LoadProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1397
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1398
    Configuration loading proxy. Loads the configuration from the given reference, when needed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1399
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1400
    def __init__(self, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1401
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1402
        The ConfigurationProxy that represents a configuration that is included in another configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1403
        @param ref: the reference to the storage resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1404
        The ConfigurationProxy trust to get the store_interface from the parent object with get_storage() function.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1405
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1406
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1407
        super(ConfigurationProxy,self).__init__(path, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1408
        self.set('_name', utils.resourceref.to_objref(path))
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1409
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1410
    def _clone(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1411
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1412
        A ConfigurationProxy specific implementation for cloning.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1413
        Copies all (public) members in dictionary.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1414
        To clone call the actual object that is proxied as well if the reqursion is on.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1415
        @param recursion: Boolean to define recursion on or off
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1416
        @param recursion_depth: positive integer to define recursion depth. default is -1 which will 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1417
        perform recursion to all objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1418
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1419
        dict = self._dict()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1420
        obj = self.__class__(**dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1421
        # handle the recursion argument
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1422
        recursion = kwargs.get('recursion', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1423
        if recursion:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1424
            recursion_depth = kwargs.get('recursion_depth', -1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1425
            if recursion_depth < 0 or recursion_depth > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1426
                # decrease the recursion
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1427
                kwargs['recursion_depth'] = recursion_depth - 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1428
                newobj = self._get_obj()._clone(**kwargs) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1429
                obj._set_obj(newobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1430
        return obj
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1431
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1432
    def _dict(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1433
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1434
        Return the public variables in a dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1435
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1436
        dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1437
        for key in self.__dict__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1438
            if key.startswith('_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1439
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1440
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1441
                dict[key] = self.__dict__[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1442
        return dict
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1443
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1444
    def _get_mapper(self,modelname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1445
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1446
        Return a instance of appropriate mapper for given model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1447
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1448
        return mapping.BaseMapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1449
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1450
class Group(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1451
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1452
    A Group class. Group is used in View to group up other Group/Feature objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1453
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1454
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1455
        super(Group, self).__init__(ref, **kwargs)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1456
        self.name = kwargs.get('name', ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1457
        self.support_data = kwargs.get("data", False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1458
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1459
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1460
        if isinstance(obj, (Group, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1461
                           Base, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1462
                           _FeatureProxy, \
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1463
                           FeatureLink, \
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1464
                           ConfigurationProxy)): 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1465
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1466
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1467
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1468
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1469
    def _default_object(self, name):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1470
        return self._group_class()(name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1471
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1472
    def _group_class(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1473
        return Group
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1474
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1475
    def _featurelink_class(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1476
        return FeatureLink
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1477
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1478
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1479
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1480
        A generic add function to add child objects. The function is intended to act as
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1481
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1482
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1483
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1484
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1485
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1486
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1487
        if self._supported_type(child):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1488
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1489
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1490
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1491
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1492
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1493
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1494
        Return the name of the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1495
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1496
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1497
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1498
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1499
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1500
        Set the name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1501
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1502
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1503
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1504
    def create_featurelink(self, feature_ref, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1505
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1506
        create a feature link object to this element, with the given ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1507
        @param feature_ref: the reference for the featurelink which should
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1508
        point to a exising feature in the configuration.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1509
        @param **kwargs: keyword arguments are passed to the featurelink object 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1510
        directly.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1511
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1512
        fealink = self._featurelink_class()(feature_ref, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1513
        self.add(fealink)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1514
        return fealink
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1515
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1516
    def get_featurelink(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1517
        return self._get(FeatureLink.get_featurelink_ref(ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1518
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1519
    def add_feature(self, feature, path=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1520
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1521
        Add feature to this Group.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1522
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1523
        if not isinstance(feature, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1524
            raise exceptions.IncorrectClassError("add_feature requires instance of Feature!! Given %s" % feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1525
        if not self.support_data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1526
            self._add_to_path(path, _FeatureProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1527
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1528
            self._add_to_path(path, _FeatureDataProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1529
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1530
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1531
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1532
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1533
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1534
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1535
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1536
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1537
    def get_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1538
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1539
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1540
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1541
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1542
            return self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1543
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1544
            raise exceptions.NotFound("Feature '%s' not found." % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1545
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1546
    def get_features(self, refs, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1547
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1548
        Get a list of features that match the ref. 
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1549
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1550
        @param refs: The paths (refs) to the given feature or xpath like expression. The refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1551
        argument can be a single reference or a list of references to features. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1552
        @return: A list of features.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1553
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1554
        NOTE! the invalid references will not raise an exception.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1555
         
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1556
        Example1: get_features('foo.bar') would be the same as get_feature('foo.bar'), but this returns 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1557
        always a list [<Feature>].
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1558
        Example2: get_features('foo.*') would try to retrieve a list of all foo children.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1559
        Example3: get_features('foo.*', type='') would try to retrieve a list of all foo children, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1560
        that have a defined type.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1561
        Example4: get_features(['foo','bar.set1']) would try to retrieve a foo and then bar.set1.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1562
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1563
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1564
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1565
        if utils.is_list(refs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1566
            features = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1567
            for ref in refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1568
                features += self.get_matching_features(ref, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1569
            return features
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1570
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1571
            return self.get_matching_features(refs, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1572
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1573
    def get_matching_features(self, ref, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1574
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1575
        Get a list of features that match the ref. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1576
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1577
        @param refs: The paths (refs) to the given feature or xpath like expression. The refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1578
        argument can be a single reference or a list of references to features. 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1579
        @return: A list of features.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1580
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1581
        NOTE! the invalid references will not raise an exception but return an empty list.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1582
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1583
        Example1: get_features('foo.bar') would be the same as get_feature('foo.bar'), but this returns 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1584
        always a list [<Feature>].
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1585
        Example2: get_features('foo.*') would try to retrieve a list of all foo children.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1586
        Example3: get_features('foo.*', type='') would try to retrieve a list of all foo children, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1587
        that have a defined type.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1588
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1589
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1590
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1591
            (startref, last) = utils.dottedref.psplit_ref(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1592
            startelem = self._get(startref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1593
            kwargs['type'] = _FeatureProxy
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1594
            if last == '**':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1595
                return [fea for fea in startelem._traverse(**kwargs)]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1596
            elif last == '*':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1597
                return [fea for fea in startelem._objects(**kwargs)] 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1598
            elif ref != "":
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1599
                return [self._get(ref)]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1600
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1601
                return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1602
        except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1603
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1604
         
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1605
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1606
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1607
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1608
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1609
        return [fea.get_ref() for fea in self._objects(type=(_FeatureProxy))]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1610
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1611
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1612
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1613
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1614
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1615
        return [fea.fqr for fea in self._traverse(type=(_FeatureProxy))]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1616
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1617
    def create_group(self, groupname, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1618
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1619
        create a group object to this element with given group name.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1620
        @param groupname: the name for the new group
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1621
        @param **kwargs: keyword arguments are passed on to the new group object.  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1622
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1623
        grp = self._group_class()(groupname, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1624
        self.add_group(grp)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1625
        return grp
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1626
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1627
    def add_group(self, grp):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1628
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1629
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1630
        self._add(grp)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1631
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1632
    def remove_group(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1633
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1634
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1635
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1636
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1637
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1638
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1639
    def get_group(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1640
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1641
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1642
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1643
        return self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1644
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1645
    def list_groups(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1646
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1647
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1648
        return [group.ref for group in self._objects(type=Group)]
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1649
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1650
    def populate(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1651
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1652
        Populate or fetch the link to the actual feature for this featureproxy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1653
        This method fetches the feature to the _obj member variable and populates also 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1654
        subfeatures. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1655
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1656
        for child in self._traverse(type=FeatureLink):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1657
            child.populate()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1658
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1659
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1660
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1661
class View(Group):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1662
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1663
    A View class. View is intended to create new or different hierarchies of existing features. A View can contain Group and/or Feature objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1664
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1665
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1666
        super(View, self).__init__(self.to_ref(ref), **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1667
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1668
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1669
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1670
    def to_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1671
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1672
        return a view reference converted from name 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1673
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1674
        return ref.replace('.', '').replace('/', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1675
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1676
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1677
class Feature(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1678
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1679
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1680
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1681
    PROPERTIES = ['value']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1682
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1683
        super(Feature, self).__init__(ref, **kwargs)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1684
        self.name = kwargs.get('name', None)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1685
        self.type = kwargs.get('type', None)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1686
        self.relevant = kwargs.get('relevant', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1687
        self.constraint = kwargs.get('constraint', None)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1688
        self._dataproxy = None
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  1689
        self.extensionAttributes = []
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1690
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1691
    def __copy__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1692
        dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1693
        for key in self.__dict__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1694
            if key.startswith('_') or key == 'ref':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1695
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1696
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1697
                dict[key] = self.__dict__[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1698
        fea = self.__class__(self.ref, **dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1699
        return fea
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1700
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1701
    def __getstate__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1702
        state = super(Feature, self).__getstate__()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1703
        # remove the dataproxy value so that it is not stored in serializings
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1704
        state.pop('_dataproxy', None)
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
  1705
        # remove instancemethods so that those are not stored in serializings
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
  1706
        state.pop('get_original_value', None)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
  1707
        state.pop('get_value', None)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
  1708
        state.pop('set_value', None)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
  1709
        state.pop('add_feature', None)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1710
        return state
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1711
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1712
    def __setstate__(self, state):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1713
        super(Feature, self).__setstate__(state)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1714
        self._dataproxy = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1715
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1716
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1717
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1718
        # For now support added for desc element via support for Base
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1719
        if isinstance(obj, (Feature, Option, Base)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1720
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1721
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1722
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1723
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1724
    def _feature_class(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1725
        return Feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1726
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1727
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1728
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1729
        A generic add function to add child objects. The function is intended to act as
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1730
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1731
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1732
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1733
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1734
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1735
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1736
        if isinstance(child, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1737
            self.add_feature(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1738
        elif isinstance(child, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1739
            self._add(child, policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1740
        elif isinstance(child, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1741
            self._add(child, policy)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1742
        elif isinstance(child, Property):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1743
            self._add(child, policy)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1744
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1745
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1746
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1747
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1748
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1749
        Return the name of the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1750
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1751
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1752
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1753
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1754
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1755
        Set the name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1756
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1757
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1758
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1759
    def get_relevant(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1760
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1761
        Return the relevant attribute of the feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1762
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1763
        return self.relevant
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1764
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1765
    def set_relevant(self, relevant):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1766
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1767
        Set the relevant attribute
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1768
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1769
        self.relevant = relevant
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1770
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1771
    def get_constraint(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1772
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1773
        Return the constraint attribute of the feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1774
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1775
        return self.constraint
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1776
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1777
    def set_constraint(self, constraint):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1778
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1779
        Set the constraint attribute
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1780
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1781
        self.constraint = constraint
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1782
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1783
    def get_type(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1784
        return self.type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1785
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1786
    def set_type(self, type):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1787
        self.type = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1788
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1789
    def create_feature(self, ref, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1790
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1791
        Create a feature object to the configuration.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1792
        @param ref: The ref for the Feature object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1793
        @param **kwargs: keyword arguments  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1794
        e.g. to add fea2 under fea1 add_feature(fea2, 'fea1')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1795
        @return: the new feature object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1796
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1797
        fea = self._feature_class()(ref, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1798
        self.add_feature(fea)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1799
        return fea
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1800
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1801
    def add_feature(self, feature, path=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1802
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1803
        @param feature: The Feature object to add 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1804
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1805
        self._add_to_path(path, feature)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1806
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1807
    def get_feature(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1808
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1809
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1810
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1811
        return self._get(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1812
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1813
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1814
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1815
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1816
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1817
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1818
        self._remove(ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1819
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1820
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1821
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1822
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1823
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1824
        return [fea.get_ref() for fea in self._objects(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1825
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1826
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1827
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1828
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1829
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1830
        return [fea._path(self) for fea in self._traverse(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1831
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1832
    def add_option(self, option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1833
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1834
        @param option: option object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1835
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1836
        if not isinstance(option, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1837
            raise TypeError("%r is not an instance of Option!" % option)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1838
        self._add(option)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1839
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1840
    def create_option(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1841
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1842
        @param name: option name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1843
        @param value: option value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1844
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1845
        self._add(Option(name, value))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1846
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1847
    def get_option(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1848
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1849
        @param name: The option reference of the option (as returned by list_options()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1850
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1851
        real_ref = 'opt_' + ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1852
        obj = self._get(real_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1853
        if not isinstance(obj, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1854
            raise TypeError('Object %r is not an instance of Option (%r instead)' % (real_ref, type(obj)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1855
        return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1856
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1857
    def remove_option(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1858
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1859
        remove a given option from this feature by option reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1860
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1861
        real_ref = 'opt_' + ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1862
        obj = self._get(real_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1863
        if not isinstance(obj, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1864
            raise TypeError('Trying to remove option with ref %r, but object with ref %r is not an instance of Option (%s instead)' % (ref, real_ref, type(obj)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1865
        self._remove(real_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1866
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1867
    def list_options(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1868
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1869
        Return a array of all Option children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1870
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1871
        # Return option refs without the leading 'opt_'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1872
        return [opt.ref[4:] for opt in self._objects(type=Option)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1873
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1874
    def add_property(self, property):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1875
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1876
        @param property: property object to add
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1877
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1878
        if not isinstance(property, Property):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1879
            raise TypeError("%r is not an instance of Property!" % property)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1880
        self._add(property)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1881
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1882
    def create_property(self, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1883
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1884
        @param name=str: property name 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1885
        @param value=str: property value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1886
        @param unit=str: property unit, e.g. kB
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1887
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1888
        self._add(Property(**kwargs))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1889
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1890
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1891
    def get_property(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1892
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1893
        @param ref: The ref of the property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1894
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1895
        obj = self._get(Property.to_propertyref(ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1896
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1897
        if not isinstance(obj, Property):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1898
            raise TypeError('Object %r is not an instance of Property (%r instead)' % (Property.to_propertyref(ref), type(obj)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1899
        return obj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1900
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1901
    def remove_property(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1902
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1903
        remove a given property from this feature by ref. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1904
        @param ref: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1905
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1906
        obj = self._get(Property.to_propertyref(ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1907
        if not isinstance(obj, Property):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1908
            raise TypeError('Trying to remove property with ref %r, but object with ref %r is not an instance of Property (%s instead)' % (ref, Property.to_propertyref(ref), type(obj)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1909
        self._remove(Property.to_propertyref(ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1910
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1911
    def list_properties(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1912
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1913
        Return a array of all Feature properties under this object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1914
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1915
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1916
        return [Property.to_normref(property.ref) for property in self._objects(type=Property)]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1917
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1918
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1919
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1920
        Get the current value of the feature. 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1921
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1922
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1923
        return self.convert_data_to_value(self.dataproxy._get_datas(attr=attr), cast=True, attr=attr)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1924
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1925
    def set_value(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1926
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1927
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1928
        @param value: the value to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1929
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1930
        data_objs = self.convert_value_to_data(value, attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1931
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1932
        # Set the created data objects to the dataproxy and the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1933
        # last configuration, overriding any existing elements
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1934
        self.dataproxy._set_datas(data_objs, attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1935
        last_config = self.get_root_configuration().get_last_configuration()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1936
        last_config.add_data(data_objs, container.REPLACE)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1937
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1938
    def convert_data_to_value(self, data_objects, cast=True, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1939
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1940
        Convert the given list of Data objects into a suitable value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1941
        for this setting.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1942
        @param data_objects: The Data object list.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1943
        @param cast: If True, the value should be cast to its correct Python type
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1944
            (e.g. int), if False, the value should remain in the string form
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1945
            it was in the data objects.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1946
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1947
        @return: The converted value.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1948
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1949
        if not data_objects:    return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1950
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1951
        data_obj = data_objects[-1]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1952
        if data_obj.map:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1953
            value = self._resolve_name_id_mapped_value(data_obj.map, cast_value=cast)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1954
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1955
            value = data_obj.value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1956
            if cast: value = self.get_value_cast(value, attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1957
        return value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1958
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1959
    def convert_value_to_data(self, value, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1960
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1961
        Convert the given value to a list of Data objects that can be placed
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1962
        in the configuration's last layer's data section (DataContainer object).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1963
        @param value: The value to convert.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1964
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1965
        @return: The converted Data objects.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1966
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1967
        value = self.set_value_cast(value, attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1968
        return [Data(fqr=self.fqr, value=value, attr=attr)]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1969
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1970
    def del_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1971
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1972
        Delete the topmost value for this feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1973
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1974
        self.dataproxy._del_value(attr)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1975
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1976
    def get_value_cast(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1977
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1978
        A function to perform the value type casting in get operation  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1979
        @param value: the value to cast 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1980
        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1981
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1982
        return value 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1983
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1984
    def set_value_cast(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1985
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1986
        A function to perform the value type casting in the set operation  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1987
        @param value: the value to cast 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1988
        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1989
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1990
        return value 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1991
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1992
    def get_original_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1993
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1994
        Get the current value of the feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1995
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1996
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1997
        return self.convert_data_to_value(self.dataproxy._get_datas(attr=attr), cast=False, attr=attr)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1998
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1999
    def add_data(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2000
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2001
        Add a data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2002
        @param data: A Data object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2003
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2004
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2005
            return self.dataproxy._add_data(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2006
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2007
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2008
            return self.dataproxy._add_data(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2009
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2010
    def get_data(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2011
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2012
        Helper function to get the topmost data value from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2013
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2014
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2015
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2016
            return self.dataproxy._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2017
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2018
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2019
            return self.dataproxy._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2020
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2021
    def get_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2022
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2023
        Helper function to get the data values from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2024
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2025
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2026
            return self.dataproxy._get_datas()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2027
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2028
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2029
            return self.dataproxy._get_datas()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2030
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2031
    def get_valueset(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2032
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2033
        Get the ValueSet object for this feature, that has the list of available values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2034
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2035
        if self.get_type() == 'boolean':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2036
            return ValueSet([True, False])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2037
        elif self.get_type() == 'int':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2038
            return ValueRange(0, sys.maxint)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2039
        elif self.get_type() == 'string':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2040
            return ValueRe('.*')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2041
        elif self.get_type() in ('selection', 'multiSelection'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2042
            values = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2043
            for opt in self._objects(type=Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2044
                v = opt.get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2045
                if v is not None: values.append(v)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2046
            return ValueSet(values)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2047
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2048
    def is_sequence(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2049
        """ Return true if the feature is a sequence or part of a sequence """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2050
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2051
            return self._parent.is_sequence()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2052
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2053
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2054
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2055
    def is_sequence_root(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2056
        """ Return true if this feature is a sequence object it self """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2057
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2058
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2059
    def get_sequence_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2060
        """ Try to get a FeatureSequence object for this Feature if it is found """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2061
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2062
            return self._parent.get_sequence_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2063
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2064
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2065
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2066
    def getdataproxy(self): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2067
        if self._dataproxy == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2068
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2069
        return self._dataproxy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2070
    def setdataproxy(self, value): self._dataproxy = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2071
    def deldataproxy(self): self._dataproxy = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2072
    dataproxy = property(getdataproxy, setdataproxy, deldataproxy)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2073
    """ Use custom OProperty to enable overriding value methods in subclasses """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2074
    value = utils.OProperty(get_value, set_value, del_value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2075
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2076
    def get_column_value(self, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2077
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2078
        Get the value of the featuresequence column
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2079
        @param ref: the reference to the column   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2080
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2081
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2082
        """ get the feature specific data from sequence => a column of data table """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2083
        seq_parent = self.get_sequence_parent()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2084
        if seq_parent._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2085
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2086
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2087
        coldata =  []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2088
        colref = self.path(seq_parent)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2089
        for row in seq_parent.data:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2090
            feadata = row.get_feature(colref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2091
            coldata.append(feadata.get_value(attr))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2092
        return coldata
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2093
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2094
    def get_column_original_value(self, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2095
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2096
        Get the value of the featuresequence column
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2097
        @param feasequence: the feature sequence object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2098
        @param ref: the reference to the column   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2099
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2100
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2101
        """ get the feature specific data from sequence => a column of data table """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2102
        seq_parent = self.get_sequence_parent()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2103
        if seq_parent._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2104
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2105
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2106
        coldata =  []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2107
        colref = self.path(seq_parent)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2108
        for row in seq_parent.data:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2109
            feadata = row.get_feature(colref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2110
            coldata.append(feadata.get_original_value(attr))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2111
        return coldata
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2112
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2113
    def set_column_value(self, value, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2114
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2115
        Get the value of the featuresequence column
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2116
        @param feasequence: the feature sequence object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2117
        @param ref: the reference to the column   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2118
        @param value: the value to set. This must be a list instance. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2119
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2120
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2121
        seq_parent = self.get_sequence_parent()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2122
        colref = self.path(seq_parent)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2123
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2124
        if not isinstance(value,list): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2125
            raise exceptions.ConeException("The value for feature sequence '%s' column '%s' must be a list instance. Got %r" % (self.get_sequence_parent().fqr, colref, value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2126
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2127
        # Handle the special case where the sequence is marked as empty
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2128
        # with the empty sequence marker (single empty data element)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2129
        if seq_parent._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2130
            seqrows = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2131
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2132
            seqrows = seq_parent.data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2133
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2134
        if len(seqrows) < len(value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2135
            raise exceptions.ConeException("Too many values for feature sequence '%s' column '%s'. Sequence holds only %d rows. Got %d data values in %r" % (self.get_sequence_parent().fqr, colref, len(seqrows), len(value), value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2136
        for i in range(0, len(value)):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2137
            feadata = seqrows[i].get_feature(colref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2138
            feadata.set_value(value[i])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2139
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2140
    def add_sequence_feature(self, feature, path=""):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2141
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2142
        Override of the add_feature function in sequence to set the sequence childs to act 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2143
        as columns of the feature sequence
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2144
        @param feature: The Feature object to add 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2145
        @param path: path to feature if it not added directly under parent_fea 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2146
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2147
        # modify all possible children of feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2148
        for fea in feature._traverse(type=Feature):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2149
            to_sequence_feature(fea)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2150
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2151
        # Finally modify and add this feature to parent_feat
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2152
        to_sequence_feature(feature)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2153
        self._add_to_path(path, feature)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2154
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2155
    def _resolve_name_id_mapped_value(self, mapping_string, cast_value=True):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2156
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2157
        Resolve the name-ID mapped value based on the given mapping string.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2158
        @param mapping_string: The name-ID mapping string in the data element, e.g.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2159
            "FooFeature/FooSequence[@key='123']"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2160
        @param cast_value: If True, the resolved value will be cast to the corresponding
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2161
            Python type, otherwise the raw string representation of the value in the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2162
            data element will be returned.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2163
        @return: The resolved value.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2164
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2165
        def fail(msg): raise exceptions.NameIdMappingError(msg)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2166
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2167
        pattern = r"^([\w/]+)\[@key='(.*)'\]$"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2168
        m = re.match(pattern, mapping_string)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2169
        if m is None: fail("Malformed mapping expression: %s" % mapping_string)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2170
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2171
        source_seq_ref = m.group(1).replace('/', '.')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2172
        mapping_key = m.group(2)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2173
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2174
        dview = self.get_root_configuration().get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2175
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2176
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2177
            source_seq = dview.get_feature(source_seq_ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2178
        except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2179
            fail("Mapping source sequence '%s' does not exist" % source_seq_ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2180
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2181
        if source_seq.type != 'sequence':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2182
            fail("Mapping source setting '%s' is not a sequence setting" % source_seq_ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2183
        if not source_seq.mapKey or not source_seq.mapValue:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2184
            fail("Source sequence '%s' must have both mapKey and mapValue specified" % source_seq_ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2185
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2186
        def get_subsetting(ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2187
            """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2188
            Return the sub-setting by the given mapKey or mapValue ref from the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2189
            source sequence.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2190
            @param ref: The reference in the format it is in the ConfML file.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2191
                E.g. 'SubSetting', 'FileSubSetting/localPath', 'FileSubSetting/targetPath'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2192
            """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2193
            subsetting = source_seq.get_feature(ref.replace('/', '.'))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2194
            # Use localPath for file and folder settings by default
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2195
            if subsetting.type in ('file', 'folder'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2196
                subsetting = subsetting.get_feature('localPath')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2197
            return subsetting
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2198
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2199
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2200
            key_subsetting = get_subsetting(source_seq.mapKey)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2201
        except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2202
            fail("Invalid mapKey in source sequence '%s': no sub-setting with ref '%s'" % (source_seq_ref, source_seq.mapKey))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2203
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2204
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2205
        # Get possible override for mapValue from options
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2206
        value_subsetting_ref = source_seq.mapValue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2207
        value_subsetting_ref_overridden = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2208
        for opt in self._objects(type=Option):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2209
            if not opt.map or not opt.map_value: continue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2210
            if opt.map.replace('/', '.') == source_seq_ref:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2211
                value_subsetting_ref = opt.map_value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2212
                value_subsetting_ref_overridden = True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2213
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2214
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2215
            value_subsetting = get_subsetting(value_subsetting_ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2216
        except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2217
            if value_subsetting_ref_overridden:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2218
                fail("Invalid mapValue override in option: sub-setting '%s' does not exist under source sequence '%s'" % (value_subsetting_ref, source_seq_ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2219
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2220
                fail("Invalid mapValue in source sequence '%s': no sub-setting with ref '%s'" % (source_seq_ref, value_subsetting_ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2221
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2222
        key_list = key_subsetting.get_original_value()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2223
        if mapping_key not in key_list:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2224
            fail("No item-setting in source sequence '%s' matches key '%s'" % (source_seq_ref, mapping_key))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2225
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2226
        if cast_value:  value_list = value_subsetting.get_value()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2227
        else:           value_list = value_subsetting.get_original_value()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2228
        return value_list[key_list.index(mapping_key)]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2229
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2230
    def set_extension_attributes(self, attributes):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2231
        self.extensionAttributes = attributes
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2232
        
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2233
    def get_extension_attributes(self):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2234
        return self.extensionAttributes
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2235
    
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2236
    def add_extension_attribute(self, attribute):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  2237
        self.extensionAttributes.append(attribute)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2238
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2239
class FeatureSequence(Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2240
    POLICY_REPLACE = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2241
    POLICY_APPEND = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2242
    POLICY_PREPEND = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2243
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2244
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2245
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2246
    dataelem_name = '?datarows'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2247
    template_name = '?template'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2248
    def __init__(self, ref="", **kwargs):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2249
        super(FeatureSequence, self).__init__(ref, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2250
        self.name = kwargs.get('name', ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2251
        self.type = 'sequence'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2252
        self._templatedata = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2253
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2254
    def _get_policy(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2255
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2256
        parse the policy from a policy string and return a constant
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2257
        @return: POLICY_* constant
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2258
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2259
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2260
            containerdata = utils.get_list(data._get_parent()._get(data.get_ref()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2261
            firstdata = containerdata[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2262
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2263
            firstdata = data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2264
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2265
        if firstdata.policy == 'append':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2266
            return self.POLICY_APPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2267
        elif firstdata.policy == 'prefix':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2268
            return self.POLICY_PREPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2269
        elif firstdata == data:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2270
            # otherwise the policy is either replace or undefined
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2271
            # (firstdata.policy == 'replace' or firstdata.policy == ''):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2272
            return self.POLICY_REPLACE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2273
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2274
            return self.POLICY_APPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2275
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2276
    def _set_template_data(self, data=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2277
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2278
        Set the template of the feature sequence  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2279
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2280
        if data != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2281
            self._templatedata = data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2282
            for feaname in self.list_features():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2283
                if self._templatedata._has(feaname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2284
                    self.get_feature(feaname)._templatedata = self._templatedata._get(feaname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2285
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2286
                    subdata = Data(ref=feaname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2287
                    self.get_feature(feaname)._templatedata = subdata
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2288
                    self._templatedata._add(subdata) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2289
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2290
    def _add_datarow(self, dataobj=None, policy=POLICY_APPEND):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2291
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2292
        Add a feature data row for a new data in this sequence 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2293
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2294
        create_sub_data_objs = True
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2295
        if dataobj == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2296
            dataobj = Data(fqr=self.fqr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2297
        elif dataobj.attr != 'data':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2298
            # Add data rows only for data objects (not e.g. RFS)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2299
            return
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2300
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2301
            # If the data object is given, but it doesn't contain any child
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2302
            # elements, don't add them automatically. This is to account for the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2303
            # case where there is only one empty data element that specifies
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2304
            # that the sequence is set to be empty
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2305
            if len(dataobj._order) == 0:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2306
                create_sub_data_objs = False
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2307
        fea = FeatureSequenceSub(self.dataelem_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2308
        rowproxy = _FeatureDataProxy(fea._name, fea)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2309
        """ the imaginary features share the parent relation of the proxy objects """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2310
        self.dataproxy._add(rowproxy, policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2311
        fea._parent = rowproxy._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2312
        rowproxy._add_data(dataobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2313
        """ update the FeatureSequenceSub index from the index number of dataproxy """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2314
        fea._index = utils.get_list(self.dataproxy._get(self.dataelem_name)).index(rowproxy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2315
        # Create a the subfeatures / columns for the parent feature and 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2316
        # add a data element under each feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2317
        for feaname in self.list_all_features():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2318
            (pathto_fea, fearef) = utils.dottedref.psplit_ref(feaname)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2319
            subfea = self.get_feature(feaname)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2320
            cellfea = FeatureSequenceSub(fearef)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2321
            cellfea.set_value_cast = subfea.set_value_cast
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2322
            cellfea.get_value_cast = subfea.get_value_cast
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2323
            cellfea.convert_data_to_value = subfea.convert_data_to_value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2324
            cellfea.convert_value_to_data = subfea.convert_value_to_data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2325
            rowproxy.add_feature(cellfea, pathto_fea)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2326
            subproxy = rowproxy.get_feature(feaname)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2327
            subproxy._obj._parent = subproxy._parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2328
            if create_sub_data_objs and not dataobj._has(feaname):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2329
                dataobj._add_to_path(pathto_fea, Data(ref=fearef))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2330
            subproxy._add_data(dataobj._get(feaname))
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2331
        return dataobj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2332
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2333
    def _has_empty_sequence_marker(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2334
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2335
        Return True if the sequence setting has the empty sequence marker (a single
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2336
        empty data element), which denotes that the sequence is set to empty.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2337
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2338
        datatable = self.get_data()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2339
        if len(datatable) == 1:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2340
            data_elem = datatable[0].get_datas()[0]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2341
            if len(data_elem._order) == 0:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2342
                return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2343
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2344
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2345
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2346
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2347
        A generic add function to add child objects. The function is intended to act as
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2348
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2349
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2350
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2351
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2352
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2353
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2354
        if isinstance(child, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2355
            self.add_feature(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2356
        elif isinstance(child, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2357
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2358
        elif isinstance(child, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2359
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2360
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2361
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2362
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2363
    def add_feature(self, feature, path=""):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2364
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2365
        Override of the add_feature function in sequence to set the sequence childs to act 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2366
        as columns of the feature sequence
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2367
        @param feature: The Feature object to add 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2368
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2369
        add_sequence_feature(self, feature, path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2370
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2371
    def add_sequence(self, data=None, policy=POLICY_APPEND):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2372
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2373
        Add a feature data row for a new data in this sequence 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2374
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2375
        if self._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2376
            # We currently have the empty sequence marker (single empty data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2377
            # element), so this one that we are adding should replace it
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2378
            policy = self.POLICY_REPLACE
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2379
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2380
        datarow = self._add_datarow(None, policy)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2381
        # add the new data sequence/row to the last configuration layer
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2382
        last_config = self.get_root_configuration().get_last_configuration()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2383
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2384
        container_policy = {self.POLICY_REPLACE: container.REPLACE,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2385
                            self.POLICY_APPEND:  container.APPEND,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2386
                            self.POLICY_PREPEND: container.PREPEND}[policy]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2387
        last_config.add_data(datarow, container_policy)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2388
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2389
        # set the initial data if it is given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2390
        rowproxy = utils.get_list(self.dataproxy._get(self.dataelem_name))[-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2391
        if data != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2392
            for index in range(len(data)):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2393
                if data[index] != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2394
                    rowproxy[index].set_value(data[index])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2395
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2396
    def set_template(self, data=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2397
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2398
        Set the template of the feature sequence  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2399
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2400
        if data is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2401
            self._templatedata = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2402
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2403
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2404
        if not isinstance(data, list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2405
            raise TypeError('data must be a list (got %r)' % data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2406
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2407
        # Create the new template data object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2408
        templatedata = Data(fqr=self.fqr, template=True)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2409
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2410
        # Add all sub-objects to the data object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2411
        def add_data_objects(feature, data_obj, value_list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2412
            refs = feature.list_features()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2413
            if len(refs) != len(value_list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2414
                raise ValueError("Data value list is invalid")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2415
            for i, ref in enumerate(refs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2416
                value = value_list[i]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2417
                subfea = feature.get_feature(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2418
                if isinstance(value, list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2419
                    subdata = Data(ref=ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2420
                    data_obj.add(subdata)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2421
                    add_data_objects(feature.get_feature(ref), subdata, value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2422
                else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2423
                    if value is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2424
                        subdata = Data(ref=ref, value=subfea.set_value_cast(value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2425
                        data_obj.add(subdata)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2426
        add_data_objects(self, templatedata, data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2427
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2428
        self._set_template_data(templatedata)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2429
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2430
        # Remove any existing template data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2431
        pconfig = self.find_parent(type=Configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2432
        dataobjs = pconfig._traverse(type=Data, filters=[lambda x: x.template and x.fqr == self.fqr])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2433
        if dataobjs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2434
            for dataobj in dataobjs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2435
                dataobj._parent._remove(dataobj.get_fullref())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2436
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2437
        # Add the template data to the parent config (beginning of the data section)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2438
        pconfig.add_data(self._templatedata, policy=container.PREPEND)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2439
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2440
    def get_template(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2441
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2442
        Add a feature data row for a new data in this sequence 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2443
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2444
        #self._set_template(None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2445
        # set the initial data if it is given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2446
        if self._templatedata:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2447
            def get_data_items(feature, data_obj):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2448
                refs = feature.list_features()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2449
                if refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2450
                    result = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2451
                    for ref in refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2452
                        if data_obj._has(ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2453
                            result.append(get_data_items(feature.get_feature(ref), data_obj._get(ref)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2454
                        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2455
                            result.append(None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2456
                    return result
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2457
                else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2458
                    return data_obj.value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2459
            return get_data_items(self, self._templatedata)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2460
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2461
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2462
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2463
    def get_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2464
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2465
        Helper function to get the topmost data value from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2466
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2467
        if self.dataproxy._has(self.dataelem_name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2468
            return utils.get_list(self.dataproxy._get(self.dataelem_name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2469
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2470
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2471
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2472
    def add_data(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2473
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2474
        Add a data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2475
        @param data: A Data object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2476
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2477
        # Skip template data adding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2478
        if data.template:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2479
            self._set_template_data(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2480
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2481
            # Get the data index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2482
            self._add_datarow(data, self._get_policy(data))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2483
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2484
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2485
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2486
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2487
        Helper function to get the topmost data value from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2488
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2489
        if self._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2490
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2491
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2492
        datatable =  self.get_data()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2493
        rettable = []
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2494
        for row in datatable:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2495
            rowvalues = row.value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2496
            rettable.append(rowvalues)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2497
        return rettable
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2498
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2499
    def get_original_value(self, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2500
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2501
        Get the current value of the feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2502
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2503
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2504
        if self._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2505
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2506
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2507
        datatable =  self.get_data()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2508
        rettable = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2509
        for row in datatable:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2510
            rowvalues = row.get_original_value()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2511
            rettable.append(rowvalues)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2512
        return rettable
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2513
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2514
    def set_value(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2515
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2516
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2517
        @param value: the value to set. The value must be a two dimensional array (e.g. matrix)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2518
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2519
        if value:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2520
            # Add the first item with replace policy
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2521
            self.add_sequence(value[0], self.POLICY_REPLACE)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2522
            for row in value[1:]:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2523
                self.add_sequence(row)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2524
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2525
            # Setting the sequence to empty, so add one empty item-setting
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2526
            # to signify that
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2527
            self.add_sequence(None, self.POLICY_REPLACE)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2528
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2529
            # Strip all sub-elements from the data element just created,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2530
            # since the ConfML spec says that an empty sequence is denoted
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2531
            # by a single empty data element
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2532
            data_elem = self.get_data()[0].get_datas()[0]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2533
            for r in list(data_elem._order):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2534
                data_elem._remove(r)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2535
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2536
    def is_sequence(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2537
        """ Return always true from a sequence object """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2538
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2539
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2540
    def is_sequence_root(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2541
        """ Return true if this feature is a sequence object it self """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2542
        return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2543
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2544
    def get_column_features(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2545
        """ Return a list of sequence subfeature, which are the columns of the sequence """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2546
        columns = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2547
        for subref in self.list_features():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2548
            columns.append(self.get_feature(subref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2549
        return columns
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2550
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2551
    def get_sequence_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2552
        """ Return this object as a sequence parent """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2553
        return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2554
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2555
    value = property(get_value, set_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2556
    data = property(get_data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2557
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2558
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2559
def add_sequence_feature(parent_feature, feature, path=""):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2560
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2561
    Override of the add_feature function in sequence to set the sequence childs to act 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2562
    as columns of the feature sequence
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2563
    @param parent_feature: The parent feature where the feature object is added 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2564
    @param feature: The Feature object to add 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2565
    @param path: path to feature if it not added directly under parent_fea 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2566
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2567
    # modify all possible children of feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2568
    for fea in feature._traverse(type=Feature):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2569
        to_sequence_feature(fea)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2570
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2571
    # Finally modify and add this feature to parent_feat
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2572
    to_sequence_feature(feature)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2573
    parent_feature._add_to_path(path, feature)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2574
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2575
def to_sequence_feature(feature):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2576
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2577
    modify a Feature object to sequence feature that will return column like data from a sequence.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2578
    @param feature: The Feature object for which is modified.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2579
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2580
    feature.get_value = feature.get_column_value 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2581
    feature.get_original_value = feature.get_column_original_value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2582
    feature.set_value = feature.set_column_value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2583
    feature.add_feature = feature.add_sequence_feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2584
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2585
def get_column_value(feasequence, ref, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2586
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2587
    Get the value of the featuresequence column
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2588
    @param feasequence: the feature sequence object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2589
    @param ref: the reference to the column   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2590
    @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2591
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2592
    """ get the feature specific data from sequence => a column of data table """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2593
    coldata =  []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2594
    for row in feasequence.data:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2595
        feadata = row.get_feature(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2596
        coldata.append(feadata.get_value(attr))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2597
    return coldata
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2598
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2599
def get_column_original_value(feasequence, ref, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2600
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2601
    Get the value of the featuresequence column
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2602
    @param feasequence: the feature sequence object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2603
    @param ref: the reference to the column   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2604
    @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2605
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2606
    """ get the feature specific data from sequence => a column of data table """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2607
    coldata =  []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2608
    for row in feasequence.data:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2609
        feadata = row.get_feature(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2610
        coldata.append(feadata.get_original_value(attr))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2611
    return coldata
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2612
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2613
def set_column_value(feasequence, ref, value, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2614
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2615
    Get the value of the featuresequence column
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2616
    @param feasequence: the feature sequence object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2617
    @param ref: the reference to the column   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2618
    @param value: the value to set. This must be a list instance. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2619
    @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2620
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2621
    if not isinstance(value,list): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2622
        raise exceptions.ConeException("The value for feature sequence '%s' column '%s' must be a list instance. Got %r" % (feasequence.fqr, ref, value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2623
    seqrows = feasequence.data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2624
    if len(seqrows) < len(value): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2625
        raise exceptions.ConeException("Too many values for feature sequence '%s' column '%s'. Sequence holds only %d rows. Got %d data values in %r" % (feasequence.fqr, ref, len(seqrows), len(value), value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2626
    for i in range(0, len(value)):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2627
        feadata = seqrows[i].get_feature(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2628
        feadata.set_value(value[i])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2629
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2630
class FeatureSequenceCell(Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2631
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2632
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2633
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2634
    def __init__(self, ref="", **kwargs):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2635
        super(FeatureSequenceCell, self).__init__(ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2636
        self.name = kwargs.get('name', ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2637
        self.type = 'seqcell'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2638
 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2639
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2640
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2641
        Get the current value of the feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2642
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2643
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2644
        return self.dataproxy._get_value(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2645
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2646
    def set_value(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2647
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2648
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2649
        @param value: the value to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2650
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2651
        # The sequence cell only updates the latest value in the proxy  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2652
        self.dataproxy.get_data().set_value(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2653
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2654
    value = property(get_value, set_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2655
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2656
class FeatureSequenceSub(Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2657
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2658
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2659
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2660
    def __init__(self, ref="", **kwargs):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2661
        super(FeatureSequenceSub, self).__init__(ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2662
        self.name = kwargs.get('name', ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2663
        self.type = 'subseq'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2664
        self._index = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2665
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2666
    def get_index(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2667
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2668
        @return : the index of the data element for sequential data defined inside the same configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2669
        0 for normal data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2670
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2671
        return self._index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2672
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2673
    def set_value(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2674
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2675
        Set the current value for this sequence row.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2676
        @param value: the value row to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2677
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2678
        if utils.is_list(value):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2679
            for subindex in range(0, len(value)):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2680
                self.dataproxy[subindex].get_data().set_value(value[subindex])
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2681
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2682
            data_objs = self.convert_value_to_data(value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2683
            data_object_where_to_add = self._parent._get_data()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2684
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2685
            self.dataproxy._set_datas(data_objs, attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2686
            data_object_where_to_add._add(data_objs, container.REPLACE)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2687
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2688
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2689
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2690
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2691
        @param value: the value to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2692
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2693
        # Handle empty sequences
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2694
        if self.get_sequence_parent()._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2695
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2696
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2697
        # The sequence cell only updates the latest value in the proxy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2698
        childdatas = self.dataproxy._objects()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2699
        if len(childdatas) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2700
            return [subdata.value for subdata in childdatas]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2701
        else: 
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2702
            return super(FeatureSequenceSub,self).get_value(attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2703
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2704
    def get_original_value(self, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2705
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2706
        Get the current value of the feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2707
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2708
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2709
        # Handle empty sequences
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2710
        if self.get_sequence_parent()._has_empty_sequence_marker():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2711
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2712
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2713
        childdatas = self.dataproxy._objects()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2714
        if len(childdatas) > 0:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2715
            return [subdata.get_original_value() for subdata in childdatas]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2716
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2717
            return self.dataproxy._get_value(attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2718
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2719
    value = property(get_value, set_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2720
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2721
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2722
class FeatureLink(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2723
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2724
    A _FeatureProxy class. _FeatureProxy is the object that is added to View as a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2725
    link to the actual Feature object. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2726
    """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2727
    """ class variable for defining the override attributes"""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2728
    override_attributes = ['name']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2729
    ref_prefix = 'link_'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2730
    PROXYREF_PREFIX = 'proxy_'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2731
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2732
    def __init__(self, ref="", **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2733
        # Store the fully qualified reference to this object
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2734
        self.link = kwargs.get('link', ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2735
        self.name = kwargs.get('name', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2736
        ref = self.get_featurelink_ref(self.link)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2737
        # the reference of this particular object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2738
        super(FeatureLink, self).__init__(ref, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2739
        self._obj = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2740
        self._populated = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2741
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2742
    def add(self, child, policy=container.REPLACE):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2743
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2744
        Add an override to enable adding any override attribute to a featurelink object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2745
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2746
        A generic add function to add child objects. The function is intended to act as
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2747
        proxy function that call the correct add function based on the child objects class.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2748
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2749
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2750
        @param child: the child object to add
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2751
        @raise IncorrectClassError: if the given class cannot be added to this object.  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2752
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2753
        if isinstance(child, Base):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2754
            self._add(child, policy)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2755
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2756
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2757
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2758
    def get_name(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2759
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2760
        Return the name of the featurelink
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2761
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2762
        return self.name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2763
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2764
    def set_name(self, name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2765
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2766
        Set the name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2767
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2768
        self.name = name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2769
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2770
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2771
    def fqr(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2772
        return self.link
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2773
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2774
    def populate(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2775
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2776
        Populate or fetch the link to the actual feature for this featureproxy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2777
        This method fetches the feature to the _obj member variable and populates also 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2778
        subfeatures. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2779
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2780
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2781
            if not self._populated:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2782
                feas = self.get_default_view().get_features(self.link)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2783
                # get the non wildcard part of ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2784
                static_ref = utils.dottedref.get_static_ref(self.link)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2785
                # add the found features to the parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2786
                for fea in feas:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2787
                    override_attrs = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2788
                    # override the FeatureProxy object with exactly same reference 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2789
                    # (in feat/* case dont override the children features)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2790
                    if fea.fqr == static_ref:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2791
                        override_attrs = self.get_attributes()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2792
                    feature = fea._obj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2793
                    proxy_ref = self.get_featureproxy_ref(feature.fqr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2794
                    proxy = _FeatureProxy(proxy_ref, feature, **override_attrs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2795
                    self._get_parent()._add(proxy)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2796
                    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2797
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2798
                parent_view = self._find_parent_or_default(type=View)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2799
                view_name = parent_view.get_name()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2800
                logging.getLogger('cone').info("Warning: Feature '%s' in view '%s' not found." % (self.link, view_name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2801
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2802
    def get_attributes(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2803
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2804
        Returns a list of FeatureLink attributes that override settings of the original feature.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2805
        @return: a dictionary of attribute key : value pairs.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2806
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2807
        attrs = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2808
        for attr in self.override_attributes:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2809
            # try to get the attribute from this object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2810
            # and set it to the attribute list if it not None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2811
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2812
                value = getattr(self, attr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2813
                if value != None: attrs[attr] = value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2814
            except AttributeError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2815
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2816
        return attrs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2817
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2818
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2819
    def get_featurelink_ref(cls, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2820
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2821
        return a featurelink ref from a feature ref. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2822
        This is needed to make the featurelink object refs unique in a container
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2823
        that has Features. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2824
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2825
        return cls.ref_prefix + ref.replace('.', '_').replace('/','_')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2826
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2827
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2828
    def get_featureproxy_ref(cls, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2829
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2830
        Return a ref for a given setting fqr to be used under a group.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2831
        This is needed to make the featureproxy object refs unique in a container
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2832
        that has Features. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2833
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2834
        return cls.PROXYREF_PREFIX + ref.replace('.', '_').replace('/','_')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2835
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2836
class _FeatureProxy(container.ObjectProxyContainer, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2837
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2838
    A _FeatureProxy class. _FeatureProxy is the object that is added to View as a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2839
    link to the actual Feature object. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2840
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2841
    def __init__(self, ref="", obj=None, **kwargs):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2842
        container.ObjectProxyContainer.__init__(self, obj, ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2843
        Base.__init__(self, ref, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2844
        self.support_data = False
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2845
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2846
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2847
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2848
        First check if the requested attr is a children then 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2849
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2850
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2851
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2852
            return self.__dict__['_children'][name] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2853
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2854
            return getattr(self._obj, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2855
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2856
    def __getitem__(self, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2857
        return self._objects()[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2858
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2859
    def __setitem__(self, index, value):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2860
        raise exceptions.NotSupportedException()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2861
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2862
    def __delitem__(self, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2863
        item = self.__getitem__(index)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2864
        return self._remove(item.get_ref())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2865
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2866
    def __len__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2867
        return len(self._order)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2868
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2869
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2870
        if isinstance(obj, _FeatureProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2871
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2872
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2873
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2874
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2875
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2876
        return Group(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2877
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2878
    def _set_parent(self, newparent):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2879
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2880
        @param newparent:  The new parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2881
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2882
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2883
        self._parent = newparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2884
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2885
    def get_proxied_obj(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2886
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2887
        @return: Returns proxied object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2888
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2889
        return self._obj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2890
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2891
    def add_feature(self, feature, path=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2892
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2893
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2894
        if not isinstance(feature, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2895
            raise exceptions.IncorrectClassError("add_feature requires instance of Feature!! Given %s" % feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2896
        if not self.support_data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2897
            self._add_to_path(path, _FeatureProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2898
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2899
            self._add_to_path(path, _FeatureDataProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2900
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2901
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2902
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2903
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2904
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2905
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2906
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2907
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2908
    def get_feature(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2909
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2910
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2911
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2912
        return self._get(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2913
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2914
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2915
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2916
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2917
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2918
        return self._list()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2919
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2920
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2921
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2922
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2923
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2924
        return [fea._path(self) for fea in self._traverse(type=_FeatureProxy)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2925
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2926
    def populate(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2927
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2928
        Dummy implementation of populate
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2929
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2930
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2931
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2932
    def has_attribute(self, name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2933
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2934
        Perform a check whether an attribute with given name is stored inside the 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2935
        _FeatureProxy. The check does not extend to the proxied (_obj) insanses or 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2936
        children of this proxy.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2937
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2938
        @return: True when an attribute is a real attribute in this _FeatureProxy object. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2939
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2940
        return self.__dict__.has_key(name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2941
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2942
    def get_option(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2943
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2944
        @param name: The option reference of the option (as returned by list_options()) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2945
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2946
        real_ref = 'opt_' + ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2947
        for op in self.options.values():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2948
            if op.ref == real_ref:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2949
                return op
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2950
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2951
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2952
            obj = self.get_proxied_obj()._get(real_ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2953
            if not isinstance(obj, Option):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2954
                raise TypeError('Object %r is not an instance of Option (%r instead)' % (real_ref, type(obj)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2955
            return obj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2956
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2957
    def list_options(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2958
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2959
        Return a array of all Option children references under this object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2960
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2961
        opts = self.get_proxied_obj().list_options()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2962
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2963
        for opt in self.options:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2964
            opts.append(self.options[opt].ref[4:])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2965
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2966
        return opts
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2967
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2968
    def get_property(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2969
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2970
        @param name: The property reference of the property (as returned by list_properties()) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2971
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2972
        for prop in self.properties.values():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2973
            if prop.ref == Property.to_propertyref(ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2974
                return prop
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2975
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2976
            obj = self.get_proxied_obj()._get(Property.to_propertyref(ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2977
            return obj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2978
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2979
    def list_properties(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2980
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2981
        Return a array of all Property children references under this object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2982
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2983
        props = self.get_proxied_obj().list_properties()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2984
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2985
        for pr in self.properties:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2986
            props.append(Property.to_normref(self.properties[pr].ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2987
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2988
        return props
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2989
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2990
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2991
class _FeatureDataProxy(_FeatureProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2992
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2993
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2994
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2995
    DEFAULT_KEY = 'data'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2996
    def __init__(self, ref="", obj=None, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2997
        # Initialize _obj to None, because __getattr__(), __setattr__()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2998
        # and __delattr__() access it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2999
        # Note that we cannot use self._obj = None here, since that would
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3000
        # invoke __setattr__(), causing a kind of a chicken-and-egg problem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3001
        object.__setattr__(self, '_obj', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3002
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3003
        super(_FeatureDataProxy, self).__init__(ref, obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3004
        self.support_data = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3005
        """ Create the data container of all types of data. Add the key for the default key. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3006
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3007
        self.defaultkey = _FeatureDataProxy.DEFAULT_KEY
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3008
        self.datas = {self.defaultkey : []}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3009
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3010
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3011
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3012
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3013
        if object.__getattribute__(self, '_obj') is not None:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3014
            self.get_proxied_obj().dataproxy = self
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3015
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3016
        if name in Feature.PROPERTIES:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3017
            return getattr(self.get_proxied_obj(), name)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3018
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3019
            return super(_FeatureDataProxy, self).__getattr__(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3020
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3021
    def __setattr__(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3022
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3023
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3024
        if object.__getattribute__(self, '_obj') is not None:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3025
            self.get_proxied_obj().dataproxy = self
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3026
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3027
        if name in Feature.PROPERTIES:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3028
            return setattr(self.get_proxied_obj(), name, value)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3029
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3030
            super(_FeatureDataProxy, self).__setattr__(name, value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3031
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3032
    def __delattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3033
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3034
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3035
        if name in Feature.PROPERTIES:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3036
            return delattr(self.get_proxied_obj(), name)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3037
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3038
            return super(_FeatureDataProxy, self).__delattr__(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3039
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3040
    def _add_data(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3041
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3042
        Add a data value or a list of data values.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3043
        @param data: A Data object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3044
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3045
        if isinstance(data, list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3046
            for d in data: self._add_data(d)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3047
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3048
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3049
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3050
            self.datas[data.attr].append(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3051
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3052
            """ Create a list object for missing attribute """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3053
            self.datas[data.attr] = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3054
            self.datas[data.attr].append(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3055
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3056
    def _get_data(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3057
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3058
        Get the data value. in sequence setting cases returns an array of data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3059
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3060
        dataattr = attr or self.defaultkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3061
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3062
            if len(self.datas[dataattr]) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3063
                return self.datas[dataattr][-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3064
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3065
                return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3066
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3067
            """ return None for missing attribute """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3068
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3069
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3070
    def _get_datas(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3071
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3072
        Get the entire data array.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3073
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3074
        dataattr = attr or self.defaultkey
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3075
        return self.datas.get(dataattr, [])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3076
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3077
    def _set_datas(self, datas, attr=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3078
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3079
        Set the entire data array.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3080
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3081
        dataattr = attr or self.defaultkey
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3082
        self.datas[dataattr] = list(datas)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3083
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3084
    def _get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3085
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3086
        Get the topmost data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3087
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3088
        if self._get_data(attr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3089
            return self._get_data(attr).get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3090
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3091
            return None
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3092
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3093
    def _set_value(self, datavalue, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3094
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3095
        Set the value for the feature the last configuration in the current hierarchy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3096
        @param value: The value for the feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3097
        @return: The created Data object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3098
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3099
        # Make sure that data value exists only once the the last configuration layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3100
        # So if last_data exists on last layer, update the value of that data element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3101
        # otherwise create a new data elem to the topmost layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3102
        dataobj = self._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3103
        last_config = self.get_root_configuration().get_last_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3104
        if dataobj and dataobj.find_parent(type=Configuration) == last_config:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3105
            dataobj.set_value(datavalue)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3106
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3107
            dataobj = Data(fqr=self.fqr, value=datavalue, attr=attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3108
            last_config.add_data(dataobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3109
            self._add_data(dataobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3110
        return dataobj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3111
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3112
    def _del_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3113
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3114
        Remove the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3115
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3116
        data = self._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3117
        if data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3118
            dataattr = attr or self.defaultkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3119
            parentconfig = data.find_parent(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3120
            if parentconfig:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3121
                parentconfig.remove_data(data.get_fullfqr())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3122
            del self.datas[dataattr][-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3123
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3124
    def _get_values(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3125
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3126
        Get the topmost data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3127
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3128
        dataattr = attr or self.defaultkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3129
        return [dataelem.get_value() for dataelem in self.datas[dataattr]]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3130
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3131
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3132
class DataBase(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3133
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3134
        super(DataBase, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3135
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3136
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3137
        if isinstance(obj, (DataContainer, DataBase)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3138
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3139
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3140
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3141
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3142
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3143
        return Data(ref=name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3144
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3145
    def count(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3146
        return len(self._objects())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3147
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3148
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3149
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3150
        A generic add function to add child objects. The function is intended to act as
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3151
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3152
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3153
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3154
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3155
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3156
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3157
        if isinstance(child, (Data)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3158
                self._add(child, container.APPEND)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3159
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3160
            raise exceptions.IncorrectClassError("Cannot add %s object to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3161
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3162
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3163
class DataContainer(DataBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3164
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3165
        super(DataContainer, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3166
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3167
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3168
class Data(DataBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3169
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3170
    The data element can contain any data setting for a feature. The data element can be 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3171
    a value definition for any type of data. It basically just links some data to a feature. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3172
    The default Data attribute is 'data', but it can be any string. For example current use case 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3173
    is 'rfs'.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3174
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3175
    def __init__(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3176
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3177
        @param ref: the reference to the feature. E.g. foo
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3178
        @param fqr: the full reference to the feature. E.g. 'foo.bar' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3179
        @param value: the value of the data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3180
        @param attr: the attribute which the Data object defines. e.g. default is 'data'. But could be 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3181
        for example 'rfs'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3182
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3183
        name = kwargs.get('ref', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3184
        self.fearef = kwargs.get('fqr', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3185
        if self.fearef:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3186
            (namespace, name) = utils.dottedref.psplit_ref(self.fearef)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3187
        super(Data, self).__init__(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3188
        self.value  = kwargs.get('value', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3189
        self.attr   = kwargs.get('attr') or 'data'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3190
        self.policy = kwargs.get('policy', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3191
        self.template = kwargs.get('template', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3192
        self.map    = kwargs.get('map')
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3193
        self.empty  = kwargs.get('empty', False)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3194
        self.lineno = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3195
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3196
    def __setstate__(self, state):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3197
        super(Data, self).__setstate__(state)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3198
        self.value = state.get('value', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3199
        self.attr = state.get('attr', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3200
        self.policy = state.get('policy', '')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3201
        self.map = state.get('map', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3202
        self.template = state.get('template', False)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3203
        self.lineno = state.get('lineno', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3204
        self.fearef = state.get('fearef', None)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3205
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3206
    def get_fearef(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3207
        if self.fearef:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3208
            return self.fearef
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3209
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3210
            return self.fqr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3211
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3212
    def get_value(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3213
        return self.value
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3214
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3215
    def get_map(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3216
        return self.map
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3217
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3218
    def set_map(self, map):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3219
        self.map = map
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3220
        if self.value:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3221
            #Either value or mapping can be defined. Not both.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3222
            self.value = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3223
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3224
    def set_value(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3225
        self.value = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3226
        if self.map:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3227
            #Either value or mapping can be defined. Not both.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3228
            self.map = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3229
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3230
    def get_policy(self): return self._policy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3231
    def set_policy(self, value): self._policy = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3232
    def del_policy(self):  self._policy = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3233
    policy = property(get_policy, set_policy, del_policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3234
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3235
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3236
class ValueSet(set):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3237
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3238
    A value set object to indicate a set of possible values for a feature. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3239
    e.g. A boolean feature ValueSet([True, False])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3240
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3241
    def __init__(self, initial_set=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3242
        super(ValueSet, self).__init__(initial_set or [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3243
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3244
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3245
class ValueRange(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3246
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3247
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3248
    def __init__(self, fromvalue, tovalue, step=1):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3249
        self.fromvalue = fromvalue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3250
        self.tovalue = tovalue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3251
        self.step = step
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3252
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3253
    def __contains__(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3254
        return self.fromvalue <= value and value <= self.tovalue and (value-self.fromvalue) % self.step == 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3255
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3256
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3257
class ValueRe(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3258
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3259
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3260
    def __init__(self, regexp):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3261
        self.regexp = re.compile(regexp)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3262
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3263
    def __contains__(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3264
        if isinstance(value, str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3265
            return self.regexp.match(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3266
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3267
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3268
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3269
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3270
class Property(Base):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3271
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3272
    Confml property class
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3273
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3274
    def __init__(self, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3275
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3276
        @param name=str: name string (mandatory)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3277
        @param value=str: value for the property, string 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3278
        @param unit=str: unit of the property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3279
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3280
        if kwargs.get('name',None) == None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3281
            raise ValueError("Property name cannot be None!")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3282
        super(Property,self).__init__(Property.to_propertyref(kwargs.get('name',None)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3283
        self.name = kwargs.get('name',None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3284
        self.value = kwargs.get('value',None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3285
        self.unit = kwargs.get('unit',None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3286
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3287
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3288
    def to_propertyref(cls, name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3289
        """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3290
        @param name: name of the property 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3291
        @return: A property reference.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3292
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3293
        if name is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3294
            return "property_%s" % name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3295
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3296
            raise ValueError("Property name cannot be None!")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3297
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3298
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3299
    def to_normref(cls, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3300
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3301
        @param ref: a property reference 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3302
        @return: normalized property reference
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3303
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3304
        return ref[9:]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3305
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3306
    def get_name(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3307
        return self.name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3308
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3309
    def get_value(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3310
        return self.value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3311
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3312
    def get_unit(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3313
        return self.unit
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3314
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3315
class Option(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3316
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3317
    Confml option class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3318
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3319
    def __init__(self, name, value, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3320
        super(Option, self).__init__(Option.to_optref(value, kwargs.get('map', None)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3321
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3322
        self.value = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3323
        self.map = kwargs.get('map', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3324
        self.relevant = kwargs.get('relevant', None)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3325
        self.map_value = kwargs.get('map_value', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3326
        self.display_name = kwargs.get('display_name', None)
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3327
        self.extensionAttributes = []
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3328
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3329
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3330
    def to_optref(cls, value, map):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3331
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3332
        @return: An option reference converted from value or map, depending
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3333
            on which one is not None.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3334
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3335
        if value is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3336
            return "opt_value_%s" % value.replace('.', '').replace('/', '').replace(' ', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3337
        elif map is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3338
            return "opt_map_%s" % map.replace('.', '').replace('/', '').replace(' ', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3339
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3340
            raise ValueError("Both value and map are None!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3341
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3342
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3343
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3344
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3345
    def get_value(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3346
        return self.value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3347
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3348
    def __cmp__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3349
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3350
            ref = getattr(other, 'ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3351
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3352
            ref = other
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3353
        if self.ref < ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3354
            return -1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3355
        elif self.ref == ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3356
            return 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3357
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3358
            return 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3359
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3360
    def set_extension_attributes(self, attributes):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3361
        self.extensionAttributes = attributes
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3362
        
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3363
    def get_extension_attributes(self):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3364
        return self.extensionAttributes
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3365
    
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3366
    def add_extension_attribute(self, attribute):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  3367
        self.extensionAttributes.append(attribute)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3368
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3369
class Storage(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3370
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3371
    A general base class for all storage type classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3372
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3373
    """ File open modes """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3374
    MODE_UNKNOWN= -1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3375
    MODE_READ   = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3376
    MODE_WRITE  = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3377
    MODE_APPEND = 3
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3378
    MODE_DELETE = 4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3379
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3380
    def __init__(self, path, mode=''):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3381
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3382
        @param path: the reference to the root of the storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3383
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3384
        self.rootpath = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3385
        self.curpath = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3386
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3387
        self.__opened_res__ = {}
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3388
        self.mode = mode
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3389
        self.cpath_stack = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3390
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3391
    def __opened__(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3392
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3393
        Internal function to add a newly opened Resource object to the list of open resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3394
        @param res: The resource object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3395
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3396
        if self.__opened_res__.has_key(res.path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3397
            self.__opened_res__[res.path].append(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3398
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3399
            self.__opened_res__[res.path] = [res]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3400
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3401
    def __closed__(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3402
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3403
        Internal function to remove a Resource object from the list of open resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3404
        @param res: The resource object to remove
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3405
        @raise StorageException if the given resource object is not found: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3406
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3407
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3408
            self.__opened_res__[res.path].remove(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3409
            if len(self.__opened_res__[res.path]) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3410
                del self.__opened_res__[res.path]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3411
        except KeyError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3412
            raise exceptions.StorageException("No such %s open resource! %s" % (res, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3413
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3414
    def __has_open__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3415
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3416
        Internal function to find out if any Resource objects are open from given ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3417
        @param ref: The resource ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3418
        @return: True if resources found. Otherwise False.   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3419
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3420
        return self.__opened_res__.has_key(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3421
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3422
    def __get_open__(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3423
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3424
        Internal function to get all resource opened on a certain ref .
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3425
        @param ref: The resource ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3426
        @return: A list of open resources. Empty list if nothing is found   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3427
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3428
        if self.__has_open__(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3429
            # return a copy of currently open resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3430
            return self.__opened_res__[path][:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3431
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3432
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3433
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3434
    def __has_resource__(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3435
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3436
        Internal function to find out if the given Resource objects is open in this storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3437
        @param ref: The resource object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3438
        @return: True if resources found. Otherwise False.   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3439
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3440
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3441
            res = self.__opened_res__[res.path].index(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3442
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3443
        except KeyError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3444
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3445
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3446
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3447
    def open(cls,path, mode="r", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3448
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3449
        Class method for opening an instance of Storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3450
        @param path: path to storage, which will determine what type of storage is initiated. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3451
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3452
        # import all storage instances
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3453
        from cone.storage import storages
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3454
        for storagename in storages:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3455
            storagemodule = 'cone.storage.'+storagename
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3456
            module = __import__(storagemodule)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3457
        for storage_class in utils.all_subclasses(Storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3458
            if storage_class.supported_storage(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3459
                if hasattr(storage_class, '__open__'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3460
                    return storage_class.__open__(path, mode, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3461
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3462
                    return storage_class(path, mode, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3463
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3464
        obj = Storage(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3465
        return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3466
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3467
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3468
    def supported_storage(cls, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3469
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3470
        Class method for determing if the given clas supports a storage by given path. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3471
        E.g. foo.zip, foo.cpd, foo/bar, http://foo.com/
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3472
        @param path:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3473
        @return: Boolean value. True if the storage of the path is supported. False if not.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3474
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3475
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3476
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3477
    def set_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3478
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3479
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3480
        self.rootpath = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3481
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3482
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3483
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3484
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3485
        return self.rootpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3486
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3487
    def push(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3488
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3489
        Set the current path under the Storage to the given path and push the possible existing path to a stack. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3490
        The current path can be reverted with pop method.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3491
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3492
        @return: None 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3493
        @param path: The path which is set as current path.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3494
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3495
        self.cpath_stack.append(self.curpath)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3496
        self.curpath = path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3497
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3498
    def pop(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3499
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3500
        Pop a path from path stack and set the current path to the popped element. The path can be pushed to the 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3501
        current path stack with push. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3502
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3503
        NOTE! if the pop is called when the current path stack is empty, the path will just remain is empty path 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3504
        keeping the active path in the storages root path. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3505
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3506
        @return: The new path.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3507
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3508
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3509
            path = self.cpath_stack.pop()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3510
            self.curpath = path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3511
        except IndexError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3512
            pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3513
        return self.curpath
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3514
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3515
    def set_current_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3516
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3517
        @param path: the current path under the Storage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3518
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3519
        self.curpath = utils.resourceref.remove_end_slash(utils.resourceref.remove_begin_slash(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3520
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3521
    def get_current_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3522
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3523
        get the current path under the Storage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3524
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3525
        return self.curpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3526
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3527
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3528
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3529
        Close the repository, which will save and close all open resources.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3530
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3531
        for openref in self.__opened_res__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3532
            for res in self.__get_open__(openref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3533
                self.close_resource(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3534
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3535
    def save(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3536
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3537
        Flush changes from all resources to the repository.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3538
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3539
        for openref in self.__opened_res__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3540
            for res in self.__get_open__(openref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3541
                self.save_resource(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3542
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3543
    def open_resource(self, path, mode="r"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3544
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3545
        Open the given resource and return a File object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3546
        @param path : reference to the resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3547
        @param mode : the mode in which to open. Can be one of r = read, w = write, a = append.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3548
        raises a NotResource exception if the ref item is not a resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3549
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3550
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3551
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3552
    def delete_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3553
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3554
        Delete the given resource from storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3555
        @param path: reference to the resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3556
        raises a NotSupportedException exception if delete operation is not supported by the storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3557
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3558
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3559
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3560
    def close_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3561
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3562
        Close a given resource instance. Normally this is called by the Resource object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3563
        in its own close.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3564
        @param path the reference to the resource to close. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3565
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3566
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3567
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3568
    def is_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3569
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3570
        Return true if the ref is a resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3571
        @param ref : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3572
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3573
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3574
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3575
    def list_resources(self, path, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3576
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3577
        find the resources under certain ref/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3578
        @param ref : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3579
        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3580
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3581
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3582
        return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3583
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3584
    def import_resources(self, paths, storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3585
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3586
        import resources from a list of resources to this storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3587
        @param paths : a list of Resourse objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3588
        @param storage : the external storage from which files are imported.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3589
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3590
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3591
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3592
    def export_resources(self, paths, storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3593
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3594
        export resources from this storage based on a list of reference to this storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3595
        @param path : a list of resource paths in this storage (references).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3596
        @param storage : the external storage where to export.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3597
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3598
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3599
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3600
    def save_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3601
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3602
        Flush the changes of a given resource instance. Normally this is called by the Resource object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3603
        in its own save.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3604
        @param ref the reference to the resource to close. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3605
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3606
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3607
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3608
    def create_folder(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3609
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3610
        Create a folder entry to a path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3611
        @param path : path to the folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3612
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3613
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3614
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3615
    def delete_folder(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3616
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3617
        Delete a folder entry from a path. The path must be empty.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3618
        @param path : path to the folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3619
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3620
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3621
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3622
    def is_folder(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3623
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3624
        Check if the given path is an existing folder in the storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3625
        @param path : path to the folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3626
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3627
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3628
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3629
    def get_mode(self, mode_str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3630
        if mode_str.find("w") != -1: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3631
            return self.MODE_WRITE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3632
        elif mode_str.find("r") != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3633
            return self.MODE_READ
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3634
        elif mode_str.find("a") != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3635
            return self.MODE_APPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3636
        elif mode_str.find("d") != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3637
            return self.MODE_DELETE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3638
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3639
            return self.MODE_UNKNOWN
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3640
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3641
    def unload(self, path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3642
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3643
        Dump a given object to the storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3644
        @param object: The object to dump to the storage, which is expected to be an instance 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3645
        of Base class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3646
        @param path: The reference where to store the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3647
        @param object: The object instance to dump 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3648
        @raise StorageException: if the given object cannot be dumped to this storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3649
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3650
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3651
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3652
    def load(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3653
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3654
        Load an object from a reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3655
        @param path: The reference where to load the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3656
        @raise StorageException: if the given object cannot be loaded as an object from this storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3657
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3658
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3659
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3660
    path = property(get_path, set_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3661
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3662
class Resource(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3663
    STATE_OPEN = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3664
    STATE_CLOSE = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3665
    def __init__(self, storage, path, mode=Storage.MODE_READ):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3666
        self.storage = storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3667
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3668
        self.mode = mode
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3669
        self.state = Resource.STATE_OPEN
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3670
        self.content_info = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3671
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3672
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3673
        return self.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3674
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3675
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3676
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3677
        Close the resource. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3678
        Note1: the resource object cannot be accessed anymore after it has been closed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3679
        Note2: the changes are not automatically saved. The save operation must be explicitly called, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3680
        to save data. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3681
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3682
        self.storage.close_resource(self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3683
        self.state = Resource.STATE_OPEN
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3684
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3685
    def read(self, bytes=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3686
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3687
        Read data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3688
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3689
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3690
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3691
    def write(self, string):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3692
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3693
        Write data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3694
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3695
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3696
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3697
    def truncate(self, size=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3698
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3699
        Trunkate this resource data to the given size.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3700
        @param size: The size to trunkate. Default value is zero, which make the resource empty. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3701
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3702
        raise exceptions.NotSupportedException()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3703
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3704
    def save(self, size=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3705
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3706
        Save all changes to data to storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3707
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3708
        raise exceptions.NotSupportedException()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3709
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3710
    def get_mode(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3711
        return self.storage.get_mode(self.mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3712
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3713
    def get_size(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3714
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3715
        Return the size of this resource in bytes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3716
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3717
        Note that this does not work in write mode.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3718
        @return: The resource size in bytes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3719
        @raise exceptions.StorageException: The resource was opened in write mode.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3720
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3721
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3722
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3723
    def get_content_info(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3724
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3725
        Return the ContentInfo class that contains content information about
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3726
        resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3727
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3728
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3729
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3730
class ContentInfo(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3731
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3732
    A ContentInfo object is used to describe content of Resource. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3733
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3734
    logger = logging.getLogger('cone.contentinfo')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3735
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3736
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3737
    def __init__(self, mimetype, mimesubtype):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3738
        #: MIME Media type (http://www.iana.org/assignments/media-types/)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3739
        #: as a string. E.g. 'image' or 'application'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3740
        self.mimetype = mimetype
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3741
        #: MIME Media subtype as a string. E.g. 'svg+xml' or 'bmp'.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3742
        self.mimesubtype = mimesubtype
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3743
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3744
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3745
    def content_type(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3746
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3747
        Returns MIME Media type (http://www.iana.org/assignments/media-types/) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3748
        and subtype as a string. E.g. 'image/bmp'. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3749
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3750
        return self.mimetype + '/' + self.mimesubtype
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3751
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3752
class ImageContentInfo(ContentInfo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3753
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3754
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3755
    A ImageContentInfo object is used to describe content of image Resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3756
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3757
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3758
        ContentInfo.__init__(self, 'image', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3759
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3760
class BmpImageContentInfo(ImageContentInfo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3761
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3762
    A BmpImageContentInfo object is used to describe content of bmp image 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3763
    Resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3764
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3765
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3766
    _BMP_BITS_PER_PIXEL_OFFSET_ = int('0x1C', 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3767
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3768
    def __init__(self, resource, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3769
        ContentInfo.__init__(self, 'image', 'bmp')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3770
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3771
        #: Color depth as bits per pixel.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3772
        self.color_depth = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3773
        if (resource != None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3774
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3775
                self.color_depth = ord(data[self._BMP_BITS_PER_PIXEL_OFFSET_])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3776
            except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3777
                self.logger.warning("Invalid BMP-file: %s" % resource.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3778
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3779
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3780
class currentdir(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3781
    def __init__(self, storage, curdir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3782
        self.storage = storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3783
        # make sure that the curdir does not contain path prefix
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3784
        self.curdir = curdir.lstrip('/')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3785
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3786
    def __enter__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3787
        self.storage.push(self.curdir)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3788
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3789
    def __exit__(self, type, value, tb):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3790
        self.storage.pop()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3791
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3792
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3793
class Folder(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3794
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3795
    A Folder object is a subfolder of a Storage, offering access to part of the Storages resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3796
    """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3797
    def __init__(self, storage, path, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3798
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3799
        Create a layer folder to the storage if it does not exist.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3800
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3801
        self.curpath = path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3802
        self.storage = storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3803
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3804
    def set_path(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3805
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3806
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3807
        self.curpath = path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3808
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3809
    def get_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3810
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3811
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3812
        return self.curpath
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3813
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3814
    def set_current_path(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3815
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3816
        @param path: the current path under the Storage. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3817
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3818
        self.curpath = utils.resourceref.remove_end_slash(utils.resourceref.remove_begin_slash(path))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3819
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3820
    def get_current_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3821
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3822
        get the current path under the Storage. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3823
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3824
        return self.curpath
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3825
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3826
    def close(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3827
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3828
        Close the repository, which will save and close all open resources.  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3829
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3830
        self.storage.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3831
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3832
    def save(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3833
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3834
        Flush changes from all resources to the repository.  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3835
        """        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3836
        return self.storage.save()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3837
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3838
    def open_resource(self, path, mode="r"):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3839
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3840
        Open the given resource and return a File object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3841
        @param path : reference to the resource 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3842
        @param mode : the mode in which to open. Can be one of r = read, w = write, a = append.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3843
        raises a NotResource exception if the ref item is not a resource.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3844
        """  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3845
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3846
            res = self.storage.open_resource(path, mode)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3847
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3848
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3849
    def delete_resource(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3850
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3851
        Delete the given resource from storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3852
        @param path: reference to the resource 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3853
        raises a NotSupportedException exception if delete operation is not supported by the storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3854
        """  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3855
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3856
            res = self.storage.delete_resource(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3857
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3858
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3859
    def close_resource(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3860
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3861
        Close a given resource instance. Normally this is called by the Resource object 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3862
        in its own close.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3863
        @param path the reference to the resource to close. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3864
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3865
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3866
            res = self.storage.close_resource(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3867
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3868
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3869
    def is_resource(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3870
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3871
        Return true if the ref is a resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3872
        @param ref : reference to path where resources are searched
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3873
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3874
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3875
            res = self.storage.is_resource(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3876
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3877
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3878
    def list_resources(self, path, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3879
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3880
        find the resources under certain ref/path 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3881
        @param ref : reference to path where resources are searched
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3882
        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3883
        Default value is False. Set to True to enable recursion.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3884
        """  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3885
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3886
            res = self.storage.list_resources(path, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3887
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3888
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3889
    def import_resources(self, paths, storage):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3890
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3891
        import resources from a list of resources to this storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3892
        @param paths : a list of Resourse objects.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3893
        @param storage : the external storage from which files are imported.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3894
        """  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3895
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3896
            res = self.storage.import_resources(paths, storage)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3897
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3898
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3899
    def export_resources(self, paths, storage):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3900
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3901
        export resources from this storage based on a list of reference to this storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3902
        @param path : a list of resource paths in this storage (references).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3903
        @param storage : the external storage where to export.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3904
        """  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3905
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3906
            res = self.storage.export_resources(paths, storage)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3907
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3908
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3909
    def save_resource(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3910
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3911
        Flush the changes of a given resource instance. Normally this is called by the Resource object 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3912
        in its own save.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3913
        @param ref the reference to the resource to close. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3914
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3915
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3916
            res = self.storage.save_resource(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3917
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3918
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3919
    def create_folder(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3920
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3921
        Create a folder entry to a path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3922
        @param path : path to the folder
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3923
        """  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3924
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3925
            res = self.storage.create_folder(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3926
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3927
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3928
    def delete_folder(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3929
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3930
        Delete a folder entry from a path. The path must be empty.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3931
        @param path : path to the folder
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3932
        """  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3933
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3934
            res = self.storage.delete_folder(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3935
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3936
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3937
    def is_folder(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3938
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3939
        Check if the given path is an existing folder in the storage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3940
        @param path : path to the folder
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3941
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3942
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3943
            res = self.storage.is_folder(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3944
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3945
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3946
    def get_mode(self, mode_str):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3947
        return self.storage.get_mode()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3948
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3949
    def unload(self, path, object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3950
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3951
        Dump a given object to the storage 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3952
        @param object: The object to dump to the storage, which is expected to be an instance 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3953
        of Base class.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3954
        @param path: The reference where to store the object 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3955
        @param object: The object instance to dump 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3956
        @raise StorageException: if the given object cannot be dumped to this storage 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3957
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3958
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3959
            res = self.storage.unload(path, object)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3960
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3961
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3962
    def load(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3963
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3964
        Load an object from a reference.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3965
        @param path: The reference where to load the object 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3966
        @raise StorageException: if the given object cannot be loaded as an object from this storage 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3967
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3968
        with currentdir(self.storage, self.curpath):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3969
            res = self.storage.load(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3970
            return res
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3971
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3972
    path = property(get_path, set_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3973
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3974
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3975
class CompositeLayer(Folder):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3976
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3977
    A base class for composite Configuration objects.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3978
    """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3979
    def __init__(self, storage, path="", **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  3980
        super(CompositeLayer, self).__init__(storage, path, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3981
        self.layers = kwargs.get('layers', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3982
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3983
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3984
    def add_layer(self, layer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3985
        self.layers.append(layer)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3986
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3987
    def remove_layer(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3988
        if self.get_layer(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3989
            self.layers.remove(self.get_layer(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3990
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3991
            raise exceptions.NotFound('Layer with given path %s not found!' % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3992
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3993
    def get_layer(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3994
        for layer in self.layers:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3995
            if layer.get_current_path() == path:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3996
                return layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3997
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3998
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3999
    def list_layers(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4000
        return [layer.get_current_path() for layer in self.layers]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4001
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4002
    def list_confml(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4003
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4004
        @return: array of confml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4005
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4006
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4007
        for layerpath in self.list_layers():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4008
            for respath in self.get_layer(layerpath).list_confml():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4009
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4010
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4011
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4012
    def list_implml(self,empty_folders=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4013
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4014
        @return: array of implml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4015
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4016
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4017
        for layerpath in self.list_layers():
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4018
            for respath in self.get_layer(layerpath).list_implml(empty_folders):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4019
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4020
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4021
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4022
    def list_content(self,empty_folders=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4023
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4024
        @return: array of content file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4025
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4026
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4027
        for layerpath in self.list_layers():
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4028
            for respath in self.get_layer(layerpath).list_content(empty_folders):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4029
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4030
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4031
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4032
    def list_doc(self,empty_folders=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4033
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4034
        @return: array of document file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4035
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4036
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4037
        for layerpath in self.list_layers():
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4038
            for respath in self.get_layer(layerpath).list_doc(empty_folders):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4039
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4040
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4041
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4042
    def list_all_resources(self, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4043
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4044
        Returns a list of all layer related resource paths with full path in the storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4045
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4046
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4047
        for layerpath in self.list_layers():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4048
            sublayer = self.get_layer(layerpath)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4049
            for respath in sublayer.list_all_resources(**kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4050
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4051
        return lres
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4052
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4053
    def list_all_related(self, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4054
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4055
        Returns a list of all (non confml) layer related resource paths with full path in the storage.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4056
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4057
        lres = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4058
        for layerpath in self.list_layers():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4059
            sublayer = self.get_layer(layerpath)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4060
            for respath in sublayer.list_all_related(**kwargs):                
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4061
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4062
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4063
        return lres
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4064
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4065
class Layer(CompositeLayer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4066
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4067
    A Layer object is a subfolder of a Storage, offering access to part of the Storages resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4068
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4069
    def __init__(self, storage, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4070
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4071
        Create a layer folder to the storage if it does not exist.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4072
        @param storage: a reference to the Storage object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4073
        @param path: path for the layer 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4074
        @param confml_path: optional parameter for confml files path (give in confml_path="something") 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4075
        @param imlpml_path: optional parameter for implml files path (give in implml_path="something")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4076
        @param content_path: optional parameter for content files path (give in content_path="something")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4077
        @param doc_path: optional parameter for doc files path (give in doc_path="something")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4078
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4079
        super(Layer, self).__init__(storage, path, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4080
        #if not storage.is_folder(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4081
        #    storage.create_folder(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4082
        self.predefined = {'confml_path' : 'confml', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4083
                           'implml_path' : 'implml', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4084
                           'content_path' : 'content', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4085
                           'doc_path' : 'doc'}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4086
        # list through all "hardcoded" paths and check whether the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4087
        # hardcoded or given path exists under this Layer. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4088
        # if it does then create a folder instance to that path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4089
        for (pretag, prevalue) in self.predefined.items():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4090
            self.predefined[pretag] = kwargs.get(pretag, prevalue)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4091
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4092
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4093
        return getattr(self.storage, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4094
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4095
    def __getstate__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4096
        state = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4097
        state['predefined'] = self.predefined
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4098
        state['path'] = self.path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4099
        state['layers'] = self.layers
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4100
        return state
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4101
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4102
    def __setstate__(self, state):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4103
        state = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4104
        self.predefined = state.get('predefined',{})
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4105
        self.path = state.get('path','')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4106
        self.layers = state.get('layers',[])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4107
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4108
        return state
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4109
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4110
    def list_confml(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4111
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4112
        @return: array of confml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4113
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4114
        res = self.list_resources(self.predefined['confml_path'], recurse=True)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4115
        res += super(Layer, self).list_confml()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4116
        return res 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4117
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4118
    def list_implml(self,empty_folders=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4119
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4120
        @return: array of implml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4121
        """
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4122
        res = self.list_resources(self.predefined['implml_path'], recurse=True,empty_folders=empty_folders)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4123
        res += super(Layer, self).list_implml(empty_folders)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4124
        return res 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4125
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4126
    def list_content(self,empty_folders=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4127
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4128
        @return: array of content file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4129
        """
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4130
        res = self.list_resources(self.predefined['content_path'], recurse=True,empty_folders=empty_folders)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4131
        res += super(Layer, self).list_content(empty_folders)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4132
        return res
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4133
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4134
    def list_doc(self,empty_folders=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4135
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4136
        @return: array of document file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4137
        """
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4138
        res = self.list_resources(self.predefined['doc_path'], recurse=True,empty_folders=empty_folders)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4139
        res += super(Layer, self).list_doc(empty_folders)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4140
        return res
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4141
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4142
    def confml_folder(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4143
        cpath = self.get_current_path()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4144
        spath = self.predefined['confml_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4145
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4146
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4147
    def implml_folder(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4148
        cpath = self.get_current_path()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4149
        spath = self.predefined['implml_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4150
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4151
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4152
    def content_folder(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4153
        cpath = self.get_current_path()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4154
        spath = self.predefined['content_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4155
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4156
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4157
    def doc_folder(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4158
        cpath = self.get_current_path()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4159
        spath = self.predefined['doc_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4160
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4161
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4162
    def list_all_resources(self, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4163
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4164
        Returns a list of all layer related resource paths with full path in the storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4165
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4166
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4167
        for folderpath in sorted(self.predefined.values()):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4168
            lres += self.list_resources(folderpath, recurse=True)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4169
                 
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4170
        lres += super(Layer, self).list_all_resources()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4171
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4172
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4173
    def list_all_related(self, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4174
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4175
        Returns a list of all (non confml) layer related resource paths with full path in the storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4176
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4177
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4178
        lres = []
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4179
        exclude_filters = kwargs.get('exclude_filters', {})
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4180
        kwargs['recurse'] = True
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4181
        predef = self.predefined.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4182
        del predef['confml_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4183
        for folderpath in sorted(predef.values()):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4184
            filter = exclude_filters.get(folderpath, None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4185
            resources = self.list_resources(folderpath, **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4186
            if filter:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4187
                lres += [res for res in resources if not re.search(filter, res, re.IGNORECASE)]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4188
            else:            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4189
                lres += resources
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4190
        lres += super(Layer, self).list_all_related(**kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4191
       
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4192
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4193
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4194
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4195
class Include(Base, container.LoadLink):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4196
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4197
    A common include element that automatically loads a resource 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4198
    and its object under this include element.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4199
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4200
    def __init__(self, ref="", **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4201
        path = kwargs.get('path') or ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4202
        store_interface = kwargs.get('store_interface',None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4203
        ref = utils.resourceref.to_objref(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4204
        container.LoadLink.__init__(self, path, store_interface)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4205
        Base.__init__(self, ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4206
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4207
    def get_store_interface(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4208
        if not self._storeint and self._parent:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4209
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4210
                self._storeint = self._parent.get_store_interface()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4211
            except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4212
                # If project is not found, let the store interface be None 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4213
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4214
        return self._storeint
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4215
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4216
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4217
class Rule(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4218
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4219
    Base class for Rules in the system.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4220
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4221
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4222
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4223
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4224
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4225
class FactoryBase(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4226
    pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4227
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4228
class Factory(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4229
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4230
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4231
        The Factory getattr find all subclasses for the Factory and searches for given attr 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4232
        in those.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4233
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4234
        for sub_factory in utils.all_subclasses(FactoryBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4235
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4236
                return getattr(sub_factory(), name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4237
            except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4238
                continue 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4239
        raise AttributeError("type object %s has no attribute '%s'" % (self.__class__, name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4240
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4241
def get_mapper(modelname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4242
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4243
    Return a instance of appropriate mapper for given model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4244
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4245
    mapmodule = __import__('cone.public.mapping')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4246
    return mapmodule.public.mapping.BaseMapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4247
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4248
class RulemlEvalGlobals(Base):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4249
    """
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4250
    Ruleml subelement of extensions element
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4251
    """
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4252
    refname = "_extension"
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4253
    def __init__(self, value = None, file = None, **kwargs):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4254
        """
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4255
        """
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4256
        super(RulemlEvalGlobals,self).__init__(self.refname)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4257
        self.value = value
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4258
        self.file = file
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4259
    
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4260
    @classmethod
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4261
    def get_script_file_full_path(self, child): 
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4262
        parent_config = child._find_parent(type=Configuration)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4263
        cpath = parent_config.get_full_path()
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4264
        cpath = utils.resourceref.psplit_ref(cpath)[0]
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4265
        path = utils.resourceref.join_refs([cpath, child.file])
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 4
diff changeset
  4266
        return path
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4267
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4268
class Problem(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4269
    SEVERITY_ERROR      = "error"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4270
    SEVERITY_WARNING    = "warning"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4271
    SEVERITY_INFO       = "info"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4272
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4273
    def __init__(self, msg, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4274
        self.msg = msg
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4275
        self.type = kwargs.get('type', '')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4276
        self.line = kwargs.get('line', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4277
        self.file = kwargs.get('file', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4278
        self.severity = kwargs.get('severity', self.SEVERITY_ERROR)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4279
        self.traceback = kwargs.get('traceback', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4280
        # A slot for any problem specific data 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4281
        self.problem_data = kwargs.get('problem_data', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4282
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4283
    def log(self, logger, current_file=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4284
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4285
        Log this problem with the given logger.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4286
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4287
        file = self.file or current_file
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4288
        if self.line is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4289
            msg = "(%s) %s" % (file, self.msg)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4290
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4291
            msg = "(%s:%d) %s" % (file, self.line, self.msg)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4292
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4293
        mapping = {self.SEVERITY_ERROR:   logging.ERROR,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4294
                   self.SEVERITY_WARNING: logging.WARNING,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4295
                   self.SEVERITY_INFO:    logging.INFO}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4296
        level = mapping.get(self.severity, logging.ERROR)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4297
        logger.log(level, msg)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4298
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4299
        if self.traceback:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4300
            logger.debug(self.traceback)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4301
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4302
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4303
    def from_exception(cls, ex):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4304
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4305
        Create a Problem object from an exception instance.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4306
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4307
        If the exception is a sub-class of ConeException, then it may contain
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4308
        extra information (like a line number) for the problem.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4309
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4310
        if isinstance(ex, exceptions.ConeException):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4311
            return Problem(msg      = ex.problem_msg or unicode(ex),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4312
                           type     = ex.problem_type or '',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4313
                           line     = ex.problem_lineno,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4314
                           severity = cls.SEVERITY_ERROR)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4315
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4316
            return Problem(msg      = unicode(ex),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4317
                           severity = cls.SEVERITY_ERROR)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4318
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4319
    def __repr__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4320
        var_data = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4321
        for varname in ('msg', 'type', 'line', 'file', 'severity'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4322
            var_data.append("%s=%r" % (varname, getattr(self, varname)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4323
        return "%s(%s)" % (self.__class__.__name__, ', '.join(var_data))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4324
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4325
    def __eq__(self, other):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4326
        if not isinstance(other, Problem):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4327
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4328
        for varname in ('msg', 'type', 'line', 'file', 'severity'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4329
            self_val = getattr(self, varname)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4330
            other_val = getattr(other, varname)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4331
            if self_val != other_val:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4332
                return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4333
        return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4334
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4335
    def __ne__(self, other):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4336
        return self == other
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4337
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4338
    def __lt__(self, other):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4339
        if not isinstance(other, Problem):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4340
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4341
        return (self.file, self.line) < (other.file, other.line)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4342
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4343
def make_content_info(resource, data):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4344
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4345
    Factory for ContentInfo
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4346
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4347
    cnt_inf = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4348
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4349
    if resource != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4350
        guessed_type = mimetypes.guess_type(resource.get_path())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4351
        mimetype = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4352
        mimesubtype = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4353
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4354
        if guessed_type != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4355
            mimetype, mimesubtype = guessed_type[0].split('/') 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4356
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4357
        if mimetype == 'image' and mimesubtype == 'x-ms-bmp':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4358
            cnt_inf = BmpImageContentInfo(resource, data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4359
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4360
            cnt_inf = ContentInfo(mimetype, mimesubtype)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4361
    return cnt_inf
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4362
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4363
def open_storage(path, mode="r", **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4364
    return Storage.open(path, mode="r", **kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  4365
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4366
class NullHandler(logging.Handler):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4367
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4368
    Default handler that does not do anything.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4369
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4370
    def emit(self, record):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4371
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4372
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4373
#Initialization of default logger that contains NullHandler.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4374
logger = logging.getLogger('cone')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  4375
logger.addHandler(NullHandler())