configurationengine/source/cone/public/api.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
Cone public API.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
The core interface to the ConE functionality.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import 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
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import copy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
import sets
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import exceptions, utils, container, mapping
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
class Base(container.ObjectContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    The Base class is intended for capturing same kind of naming scheme.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
        if len(utils.dottedref.split_ref(ref)) > 1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
            raise exceptions.InvalidRef("Invalid reference for Base object %s!" % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
        container.ObjectContainer.__init__(self, ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        for arg in kwargs.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
            if kwargs.get(arg) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
                setattr(self, arg, kwargs.get(arg))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        dict = self._dict()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        return "%s(%s)" % (self.__class__.__name__, dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    def _get_mapper(self,modelname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        Return a instance of appropriate mapper for given model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        return mapping.BaseMapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    def _compare(self, other, dict_keys=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        Compare the attributes of elements 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
        if isinstance(other, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
            keys = dict_keys or self._dict().keys() 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
            for key in keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
                self_attr = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
                other_attr = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
                try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
                    self_attr = getattr(self, key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
                    other_attr = getattr(other, key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
                except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
                    # If the attribute is not found from either elements
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
                    # ignore it entirely
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
                    if self_attr == None and other_attr == None: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
                        continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
                if  self_attr != other_attr:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
                    return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
            # If all given keys match report this as as similar element
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
    def _clone(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        A generic implementation for cloning the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        Copies all (public) members in dictionary.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        To clone objects recursively set the recursion level with recursion param.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        @param recursion: Boolean to define recursion on or off
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        @param recursion_depth: positive integer to define recursion depth. default is -1 which will 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        perform recursion to all objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        dict = self._dict()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        if kwargs.get('class_instance'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
            class_instance = kwargs.get('class_instance')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
            del kwargs['class_instance']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
            class_instance = self.__class__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        obj = class_instance(**dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        # Remove all children created at the construction phase 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        # 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
    97
        obj._order = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        obj._children = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        # handle the recursion argument
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        recursion = kwargs.get('recursion', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        if recursion:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
            recursion_depth = kwargs.get('recursion_depth', -1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
            if recursion_depth < 0 or recursion_depth > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
                # decrease the recursion
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
                kwargs['recursion_depth'] = recursion_depth - 1 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
                for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
                    obj._add(child._clone(**kwargs), container.APPEND)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
    def _dict(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        Return the public variables in a dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        for key in self.__dict__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
            if key.startswith('_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
                dict[key] = self.__dict__[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        return dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        return Base(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
    def fqr(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        Return a Fully Qualified Ref, which is the full name of the reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        Joins the namespace and ref to one string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        @return: A string 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
        return utils.dottedref.join_refs([self.namespace, self.get_ref()])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
    def namespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        @return: The namespace of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        containerpath = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
        path = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        parentcontainer = self.find_parent(container=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        parent = self.find_parent(type=Base)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        paths = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
        while parent and parent != parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
            """ Skip the element if it is supposed to be hidden. Begins with _. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
            if not parent.get_ref().startswith('_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
                paths.append(parent.get_ref())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
            parent = parent._get_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        if parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
            paths.append(parentcontainer.namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        paths.reverse()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        return utils.dottedref.join_refs(paths)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
    def get_fullref(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        Return a full reference, reference including a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        possible index of the object in list. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        e.g. ref can be bar[1] or just the normal bar. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        @return: The full reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        if self.parent and utils.is_list(self.parent._get(self.ref)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
            return "%s[%s]" % (self.ref, self.get_index())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
            return self.ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
    def get_fullfqr(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        Return a full reference, reference including a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        possible index of the object in list. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        ref and adds index.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        @return: A string 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        return utils.dottedref.join_refs([self.get_fullnamespace(), self.get_fullref()])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
    def get_fullnamespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        @return: The full namespace of the object with possible indexes of the parent objects
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
        containerpath = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
        path = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
        parentcontainer = self.find_parent(container=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        parent = self.find_parent(type=Base)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        paths = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        while parent and parent != parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
            paths.append(parent.get_fullref())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
            parent = parent.parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        if parentcontainer:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
            paths.append(parentcontainer.namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        paths.reverse()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        return utils.dottedref.join_refs(paths)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
    def get_storage(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        Get the root storage from the root object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        if self._find_parent():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            return self._find_parent().get_storage()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
            raise exceptions.StorageException("Storage is not found from root!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
    def get_project(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
        Get the root project from the root object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        if isinstance(self, Project):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
                return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
        elif self._find_parent():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
            return self._find_parent().get_project()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
            raise exceptions.NotFound("Project not found!!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
    def get_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
        Get the default view from the root object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
            return self._find_parent().get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
            raise exceptions.NotFound("Default View is not found! No root configuration?")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
    def get_root(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
        Get the root object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
            return self._find_parent().get_root()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
            return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
    def get_root_configuration(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        Get the root object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        if self.find_parent(type=Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
            return self.find_parent(type=Configuration).get_root_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        elif isinstance(self, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
            return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
    def get_index(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        @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
   246
        0 for normal data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
        # 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
   249
        # Make sure that the returned element is a list with get_list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        selflist = utils.get_list(self._get_parent()._get(self.get_ref()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
        return selflist.index(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
    def find_parent(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        find the closest parent object of given type.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        e.g. find_parent(type=Configuration) returns the closest parent 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        Configuration parent instance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        @param type: class definitiob
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        type = kwargs.get('type', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        container = kwargs.get('container', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
            parent = self._find_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
            if type and isinstance(parent, type):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
                    return parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
            elif container and hasattr(parent, 'container'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
                    return parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
                return parent.find_parent(**kwargs)
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
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
        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
   276
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
        raise exceptions.NotSupportedException("Cannot add %s object to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
    def get_elem(self, fqr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
        A generic get function to get child objects and members. The function uses getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
        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
   288
        if it is found. Raises AttributeError if the child is not found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
        Example: obj.get('test.bar'), returns child obj.test.bar
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
        @param fqr: the fully qualified ref to the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        @raise AttributeError: if the given ref is not found.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
class Project(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
    A project is a container that can hold several Configuration objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
    def __init__(self, storage, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        Project constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        Base.__init__(self, "")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        """ Try to set the model and tet the actual configuration class """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
            self._model = storage.persistentmodule.MODEL
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
            self._model = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        self.set_storage(storage)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        self.update()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        self.loaded = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
    def __add_loaded__(self, ref, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        Add the object to loaded 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
        self.loaded[ref] = {'counter': 0, 'obj': obj}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
    def __get_loaded__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        Get a loaded object if it is existing and increase the reference counter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        @return: The loaded object if it exists. None if it does not. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        if self.loaded.has_key(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
            return self.loaded[ref]['obj']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
    def __loaded__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        Get a loaded object if it is existing and increase the reference counter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        @return: The loaded object if it exists. None if it does not. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        if self.loaded.has_key(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
            self.loaded[ref]['counter'] += 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
            raise exceptions.NotFound("ref %s is not found from loaded!" % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
    def __unloaded__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        returns True when the reference count is zero and object can be released.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        if self.loaded.has_key(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
            self.loaded[ref]['counter'] -= 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
            if self.loaded[ref]['counter'] == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
                del self.loaded[ref]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
                return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
            else: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
                return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        else: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        if isinstance(obj, Configuration) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        or isinstance(obj, ConfigurationProxy): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
    def update(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        update the root confml files as configurations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        root_confmls = self.get_storage().list_resources(".")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        root_confmls = utils.resourceref.filter_resources(root_confmls, "\.confml")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        for rootml in root_confmls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
            self._add(ConfigurationProxy(rootml))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
    def get_storage(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
        Get the Storage instance of this Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
        return self.storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
    def set_storage(self, storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        Set the Storage instance of this Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
        if isinstance(storage, Storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
            self.storage = storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
            raise exceptions.StorageException("The given storage is not a instance of Storage!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
    def list_configurations(self, filter_or_filters=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        List the direct child objects of the project (Root configurations)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
        @param filter_or_filters: A regular expression or list of regular expressions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
            used for filtering the configuration paths. If None, all configurations are
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
            returned.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
        @return: a list for configuration file paths
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
        filters = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
        if isinstance(filter_or_filters, basestring):   filters = [filter_or_filters]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
        elif filter_or_filters is not None:             filters = filter_or_filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
        configs = [obj.get_path() for obj in self._objects()]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
        if filters is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
            result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
            for config in configs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
                for filter in filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
                    if re.match(filter, config) is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
                        result.append(config)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
                        break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
            return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
            return configs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
    def list_all_configurations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        List all configuration objects of the project (all configurations)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
        @return: a list for configuration file paths
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
        return [obj.get_path() for obj in self._traverse(type=(Configuration, ConfigurationProxy))]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
    def get_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
        Get a configuration object from the given path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
        @param path: path to configuration 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
        @return: a instance of Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
        # Load the configuration object if it is not already loaded
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
            return self._get(utils.resourceref.to_objref(utils.resourceref.norm(path)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
            if self.storage.is_resource(utils.resourceref.norm(path)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
                proxy = ConfigurationProxy(utils.resourceref.norm(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
                proxy._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
                return proxy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
                raise e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
    def is_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
        Return true if the given path is a configuration object in this Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
        @param path: path to configuration 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
        @return: Boolean return value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
        # Changed from list_all_configurations to list_configurations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
        # (list_all_configurations causes a insane performance problem with _traverse)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
        return path in self.list_configurations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
    def add_configuration(self, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
        Add a Configuration object to this project
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
        if isinstance(config, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
            if self.is_configuration(config.get_path()):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
                raise exceptions.AlreadyExists("%s" % config.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
            self._add(config)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
            self.__add_loaded__(config.get_path(), config)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
            self.__loaded__(config.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
            raise exceptions.IncorrectClassError("Only Configuration instance can be added to Project!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
    def create_configuration(self, path, namespace=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
        Create a Configuration object to this project
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        config = self.get_configuration_class()(utils.resourceref.norm(path), namespace=namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
        self.add_configuration(config)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
        return config
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
    def remove_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
        Remove a Configuration by its reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
        # remove configuration as an object and try to remove it from the storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
        self._remove(utils.resourceref.to_objref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
            self.storage.delete_resource(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
        except exceptions.NotSupportedException:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
            pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
    def import_configuration(self, configuration):  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
        Import a configuration object from another storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
        self.storage.import_resources(configuration.list_resources(), configuration.get_storage())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
    def export_configuration(self, configuration, export_storage, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
        Export a configuration object to another storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
        # First clone the configuration and then import the rest of the configuration resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
        if isinstance(configuration, ConfigurationProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
            configuration = configuration._get_obj()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        export_storage.unload(configuration.get_full_path(),configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
        for child in configuration._traverse(type=Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
            export_storage.unload(child.get_full_path(),child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
        #If the configuration is not in the root of the project adding the path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
        #to final exporting source path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
        #l = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
        cpath = utils.resourceref.get_path(configuration.get_path()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
        resr = [utils.resourceref.join_refs([cpath,related]) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
                for related in configuration.get_layer().list_all_related(empty_folders)]        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
        self.storage.export_resources(resr ,export_storage, empty_folders)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
    def get_configuration_class(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
        return the default configuration class that is used with the model. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
        return utils.get_class(self._model, Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
    def save(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
        Save the object to the permanent Storage object. Calls the save operation for 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
        all the children and also for the Storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
            if isinstance(child, (Configuration, ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
                child.save()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
        self.storage.save()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
        Close the Project.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
            if isinstance(child, (Configuration, ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
                child.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
        self.storage.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
    def load(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
        Load an object from a reference. The given reference is loaded once from storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
        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
   540
        return the same object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
        @param path: The reference where to load the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
        @raise StorageException: if the given object cannot be loaded as an 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
        object from this storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
        if not self.__get_loaded__(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
            configuration = self.get_storage().load(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
            if configuration.get_ref() == 'unknown':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
                 configuration.set_ref(utils.resourceref.to_dref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
            self.__add_loaded__(path, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
        """ increase the ref counter """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
        self.__loaded__(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
        return self.__get_loaded__(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
    def unload(self, path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
        Release the given ref, which decreases the reference counter of the given ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
        @param path: The reference where to store the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
        @param object: The object instance to dump 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
        @raise StorageException: if the given object cannot be dumped to this storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
        if self.__unloaded__(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
            self.get_storage().unload(path, object)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
        Return the path of the project, which is always root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
        return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
class CompositeConfiguration(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
    A base class for composite Configuration objects.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
#        self.meta       = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
#        self.desc       = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
        super(CompositeConfiguration, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
    def add_configuration(self, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
        Add an existing Configuration to this configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
        @param config: A Configuration instance:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
        @return: None 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
        Merge the default view features from added config to this configs _default_view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
        self._add(config)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
    def include_configuration(self, configref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
        Add an existing Configuration to this configuration by its resource reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
        @param config: A Configuration instance:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
        @return: None 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
        # add the configuration load proxy to this configuration instead 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
        # adding the configuration directly
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        self._add(ConfigurationProxy(configref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
    def create_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
        Create a new configuration by its name to the Configuration. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
        1. Create new Configuration object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
        2. Create new ConfigurationProxy 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
        3. Add proxy to this object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
        4. Set proxy to point to the created Configuration object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
        @param path: The reference of the configuration to create
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
        @return: The new configuration object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
        # normalise the path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
        normpath = utils.resourceref.norm(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
        cklass = self.get_configuration_class()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
        conf = cklass(normpath, namespace=self.namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
        proxy = ConfigurationProxy(normpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
        self.add_configuration(proxy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
        proxy._set_obj(conf)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
        return conf
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
    def remove_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
        Remove a Layer object from the Configuration by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   625
        self._remove(utils.resourceref.to_objref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   626
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   627
    def list_configurations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   628
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   629
        List all Layer objects in the Configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   630
        @return: a copy array of layer references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   631
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   632
        return [config.get_path() for config in self._objects(type=(Configuration, ConfigurationProxy))] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   633
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   634
    def list_all_configurations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   635
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   636
        List all Layer objects in the Configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   637
        @return: a copy array of layer references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   639
        # TODO
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   640
        # huge performance problem 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   641
        return [config.get_path() for config in self._traverse(type=(Configuration, ConfigurationProxy))] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   642
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   643
    def get_configuration(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   644
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   645
        Get a Layer object by if path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   646
        @return: a Layer object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   647
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   648
        return self._get(utils.resourceref.to_objref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   649
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   650
    def get_configuration_by_index(self, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
        Get a Layer object by if indexing number
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   653
        @return: a Layer object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   654
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   655
        configs = self._objects(type=(Configuration, ConfigurationProxy))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   656
        return configs[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   657
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   658
    def get_last_configuration(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
        Get the last Layer object from this configuration hierarchy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
        @return: a Layer object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
        last_config = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
        try: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
            last_config = last_config.get_configuration_by_index(-1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
            return last_config.get_last_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
        except IndexError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
            return self 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   670
    def get_configuration_class(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   671
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   672
        return the default configuration class retrieved from the project if it is found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   673
        Otherwise return cone.public.api.Configuration. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   674
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   675
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   676
            return self.get_project().get_configuration_class()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   677
        # catch the Parent/Project NotFound exception
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   678
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   679
            return Configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   680
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   681
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   682
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   683
        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
   684
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   685
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   686
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   687
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   688
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   689
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   690
        if isinstance(child, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   691
            self.add_configuration(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   692
        elif isinstance(child, ConfigurationProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   693
            self.add_configuration(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   694
        elif isinstance(child, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   695
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   696
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   697
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   698
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   699
    def layered_content(self, layers=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   700
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   701
        fetch content from first to last and override content 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   702
        if it is found from a later layer 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   703
        Create an array of the layers based on the layer indexes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   704
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   705
        configuration_array = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   706
        if layers == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   707
            configuration_array = self.list_configurations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   708
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   709
            all = self.list_configurations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   710
            for i in layers:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   711
                configuration_array.append(all[i])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   712
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   713
        content = container.DataContainer()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   714
        for configuration_path in configuration_array:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   715
            content_folder = self.get_configuration(configuration_path).get_layer().content_folder()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   716
            content_path = content_folder.get_current_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   717
            for content_file in content_folder.list_resources("", True):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   718
                source_file = utils.resourceref.join_refs([content_path, content_file])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   719
                content.add_value(content_file, source_file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   720
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   721
        return content
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   722
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   723
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   724
class Configuration(CompositeConfiguration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   725
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   726
    A Configuration is a container that can hold several Layer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   727
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   728
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   729
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   730
        self.path = kwargs.get('path') or ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   731
        self.namespace = kwargs.get('namespace', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   732
        self.name = utils.resourceref.to_objref(self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   733
        super(Configuration, self).__init__(utils.resourceref.to_objref(self.path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   734
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   735
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   736
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   737
        return Feature(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   738
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   739
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   740
        if isinstance(obj, Configuration) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   741
        or isinstance(obj, Feature) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   742
        or isinstance(obj, Data) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   743
        or isinstance(obj, ConfigurationProxy) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   744
        or isinstance(obj, View) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   745
        or isinstance(obj, Base): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   746
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   747
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   748
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   749
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   750
    def _dict(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   751
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   752
        Return the public variables in a dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   753
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   754
        dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   755
        for key in self.__dict__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   756
            if key.startswith('_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   757
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   758
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   759
                dict[key] = self.__dict__[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   760
        dict['namespace'] = self.namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   761
        return dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   762
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   763
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   764
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   765
        Return the name of the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   766
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   767
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   768
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   769
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   770
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   771
        Set the name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   772
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   773
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   774
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   775
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   776
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   777
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   778
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   779
        return self.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   780
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   781
    def set_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   782
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   783
        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
   784
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   785
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   786
        #self.name = utils.resourceref.to_objref(self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   787
        self.set_ref(utils.resourceref.to_objref(self.path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   788
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   789
    #@property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   790
    def get_full_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   791
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   792
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   793
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   794
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   795
            parentconfig = self._find_parent(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   796
            parent_path = utils.resourceref.get_path(parentconfig.get_path()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   797
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   798
            parent_path = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   799
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   800
        return utils.resourceref.join_refs([parent_path, self.path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   801
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   802
    def get_layer(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   803
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   804
        Get the layer object where this Configuration is located. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   805
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   806
        if not hasattr(self, "layer"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   807
            layerpath = utils.resourceref.get_path(self.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   808
            # hardcoded removal of confml folder from the layer path it is there
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   809
            layerpath = utils.resourceref.remove_end(layerpath, '/confml')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   810
            self.layer = Layer(self.get_storage(), layerpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   811
            """ Add the sublayers to this layer if they are different from this configuration """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   812
            for configpath in self.list_configurations():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   813
                sublayer_path = utils.resourceref.get_path(self.get_configuration(configpath).get_full_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   814
                sublayer_path = utils.resourceref.remove_end(sublayer_path, '/confml')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   815
                if sublayer_path != utils.resourceref.get_path(self.get_path()):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   816
                    self.layer.add_layer(self.get_configuration(configpath).get_layer())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   817
        return self.layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   818
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   819
    def set_namespace(self, namespace):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   820
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   821
        @param namespace: The new namespace of the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   822
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   823
        self._namespace =  namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   824
        #self.root.set_namespace(namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   825
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   826
    def get_namespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   827
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   828
        @return: The reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   829
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   830
        return self._namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   831
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   832
    def del_namespace(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   833
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   834
        @return: The reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   835
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   836
        self._namespace = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   837
    namespace = property(get_namespace, set_namespace, del_namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   838
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   839
    def list_resources(self, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   840
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   841
        List all resources used in this configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   842
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   843
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   844
        1. First ensure that all configuration resource files are added 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   845
        2. Then add all layer resources 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   846
        3. Make the list distinct
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   847
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   848
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   849
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   850
        resources = [self.get_full_path()]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   851
        for config in self._traverse(type=Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   852
            resources.append(config.get_full_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   853
        layer = self.get_layer()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   854
        for resref in layer.list_all_resources(empty_folders):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   855
            resources.append(utils.resourceref.join_refs([layer.get_current_path(), resref]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   856
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   857
        return utils.distinct_array(resources)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   858
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   859
    def get_resource(self, ref, mode="r"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   860
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   861
        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
   862
        Configuration path, e.g. Configuration('test/foo/root.confml') => searches from 'test/foo'.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   863
        @param ref: the reference path to the requested resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   864
        @return: a instance of Resource. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   865
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   866
        mypath = utils.resourceref.get_path(self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   867
        myref = utils.resourceref.join_refs([mypath, ref])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   868
        return self.get_storage().open_resource(myref, mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   869
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   870
    def get_all_resources(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   871
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   872
        Get all resources in resource list of Resource objects
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   873
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   874
        resources = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   875
        res_list = self.list_resources()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   876
        for res in res_list:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   877
            resources.append(self.get_storage().open_resource(res))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   878
        return resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   879
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   880
    def get_root_resource(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   881
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   882
        Get the configuration reference resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   883
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   884
        return self.get_storage().open_resource(self.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   885
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   886
    def get_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   887
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   888
        Get a feature object by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   889
        @param ref: The reference to the feature object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   890
        @return: A Feature object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   891
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   892
        return self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   893
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   894
    def add_feature(self, feature, namespace=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   895
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   896
        Add a feature object to the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   897
        @param feature: The Feature object to add.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   898
        @param namespace: The sub namespace for the feature. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   899
        e.g. to add fea2 under fea1 add_feature(fea2, 'fea1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   900
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   901
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   902
        self._add_to_path(namespace, feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   903
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   904
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   905
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   906
        remove feature by its reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   907
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   908
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   909
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   910
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   911
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   912
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   913
        List immediate features found under the this configuration (the top nodes). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   914
        The features are also available via the _default_view of the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   915
        @return: a list of feature references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   916
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   917
        return [fea.get_ref() for fea in self._objects(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   918
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   919
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   920
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   921
        List all features found under the this configuration. The features are also 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   922
        available via the _default_view of the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   923
        @return: a list of feature references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   924
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   925
        return [fea.fqr for fea in self._traverse(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   926
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   927
    def add_data(self, data, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   928
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   929
        Add a data object to this configuration object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   930
        @param data: The Data object to add.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   931
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   932
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   933
        if not self._has(data.attr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   934
            self._add(DataContainer(data.attr, container=True))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   935
        (namespace, name) = utils.dottedref.psplit_ref(data.get_fearef())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   936
        self._get(data.attr)._add_to_path(namespace, data, policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   937
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   938
    def get_data(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   939
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   940
        Get a data object by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   941
        @param ref: The reference to the data object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   942
        @return: A Data object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   943
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   944
        return self.data._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   945
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   946
    def remove_data(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   947
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   948
        remove feature by its reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   949
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   950
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   951
        self.data._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   952
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   953
    def list_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   954
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   955
        List all datas found under the this configuration. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   956
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   957
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   958
        if self._has('data'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   959
            return [dataelem.fqr for dataelem in self.data._objects(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   960
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   961
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   962
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   963
    def get_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   964
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   965
        List immediate datas found under the this configuration (the top nodes). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   966
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   967
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   968
        if self._has('data'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   969
            return [dataelem for dataelem in self.data._objects(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   970
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   971
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   972
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   973
    def list_all_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   974
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   975
        List all Data elements found under the this configuration (or subconfigurations). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   976
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   977
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   978
        return [dataelem.fqr for dataelem in self._traverse(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   979
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   980
    def get_all_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   981
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   982
        List all Data elements found under the this configuration (or subconfigurations). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   983
        @return: a list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   984
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   985
        return [dataelem for dataelem in self._traverse(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   986
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   987
    def list_leaf_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   988
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   989
        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
   990
        @return: A list of Data references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   991
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   992
        return [dataelem.fqr for dataelem in self._find_leaves(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   993
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   994
    def get_leaf_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   995
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   996
        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
   997
        @return: A list of Data objects. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   998
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   999
        return [dataelem for dataelem in self._find_leaves(type=Data)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1000
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1001
    def get_view(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1002
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1003
        Get a view object by its reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1004
        @param ref: The reference to the view object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1005
        @return: A View object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1006
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1007
        # Populate the view object before returning it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1008
        view = self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1009
        view.populate()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1010
        return view
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1011
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1012
    def add_view(self, viewname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1013
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1014
        Add a view object to the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1015
        @param viewname: The name of the view to add. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1016
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1017
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1018
        return self._add(View(viewname))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1019
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1020
    def remove_view(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1021
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1022
        Remove a view object from the configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1023
        @param ref: The reference to the View. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1024
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1025
        @raise NotFound: when view is not found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1026
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1027
        return self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1028
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1029
    def list_views(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1030
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1031
        List all views found under the this configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1032
        @return: a list of view references. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1033
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1034
        return [view._path(self) for view in self._traverse(type=View)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1035
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1036
    def save(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1037
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1038
        Save the object to the permanent Storage object. Calls the save operation of 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1039
        all the children.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1040
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1041
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1042
            if isinstance(child, (Configuration,ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1043
                child.save()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1044
        self.get_project().unload(self.get_full_path(), self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1045
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1046
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1047
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1048
        Close the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1049
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1050
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1051
            if isinstance(child, (Configuration, ConfigurationProxy)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1052
                child.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1053
#        if self.get_full_path() != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1054
#            self.get_project().unload(self.get_full_path(), self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1055
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1056
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1057
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1058
        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
  1059
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1060
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1061
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1062
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1063
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1064
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1065
        if isinstance(child, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1066
            self.add_feature(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1067
        elif isinstance(child, View):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1068
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1069
        elif isinstance(child, (Data)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1070
            self.add_data(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1071
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1072
            super(Configuration, self).add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1073
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1074
    def get_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1075
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1076
        Get the default view from this configuration hierarchy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1077
        This returns always the view from the Root configuration point of view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1078
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1079
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1080
            parent = self._find_parent_or_default() 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1081
            if parent and isinstance(parent, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1082
                return parent.get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1083
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1084
                if not hasattr(self, '_default_view'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1085
                    self._create_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1086
                return self._default_view
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1087
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1088
            raise e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1089
        # raise exceptions.NotFound("Default View is not found! No root configuration?")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1090
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1091
    def recreate_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1092
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1093
            parent = self._find_parent_or_default() 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1094
            if parent and isinstance(parent, Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1095
                parent.recreate_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1096
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1097
                self._create_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1098
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1099
            raise e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1100
        # raise exceptions.NotFound("Default View is not found! No root configuration?")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1101
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1102
    def _create_default_view(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1103
        # Rebuild the default view for this Configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1104
        self._default_view = View("_default_view", data=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1105
        self._default_view._parent= self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1106
        # First add all features of the configuration to the view. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1107
        # Then add all data elements under the features
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1108
        for child in self._traverse(type=Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1109
            self._default_view.add_feature(child, child.namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1110
        for child in self._traverse(type=Data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1111
            #parent_config = child._find_parent_or_default(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1112
            #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
  1113
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1114
                fea = self._default_view.get_feature(child.fqr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1115
                fea.add_data(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1116
            except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1117
                data_parent_config = child._find_parent_or_default(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1118
                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
  1119
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1120
class ConfigurationProxy(container.LoadProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1121
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1122
    Configuration loading proxy. Loads the configuration from the given reference, when needed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1123
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1124
    def __init__(self, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1125
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1126
        The ConfigurationProxy that represents a configuration that is included in another configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1127
        @param ref: the reference to the storage resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1128
        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
  1129
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1130
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1131
        container.LoadProxy.__init__(self, path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1132
        self.set('_name', utils.resourceref.to_objref(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1133
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1134
    def _clone(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1135
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1136
        A ConfigurationProxy specific implementation for cloning.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1137
        Copies all (public) members in dictionary.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1138
        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
  1139
        @param recursion: Boolean to define recursion on or off
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1140
        @param recursion_depth: positive integer to define recursion depth. default is -1 which will 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1141
        perform recursion to all objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1142
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1143
        dict = self._dict()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1144
        obj = self.__class__(**dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1145
        # handle the recursion argument
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1146
        recursion = kwargs.get('recursion', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1147
        if recursion:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1148
            recursion_depth = kwargs.get('recursion_depth', -1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1149
            if recursion_depth < 0 or recursion_depth > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1150
                # decrease the recursion
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1151
                kwargs['recursion_depth'] = recursion_depth - 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1152
                newobj = self._get_obj()._clone(**kwargs) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1153
                obj._set_obj(newobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1154
        return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1155
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1156
    def _dict(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1157
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1158
        Return the public variables in a dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1159
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1160
        dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1161
        for key in self.__dict__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1162
            if key.startswith('_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1163
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1164
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1165
                dict[key] = self.__dict__[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1166
        return dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1167
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1168
    def _get_mapper(self,modelname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1169
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1170
        Return a instance of appropriate mapper for given model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1171
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1172
        return mapping.BaseMapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1173
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1174
class Group(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1175
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1176
    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
  1177
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1178
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1179
        super(Group, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1180
        self.name = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1181
        self.support_data = kwargs.get("data", False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1182
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1183
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1184
        if isinstance(obj, (Group, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1185
                           Base, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1186
                           _FeatureProxy, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1187
                           FeatureLink)): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1188
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1189
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1190
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1191
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1192
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1193
        return Group(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1194
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1195
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1196
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1197
        Return the name of the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1198
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1199
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1200
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1201
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1202
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1203
        Set the name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1204
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1205
        self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1206
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1207
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1208
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1209
        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
  1210
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1211
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1212
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1213
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1214
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1215
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1216
        if isinstance(child, (Group, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1217
                              Base, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1218
                              _FeatureProxy, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1219
                              FeatureLink)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1220
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1221
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1222
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1223
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1224
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1225
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1226
        Return the name of the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1227
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1228
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1229
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1230
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1231
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1232
        Set the name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1233
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1234
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1235
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1236
    def add_feature(self, feature, path=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1237
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1238
        Add feature to this Group.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1239
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1240
        if not isinstance(feature, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1241
            raise exceptions.IncorrectClassError("add_feature requires instance of Feature!! Given %s" % feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1242
        if not self.support_data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1243
            self._add_to_path(path, _FeatureProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1244
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1245
            self._add_to_path(path, _FeatureDataProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1246
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1247
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1248
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1249
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1250
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1251
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1252
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1253
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1254
    def get_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1255
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1256
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1257
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1258
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1259
            return self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1260
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1261
            raise exceptions.NotFound("Feature '%s' not found." % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1262
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1263
    def get_features(self, ref, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1264
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1265
        Get a list of features that match the ref. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1266
        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
  1267
        always a list [<Feature>].
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1268
        Example2: get_features('foo.*') would try to retrieve a list of all foo children.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1269
        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
  1270
        that have a defined type.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1271
        @param path: The path (ref) to the given feature or xpath like expression 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1272
        @return: A list of features.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1273
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1274
        (startref, last) = utils.dottedref.psplit_ref(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1275
        startelem = self._get(startref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1276
        if last == '**':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1277
            return [fea for fea in startelem._traverse(**kwargs)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1278
        elif last == '*':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1279
            return [fea for fea in startelem._objects(**kwargs)] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1280
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1281
            return [self._get(ref)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1282
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1283
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1284
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1285
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1286
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1287
        return [fea.get_ref() for fea in self._objects(type=(_FeatureProxy))]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1288
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1289
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1290
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1291
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1292
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1293
        return [fea.fqr for fea in self._traverse(type=(_FeatureProxy))]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1294
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1295
    def add_group(self, groupname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1296
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1297
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1298
        self._add(Group(groupname))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1299
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1300
    def remove_group(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1301
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1302
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1303
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1304
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1305
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1306
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1307
    def get_group(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1308
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1309
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1310
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1311
        return self._get(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1312
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1313
    def list_groups(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1314
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1315
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1316
        return [group.get_name() for group in self._objects(type=Group)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1317
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1318
    def populate(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1319
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1320
        Populate or fetch the link to the actual feature for this featureproxy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1321
        This method fetches the feature to the _obj member variable and populates also 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1322
        subfeatures. 
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._traverse(type=FeatureLink):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1325
            child.populate()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1326
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1327
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1328
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1329
class View(Group):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1330
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1331
    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
  1332
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1333
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1334
        super(View, self).__init__(self.to_ref(ref), **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1335
        self.name = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1336
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1337
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1338
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1339
    def to_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1340
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1341
        return a view reference converted from name 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1342
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1343
        return ref.replace('.', '').replace('/', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1344
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1345
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1346
class Feature(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1347
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1348
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1349
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1350
    PROPERTIES = ['value']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1351
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1352
        super(Feature, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1353
        self.name = kwargs.get('name', ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1354
        self.type = kwargs.get('type', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1355
        self._dataproxy = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1356
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1357
    def __copy__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1358
        dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1359
        for key in self.__dict__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1360
            if key.startswith('_') or key == 'ref':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1361
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1362
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1363
                dict[key] = self.__dict__[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1364
        fea = self.__class__(self.ref, **dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1365
        return fea
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1366
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1367
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1368
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1369
        # For now support added for desc element via support for Base
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1370
        if isinstance(obj, (Feature, Option, Base)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1371
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1372
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1373
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1374
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1375
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1376
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1377
        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
  1378
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1379
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1380
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1381
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1382
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1383
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1384
        if isinstance(child, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1385
            self.add_feature(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1386
        elif isinstance(child, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1387
            self._add(child, policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1388
        elif isinstance(child, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1389
            self._add(child, policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1390
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1391
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1392
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1393
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1394
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1395
        Return the name of the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1396
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1397
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1398
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1399
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1400
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1401
        Set the name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1402
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1403
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1404
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1405
    def get_type(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1406
        return self.type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1407
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1408
    def set_type(self, type):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1409
        self.type = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1410
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1411
    def add_feature(self, feature, path=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1412
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1413
        @param feature: The Feature object to add 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1414
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1415
        configuration = self.find_parent(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1416
        if configuration:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1417
            feapath = utils.dottedref.join_refs([self._path(configuration), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1418
            configuration.add_feature(feature, feapath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1419
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1420
            self._add_to_path(path, feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1421
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1422
    def get_feature(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1423
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1424
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1425
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1426
        return self._get(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1427
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1428
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1429
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1430
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1431
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1432
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1433
        configuration = self.find_parent(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1434
        if configuration:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1435
            fullfqr = utils.dottedref.join_refs([self._path(configuration), ref])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1436
            configuration.remove_feature(fullfqr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1437
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1438
            self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1439
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1440
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1441
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1442
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1443
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1444
        return [fea.get_ref() for fea in self._objects(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1445
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1446
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1447
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1448
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1449
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1450
        return [fea._path(self) for fea in self._traverse(type=Feature)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1451
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1452
    def add_option(self, option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1453
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1454
        @param option: option object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1455
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1456
        if not isinstance(option, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1457
            raise TypeError("%r is not an instance of Option!" % option)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1458
        self._add(option)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1459
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1460
    def create_option(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1461
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1462
        @param name: option name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1463
        @param value: option value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1464
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1465
        self._add(Option(name, value))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1466
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1467
    def get_option(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1468
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1469
        @param name: The option reference of the option (as returned by list_options()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1470
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1471
        real_ref = 'opt_' + ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1472
        obj = self._get(real_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1473
        if not isinstance(obj, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1474
            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
  1475
        return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1476
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1477
    def remove_option(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1478
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1479
        remove a given option from this feature by option reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1480
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1481
        real_ref = 'opt_' + ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1482
        obj = self._get(real_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1483
        if not isinstance(obj, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1484
            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
  1485
        self._remove(real_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1486
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1487
    def list_options(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1488
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1489
        Return a array of all Option children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1490
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1491
        # Return option refs without the leading 'opt_'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1492
        return [opt.ref[4:] for opt in self._objects(type=Option)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1493
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1494
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1495
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1496
        Get the current value of the feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1497
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1498
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1499
        # Do not allow getting of setting of sequence values directly with Feature object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1500
        if not self.is_sequence():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1501
            return self.get_value_cast(self.dataproxy._get_value(attr), attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1502
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1503
            """ get the feature specific data from sequence => a column of data table """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1504
            coldata =  []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1505
            feasequence = self.get_sequence_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1506
            feapath = self._path(feasequence)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1507
            for row in feasequence.data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1508
                feadata = row.get_feature(feapath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1509
                coldata.append(feadata.value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1510
            return coldata
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1511
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1512
    def set_value(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1513
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1514
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1515
        @param value: the value to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1516
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1517
        # Do not allow setting of setting of sequence values directly with Feature object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1518
        if not self.is_sequence():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1519
            value = self.set_value_cast(value, attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1520
            self.dataproxy._set_value(value, attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1521
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1522
    def del_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1523
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1524
        Delete the topmost value for this feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1525
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1526
        if not self.is_sequence():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1527
            self.dataproxy._del_value(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1528
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1529
    def get_value_cast(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1530
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1531
        A function to perform the value type casting in get operation  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1532
        @param value: the value to cast 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1533
        @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
  1534
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1535
        return value 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1536
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1537
    def set_value_cast(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1538
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1539
        A function to perform the value type casting in the set operation  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1540
        @param value: the value to cast 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1541
        @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
  1542
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1543
        return value 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1544
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1545
    def get_original_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1546
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1547
        Get the current value of the feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1548
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1549
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1550
        # Do not allow getting of setting of sequence values directly with Feature object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1551
        if not self.is_sequence():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1552
            return self.dataproxy._get_value(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1553
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1554
            """ get the feature specific data from sequence => a column of data table """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1555
            coldata =  []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1556
            feasequence = self.get_sequence_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1557
            feapath = self._path(feasequence.data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1558
            for row in feasequence.data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1559
                feadata = row.get_feature(feapath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1560
                coldata.append(feadata.value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1561
            return coldata
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1562
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1563
    def add_data(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1564
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1565
        Add a data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1566
        @param data: A Data object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1567
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1568
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1569
            return self.dataproxy._add_data(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1570
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1571
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1572
            return self.dataproxy._add_data(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1573
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1574
    def get_data(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1575
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1576
        Helper function to get the topmost data value from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1577
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1578
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1579
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1580
            return self.dataproxy._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1581
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1582
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1583
            return self.dataproxy._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1584
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1585
    def get_datas(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1586
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1587
        Helper function to get the data values from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1588
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1589
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1590
            return self.dataproxy._get_datas()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1591
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1592
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1593
            return self.dataproxy._get_datas()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1594
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1595
    def get_valueset(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1596
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1597
        Get the ValueSet object for this feature, that has the list of available values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1598
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1599
        if self.get_type() == 'boolean':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1600
            return ValueSet([True, False])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1601
        elif self.get_type() == 'int':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1602
            return ValueRange(0, sys.maxint)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1603
        elif self.get_type() == 'string':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1604
            return ValueRe('.*')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1605
        elif self.get_type() in ('selection', 'multiSelection'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1606
            values = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1607
            for opt in self._objects(type=Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1608
                v = opt.get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1609
                if v is not None: values.append(v)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1610
            return ValueSet(values)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1611
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1612
    def is_sequence(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1613
        """ Return true if the feature is a sequence or part of a sequence """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1614
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1615
            return self._parent.is_sequence()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1616
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1617
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1618
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1619
    def get_sequence_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1620
        """ Try to get a FeatureSequence object for this Feature if it is found """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1621
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1622
            return self._parent.get_sequence_parent()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1623
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1624
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1625
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1626
    def getdataproxy(self): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1627
        if self._dataproxy == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1628
            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1629
        return self._dataproxy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1630
    def setdataproxy(self, value): self._dataproxy = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1631
    def deldataproxy(self): self._dataproxy = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1632
    dataproxy = property(getdataproxy, setdataproxy, deldataproxy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1633
    value = property(get_value, set_value, del_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1634
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1635
class FeatureSequence(Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1636
    POLICY_REPLACE = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1637
    POLICY_APPEND = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1638
    POLICY_PREPEND = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1639
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1640
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1641
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1642
    dataelem_name = '?datarows'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1643
    template_name = '?template'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1644
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1645
        super(FeatureSequence, self).__init__(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1646
        self.name = kwargs.get('name', ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1647
        self.type = 'sequence'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1648
        self.mapKey   = kwargs.get('mapKey')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1649
        self.mapValue = kwargs.get('mapValue')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1650
        self._templatedata = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1651
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1652
    def _get_policy(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1653
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1654
        parse the policy from a policy string and return a constant
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1655
        @return: POLICY_* constant
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1656
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1657
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1658
            containerdata = utils.get_list(data._get_parent()._get(data.get_ref()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1659
            firstdata = containerdata[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1660
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1661
            firstdata = data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1662
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1663
        if firstdata.policy == 'append':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1664
            return self.POLICY_APPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1665
        elif firstdata.policy == 'prefix':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1666
            return self.POLICY_PREPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1667
        elif firstdata == data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1668
             # otherwise the policy is either replace or undefined
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1669
             # (firstdata.policy == 'replace' or firstdata.policy == ''):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1670
            return self.POLICY_REPLACE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1671
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1672
            return self.POLICY_APPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1673
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1674
    def _set_template_data(self, data=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1675
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1676
        Set the template of the feature sequence  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1677
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1678
        # If template data is not existing, create it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1679
        if data != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1680
            self._templatedata = data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1681
            for feaname in self.list_features():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1682
                if self._templatedata._has(feaname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1683
                    self.get_feature(feaname)._templatedata = self._templatedata._get(feaname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1684
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1685
                    subdata = Data(ref=feaname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1686
                    self.get_feature(feaname)._templatedata = subdata
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1687
                    self._templatedata._add(subdata) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1688
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1689
    def _add_datarow(self, dataobj=None, policy=POLICY_APPEND):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1690
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1691
        Add a feature data row for a new data in this sequence 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1692
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1693
        if dataobj == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1694
            dataobj = Data(fqr=self.fqr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1695
        elif dataobj.attr != 'data':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1696
            # Add data rows only for data objects (not e.g. RFS)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1697
            return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1698
        fea = FeatureSequenceSub(self.dataelem_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1699
        rowproxy = _FeatureDataProxy(fea._name, fea)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1700
        """ the imaginary features share the parent relation of the proxy objects """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1701
        self.dataproxy._add(rowproxy, policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1702
        fea._parent = rowproxy._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1703
        rowproxy._add_data(dataobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1704
        """ update the FeatureSequenceSub index from the index number of dataproxy """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1705
        fea._index = utils.get_list(self.dataproxy._get(self.dataelem_name)).index(rowproxy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1706
        # Create a the subfeatures / columns for the parent feature and 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1707
        # add a data element under each feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1708
        for feaname in self.list_all_features():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1709
            (pathto_fea, fearef) = utils.dottedref.psplit_ref(feaname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1710
            rowproxy.add_feature(FeatureSequenceSub(fearef), pathto_fea)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1711
            subproxy = rowproxy.get_feature(feaname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1712
            subproxy._obj._parent = subproxy._parent 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1713
            if not dataobj._has(feaname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1714
                dataobj._add_to_path(pathto_fea, Data(ref=fearef))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1715
            subproxy._add_data(dataobj._get(feaname))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1716
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1717
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1718
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1719
        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
  1720
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1721
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1722
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1723
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1724
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1725
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1726
        if isinstance(child, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1727
            self.add_feature(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1728
        elif isinstance(child, Option):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1729
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1730
        elif isinstance(child, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1731
            self._add(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1732
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1733
            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1734
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1735
    def add_sequence(self, data=None, policy=POLICY_APPEND):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1736
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1737
        Add a feature data row for a new data in this sequence 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1738
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1739
        self._add_datarow(None, policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1740
        # set the initial data if it is given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1741
        rowproxy = utils.get_list(self.dataproxy._get(self.dataelem_name))[-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1742
        if data != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1743
            for index in range(len(data)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1744
                rowproxy[index].set_value(data[index])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1745
        # add the new data sequence/row to the last configuration layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1746
        dataobj = rowproxy._get_data()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1747
        last_config = self.get_root_configuration().get_last_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1748
        last_config.add_data(dataobj, container.APPEND)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1749
        return dataobj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1750
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1751
    def set_template(self, data=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1752
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1753
        Set the template of the feature sequence  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1754
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1755
        # If template data is not existing, create it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1756
        if self._templatedata == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1757
            self._set_template_data(Data(ref=self.ref, template=True))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1758
            # Add the template data to parent config
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1759
            pconfig = self.find_parent(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1760
            pconfig.add_data(self._templatedata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1761
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1762
        if data != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1763
            templdatas = self._templatedata._objects()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1764
            for index in range(len(data)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1765
                templdatas[index].set_value(data[index])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1766
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1767
    def get_template(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1768
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1769
        Add a feature data row for a new data in this sequence 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1770
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1771
        #self._set_template(None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1772
        # set the initial data if it is given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1773
        if self._templatedata:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1774
            return [data.get_value() for data in self._templatedata._objects()]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1775
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1776
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1777
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1778
    def get_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1779
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1780
        Helper function to get the topmost data value from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1781
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1782
        if self.dataproxy._has(self.dataelem_name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1783
            return utils.get_list(self.dataproxy._get(self.dataelem_name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1784
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1785
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1786
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1787
    def add_data(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1788
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1789
        Add a data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1790
        @param data: A Data object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1791
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1792
        # Skip template data adding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1793
        if data.template:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1794
            self._set_template_data(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1795
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1796
            # Get the data index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1797
            self._add_datarow(data, self._get_policy(data))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1798
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1799
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1800
    def get_map_key(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1801
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1802
        Returns the setting that corresponds to mapKey attribute of this sequence feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1803
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1804
        if self.mapKey != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1805
            mapkey = self.get_feature(self.mapKey)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1806
            return mapkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1807
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1808
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1809
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1810
    def get_map_key_value(self,key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1811
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1812
        Returns the setting that corresponds to mapKey attribute of this sequence feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1813
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1814
        value = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1815
        if self.mapKey != None and self.mapValue != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1816
            data = self.get_data()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1817
            for item in data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1818
                kv = item.get_feature(self.mapKey).get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1819
                if kv == key:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1820
                    value = item.get_feature(self.mapValue).get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1821
        return value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1822
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1823
    def get_map_value(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1824
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1825
        Returns the setting that corresponds to mapValue attribute of this sequence feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1826
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1827
        if self.mapValue != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1828
            mapvalue = self.get_feature(self.mapValue)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1829
            return mapvalue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1830
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1831
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1832
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1833
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1834
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1835
        Helper function to get the topmost data value from the default view.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1836
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1837
        datatable =  self.get_data()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1838
        rettable = [] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1839
        for row in datatable:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1840
            rowvalues = row.value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1841
            rettable.append(rowvalues)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1842
        return rettable
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1843
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1844
    def set_value(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1845
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1846
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1847
        @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
  1848
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1849
        # sets the first data element to replace policy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1850
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1851
            self.add_sequence(value.pop(0), self.POLICY_REPLACE)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1852
        # ignore the index error of an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1853
        except IndexError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1854
            pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1855
        for row in value:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1856
            self.add_sequence(row)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1857
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1858
    def is_sequence(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1859
        """ Return always true from a sequence object """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1860
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1861
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1862
    def get_sequence_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1863
        """ Return this object as a sequence parent """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1864
        return self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1865
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1866
    value = property(get_value, set_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1867
    data = property(get_data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1868
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1869
class FeatureSequenceCell(Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1870
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1871
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1872
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1873
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1874
        super(Feature, self).__init__(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1875
        self.name = kwargs.get('name', ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1876
        self.type = 'seqcell'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1877
 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1878
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1879
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1880
        Get the current value of the feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1881
        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1882
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1883
        return self.dataproxy._get_value(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1884
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1885
    def set_value(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1886
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1887
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1888
        @param value: the value to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1889
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1890
        # The sequence cell only updates the latest value in the proxy  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1891
        self.dataproxy.get_data().set_value(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1892
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1893
    value = property(get_value, set_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1894
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1895
class FeatureSequenceSub(Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1896
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1897
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1898
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1899
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1900
        super(Feature, self).__init__(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1901
        self.name = kwargs.get('name', ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1902
        self.type = 'subseq'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1903
        self._index = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1904
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1905
    def get_index(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1906
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1907
        @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
  1908
        0 for normal data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1909
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1910
        return self._index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1911
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1912
    def set_value(self, value, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1913
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1914
        Set the current value for this sequence row.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1915
        @param value: the value row to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1916
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1917
        if utils.is_list(value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1918
            for subindex in range(0, len(value)):  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1919
                self.dataproxy[subindex].get_data().set_value(value[subindex])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1920
        else: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1921
            self.dataproxy.get_data().set_value(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1922
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1923
    def get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1924
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1925
        Set the current value for this feature. Set the value on the topmost layer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1926
        @param value: the value to set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1927
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1928
        # dataproxy = self.get_default_view().get_feature(self.get_fullfqr())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1929
        # The sequence cell only updates the latest value in the proxy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1930
        childdatas = self.dataproxy._objects()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1931
        if len(childdatas) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1932
            return [subdata.value for subdata in childdatas]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1933
        else: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1934
            return self.dataproxy._get_value(attr=attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1935
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1936
    value = property(get_value, set_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1937
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1938
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1939
class FeatureLink(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1940
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1941
    A _FeatureProxy class. _FeatureProxy is the object that is added to View as a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1942
    link to the actual Feature object. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1943
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1944
    def __init__(self, link="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1945
        # Store the fully qualified reference to this object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1946
        self.link = link
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1947
        ref = link.replace('.', '_')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1948
        super(FeatureLink, self).__init__(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1949
        self._obj = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1950
        self._populated = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1951
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1952
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1953
    def fqr(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1954
        return self.link
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1955
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1956
    def populate(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1957
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1958
        Populate or fetch the link to the actual feature for this featureproxy.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1959
        This method fetches the feature to the _obj member variable and populates also 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1960
        subfeatures. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1961
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1962
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1963
            if not self._populated:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1964
                feas = self.get_default_view().get_features(self.link)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1965
                # add the found features to the parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1966
                for fea in feas:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1967
                    self._get_parent().add_feature(fea._obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1968
        except exceptions.NotFound, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1969
                parent_view = self._find_parent_or_default(type=View)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1970
                view_name = parent_view.get_name()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1971
                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
  1972
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1973
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1974
class _FeatureProxy(container.ObjectProxyContainer, Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1975
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1976
    A _FeatureProxy class. _FeatureProxy is the object that is added to View as a 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1977
    link to the actual Feature object. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1978
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1979
    def __init__(self, ref="", obj=None, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1980
        super(_FeatureProxy, self).__init__(obj, ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1981
        Base.__init__(self, ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1982
        self.support_data = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1983
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1984
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1985
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1986
        First check if the requested attr is a children then 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1987
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1988
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1989
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1990
            return self.__dict__['_children'][name] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1991
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1992
            return getattr(self._obj, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1993
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1994
    def __getitem__(self, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1995
        return self._objects()[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1996
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1997
    def __setitem__(self, index, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1998
        raise exceptions.NotSupported()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1999
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2000
    def __delitem__(self, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2001
        item = self.__getitem__(index)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2002
        return self._remove(item.get_ref())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2003
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2004
    def __len__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2005
        return len(self._order)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2006
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2007
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2008
        if isinstance(obj, _FeatureProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2009
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2010
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2011
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2012
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2013
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2014
        return Group(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2015
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2016
    def _set_parent(self, newparent):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2017
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2018
        @param newparent:  The new parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2019
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2020
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2021
        self._parent = newparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2022
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2023
    def add_feature(self, feature, path=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2024
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2025
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2026
        if not isinstance(feature, Feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2027
            raise exceptions.IncorrectClassError("add_feature requires instance of Feature!! Given %s" % feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2028
        if not self.support_data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2029
            self._add_to_path(path, _FeatureProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2030
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2031
            self._add_to_path(path, _FeatureDataProxy(feature._name, feature))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2032
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2033
    def remove_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2034
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2035
        remove a given feature from this view by reference. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2036
        @param ref: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2037
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2038
        self._remove(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2039
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2040
    def get_feature(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2041
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2042
        @param path: The path (ref) to the given feature 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2043
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2044
        return self._get(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2045
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2046
    def list_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2047
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2048
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2049
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2050
        return self._list()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2051
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2052
    def list_all_features(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2053
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2054
        Return a array of all Feature children references under this object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2055
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2056
        return [fea._path(self) for fea in self._traverse(type=_FeatureProxy)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2057
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2058
    def populate(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2059
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2060
        Dummy implementation of populate
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2061
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2062
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2063
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2064
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2065
class _FeatureDataProxy(_FeatureProxy):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2066
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2067
    A Feature class. Feature is the base for all Configurable items in a Configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2068
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2069
    DEFAULT_KEY = 'data'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2070
    def __init__(self, ref="", obj=None, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2071
        # Initialize _obj to None, because __getattr__(), __setattr__()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2072
        # and __delattr__() access it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2073
        # Note that we cannot use self._obj = None here, since that would
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2074
        # invoke __setattr__(), causing a kind of a chicken-and-egg problem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2075
        object.__setattr__(self, '_obj', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2076
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2077
        super(_FeatureDataProxy, self).__init__(ref, obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2078
        self.support_data = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2079
        """ 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
  2080
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2081
        self.defaultkey = _FeatureDataProxy.DEFAULT_KEY
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2082
        self.datas = {self.defaultkey : []}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2083
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2084
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2085
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2086
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2087
        if object.__getattribute__(self, '_obj') is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2088
            self._obj.dataproxy = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2089
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2090
        if name in Feature.PROPERTIES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2091
            return getattr(self._obj, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2092
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2093
            return super(_FeatureDataProxy, self).__getattr__(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2094
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2095
    def __setattr__(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2096
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2097
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2098
        if object.__getattribute__(self, '_obj') is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2099
            self._obj.dataproxy = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2100
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2101
        if name in Feature.PROPERTIES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2102
            return setattr(self._obj, name, value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2103
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2104
            super(_FeatureDataProxy, self).__setattr__(name, value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2105
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2106
    def __delattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2107
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2108
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2109
        if name in Feature.PROPERTIES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2110
            return delattr(self._obj, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2111
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2112
            return super(_FeatureDataProxy, self).__delattr__(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2113
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2114
    def _add_data(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2115
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2116
        Add a data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2117
        @param data: A Data object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2118
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2119
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2120
            self.datas[data.attr].append(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2121
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2122
            """ Create a list object for missing attribute """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2123
            self.datas[data.attr] = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2124
            self.datas[data.attr].append(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2125
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2126
    def _get_data(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2127
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2128
        Get the data value. in sequence setting cases returns an array of data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2129
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2130
        dataattr = attr or self.defaultkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2131
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2132
            if len(self.datas[dataattr]) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2133
                return self.datas[dataattr][-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2134
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2135
                return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2136
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2137
            """ return None for missing attribute """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2138
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2139
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2140
    def _get_datas(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2141
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2142
        Get the entire data array.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2143
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2144
        dataattr = attr or self.defaultkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2145
        return self.datas[dataattr]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2146
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2147
    def _get_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2148
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2149
        Get the topmost data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2150
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2151
        if self._get_data(attr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2152
            return self._get_data(attr).get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2153
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2154
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2155
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2156
    def _set_value(self, datavalue, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2157
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2158
        Set the value for the feature the last configuration in the current hierarchy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2159
        @param value: The value for the feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2160
        @return: The created Data object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2161
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2162
        # Make sure that data value exists only once the the last configuration layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2163
        # 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
  2164
        # otherwise create a new data elem to the topmost layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2165
        dataobj = self._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2166
        last_config = self.get_root_configuration().get_last_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2167
        if dataobj and dataobj.find_parent(type=Configuration) == last_config:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2168
            dataobj.set_value(datavalue)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2169
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2170
            dataobj = Data(fqr=self.fqr, value=datavalue, attr=attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2171
            last_config.add_data(dataobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2172
            self._add_data(dataobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2173
        return dataobj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2174
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2175
    def _del_value(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2176
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2177
        Remove the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2178
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2179
        data = self._get_data(attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2180
        if data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2181
            dataattr = attr or self.defaultkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2182
            parentconfig = data.find_parent(type=Configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2183
            if parentconfig:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2184
                parentconfig.remove_data(data.get_fullfqr())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2185
            del self.datas[dataattr][-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2186
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2187
    def _get_values(self, attr=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2188
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2189
        Get the topmost data value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2190
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2191
        dataattr = attr or self.defaultkey
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2192
        return [dataelem.get_value() for dataelem in self.datas[dataattr]]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2193
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2194
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2195
class DataBase(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2196
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2197
        super(DataBase, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2198
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2199
    def _supported_type(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2200
        if isinstance(obj, (DataContainer, DataBase)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2201
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2202
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2203
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2204
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2205
    def _default_object(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2206
        return Data(ref=name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2207
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2208
    def count(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2209
        return len(self._objects())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2210
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2211
    def add(self, child, policy=container.REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2212
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2213
        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
  2214
        proxy function that call the correct add function based on the child objects class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2215
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2216
        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2217
        @param child: the child object to add
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2218
        @raise IncorrectClassError: if the given class cannot be added to this object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2219
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2220
        if isinstance(child, (Data)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2221
                self._add(child, container.APPEND)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2222
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2223
            raise exceptions.IncorrectClassError("Cannot add %s object to %s" % (child, self))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2224
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2225
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2226
class DataContainer(DataBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2227
    def __init__(self, ref="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2228
        super(DataContainer, self).__init__(ref, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2229
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2230
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2231
class Data(DataBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2232
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2233
    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
  2234
    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
  2235
    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
  2236
    is 'rfs'.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2237
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2238
    def __init__(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2239
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2240
        @param ref: the reference to the feature. E.g. foo
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2241
        @param fqr: the full reference to the feature. E.g. 'foo.bar' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2242
        @param value: the value of the data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2243
        @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
  2244
        for example 'rfs'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2245
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2246
        name = kwargs.get('ref', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2247
        self.fearef = kwargs.get('fqr', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2248
        if self.fearef:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2249
            (namespace, name) = utils.dottedref.psplit_ref(self.fearef)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2250
        super(Data, self).__init__(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2251
        self.value  = kwargs.get('value', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2252
        self.attr   = kwargs.get('attr') or 'data'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2253
        self.policy = kwargs.get('policy', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2254
        self.template = kwargs.get('template', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2255
        self.map    = kwargs.get('map')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2256
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2257
    def get_fearef(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2258
        if self.fearef:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2259
            return self.fearef
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2260
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2261
            return self.fqr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2262
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2263
    def get_value(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2264
        if self.map != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2265
            ref = utils.resourceref.to_dref(self.get_map_ref())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2266
            key = self.get_map_key_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2267
            dview = self.get_root_configuration().get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2268
            fea = dview.get_feature(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2269
            return fea.get_map_key_value(key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2270
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2271
            return self.value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2272
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2273
    def get_map(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2274
        return self.map
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2275
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2276
    def set_map(self, map):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2277
        self.map = map
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2278
        if self.value:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2279
            #Either value or mapping can be defined. Not both.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2280
            self.value = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2281
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2282
    def get_map_ref(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2283
        if self.map != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2284
            return utils.DataMapRef.get_feature_ref(self.map)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2285
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2286
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2287
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2288
    def get_map_key_value(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2289
        if self.map != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2290
            return utils.DataMapRef.get_key_value(self.map)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2291
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2292
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2293
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2294
    def set_value(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2295
        self.value = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2296
        if self.map:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2297
            #Either value or mapping can be defined. Not both.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2298
            self.map = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2299
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2300
    def get_policy(self): return self._policy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2301
    def set_policy(self, value): self._policy = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2302
    def del_policy(self):  self._policy = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2303
    policy = property(get_policy, set_policy, del_policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2304
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2305
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2306
class ValueSet(sets.Set):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2307
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2308
    A value set object to indicate a set of possible values for a feature. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2309
    e.g. A boolean feature ValueSet([True, False])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2310
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2311
    def __init__(self, initial_set=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2312
        super(ValueSet, self).__init__(initial_set or [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2313
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2314
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2315
class ValueRange(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2316
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2317
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2318
    def __init__(self, fromvalue, tovalue, step=1):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2319
        self.fromvalue = fromvalue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2320
        self.tovalue = tovalue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2321
        self.step = step
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2322
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2323
    def __contains__(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2324
        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
  2325
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2326
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2327
class ValueRe(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2328
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2329
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2330
    def __init__(self, regexp):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2331
        self.regexp = re.compile(regexp)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2332
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2333
    def __contains__(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2334
        if isinstance(value, str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2335
            return self.regexp.match(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2336
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2337
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2338
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2339
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2340
class Option(Base):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2341
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2342
    Confml option class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2343
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2344
    def __init__(self, name, value, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2345
        super(Option, self).__init__(Option.to_optref(value, kwargs.get('map', None)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2346
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2347
        self.value = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2348
        self.map = kwargs.get('map', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2349
        self.relevant = kwargs.get('relevant', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2350
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2351
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2352
    def to_optref(cls, value, map):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2353
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2354
        @return: An option reference converted from value or map, depending
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2355
            on which one is not None.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2356
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2357
        if value is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2358
            return "opt_value_%s" % value.replace('.', '').replace('/', '').replace(' ', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2359
        elif map is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2360
            return "opt_map_%s" % map.replace('.', '').replace('/', '').replace(' ', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2361
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2362
            raise ValueError("Both value and map are None!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2363
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2364
    def get_name(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2365
        return self.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2366
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2367
    def get_value(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2368
        return self.value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2369
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2370
    def __cmp__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2371
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2372
            ref = getattr(other, 'ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2373
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2374
            ref = other
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2375
        if self.ref < ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2376
            return -1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2377
        elif self.ref == ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2378
            return 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2379
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2380
            return 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2381
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2382
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2383
class Storage(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2384
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2385
    A general base class for all storage type classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2386
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2387
    """ File open modes """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2388
    MODE_UNKNOWN= -1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2389
    MODE_READ   = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2390
    MODE_WRITE  = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2391
    MODE_APPEND = 3
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2392
    MODE_DELETE = 4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2393
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2394
    def __init__(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2395
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2396
        @param path: the reference to the root of the storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2397
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2398
        self.rootpath = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2399
        self.curpath = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2400
        self.container = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2401
        self.__opened_res__ = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2402
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2403
    def __opened__(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2404
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2405
        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
  2406
        @param res: The resource object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2407
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2408
        if self.__opened_res__.has_key(res.path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2409
            self.__opened_res__[res.path].append(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2410
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2411
            self.__opened_res__[res.path] = [res]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2412
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2413
    def __closed__(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2414
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2415
        Internal function to remove a Resource object from the list of open resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2416
        @param res: The resource object to remove
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2417
        @raise StorageException if the given resource object is not found: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2418
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2419
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2420
            self.__opened_res__[res.path].remove(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2421
            if len(self.__opened_res__[res.path]) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2422
                del self.__opened_res__[res.path]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2423
        except KeyError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2424
            raise exceptions.StorageException("No such %s open resource! %s" % (res, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2425
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2426
    def __has_open__(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2427
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2428
        Internal function to find out if any Resource objects are open from given ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2429
        @param ref: The resource ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2430
        @return: True if resources found. Otherwise False.   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2431
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2432
        return self.__opened_res__.has_key(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2433
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2434
    def __get_open__(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2435
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2436
        Internal function to get all resource opened on a certain ref .
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2437
        @param ref: The resource ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2438
        @return: A list of open resources. Empty list if nothing is found   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2439
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2440
        if self.__has_open__(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2441
            # return a copy of currently open resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2442
            return self.__opened_res__[path][:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2443
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2444
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2445
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2446
    def __has_resource__(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2447
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2448
        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
  2449
        @param ref: The resource object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2450
        @return: True if resources found. Otherwise False.   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2451
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2452
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2453
            res = self.__opened_res__[res.path].index(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2454
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2455
        except KeyError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2456
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2457
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2458
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2459
    def open(cls,path, mode="r", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2460
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2461
        Class method for opening an instance of Storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2462
        @param path: path to storage, which will determine what type of storage is initiated. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2463
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2464
        # import all storage instances
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2465
        from cone.storage import storages
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2466
        for storagename in storages:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2467
            storagemodule = 'cone.storage.'+storagename
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2468
            module = __import__(storagemodule)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2469
        for storage_class in utils.all_subclasses(Storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2470
            if storage_class.supported_storage(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2471
                if hasattr(storage_class, '__open__'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2472
                    return storage_class.__open__(path, mode, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2473
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2474
                    return storage_class(path, mode, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2475
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2476
        obj = Storage(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2477
        return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2478
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2479
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2480
    def supported_storage(cls, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2481
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2482
        Class method for determing if the given clas supports a storage by given path. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2483
        E.g. foo.zip, foo.cpd, foo/bar, http://foo.com/
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2484
        @param path:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2485
        @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
  2486
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2487
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2488
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2489
    def set_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2490
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2491
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2492
        self.rootpath = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2493
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2494
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2495
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2496
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2497
        return self.rootpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2498
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2499
    def set_current_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2500
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2501
        @param path: the current path under the Storage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2502
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2503
        self.curpath = utils.resourceref.remove_end_slash(utils.resourceref.remove_begin_slash(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2504
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2505
    def get_current_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2506
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2507
        get the current path under the Storage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2508
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2509
        return self.curpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2510
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2511
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2512
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2513
        Close the repository, which will save and close all open resources.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2514
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2515
        for openref in self.__opened_res__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2516
            for res in self.__get_open__(openref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2517
                self.close_resource(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2518
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2519
    def save(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2520
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2521
        Flush changes from all resources to the repository.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2522
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2523
        for openref in self.__opened_res__.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2524
            for res in self.__get_open__(openref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2525
                self.save_resource(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2526
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2527
    def open_resource(self, path, mode="r"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2528
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2529
        Open the given resource and return a File object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2530
        @param path : reference to the resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2531
        @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
  2532
        raises a NotResource exception if the ref item is not a resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2533
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2534
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2535
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2536
    def delete_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2537
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2538
        Delete the given resource from storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2539
        @param path: reference to the resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2540
        raises a NotSupportedException exception if delete operation is not supported by the storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2541
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2542
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2543
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2544
    def close_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2545
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2546
        Close a given resource instance. Normally this is called by the Resource object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2547
        in its own close.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2548
        @param path the reference to the resource to close. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2549
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2550
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2551
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2552
    def is_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2553
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2554
        Return true if the ref is a resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2555
        @param ref : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2556
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2557
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2558
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2559
    def list_resources(self, path, recurse=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2560
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2561
        find the resources under certain ref/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2562
        @param ref : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2563
        @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
  2564
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2565
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2566
        return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2567
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2568
    def import_resources(self, paths, storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2569
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2570
        import resources from a list of resources to this storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2571
        @param paths : a list of Resourse objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2572
        @param storage : the external storage from which files are imported.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2573
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2574
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2575
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2576
    def export_resources(self, paths, storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2577
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2578
        export resources from this storage based on a list of reference to this storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2579
        @param path : a list of resource paths in this storage (references).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2580
        @param storage : the external storage where to export.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2581
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2582
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2583
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2584
    def close_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2585
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2586
        Close a given resource instance. Normally this is called by the Resource object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2587
        in its own close.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2588
        @param ref the reference to the resource to close. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2589
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2590
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2591
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2592
    def save_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2593
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2594
        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
  2595
        in its own save.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2596
        @param ref the reference to the resource to close. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2597
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2598
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2599
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2600
    def create_folder(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2601
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2602
        Create a folder entry to a path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2603
        @param path : path to the folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2604
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2605
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2606
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2607
    def delete_folder(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2608
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2609
        Delete a folder entry from a path. The path must be empty.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2610
        @param path : path to the folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2611
        """  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2612
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2613
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2614
    def is_folder(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2615
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2616
        Check if the given path is an existing folder in the storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2617
        @param path : path to the folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2618
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2619
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2620
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2621
    def get_mode(self, mode_str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2622
        if mode_str.find("w") != -1: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2623
            return self.MODE_WRITE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2624
        elif mode_str.find("r") != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2625
            return self.MODE_READ
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2626
        elif mode_str.find("a") != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2627
            return self.MODE_APPEND
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2628
        elif mode_str.find("d") != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2629
            return self.MODE_DELETE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2630
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2631
            return self.MODE_UNKNOWN
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2632
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2633
    def unload(self, path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2634
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2635
        Dump a given object to the storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2636
        @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
  2637
        of Base class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2638
        @param path: The reference where to store the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2639
        @param object: The object instance to dump 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2640
        @raise StorageException: if the given object cannot be dumped to this storage 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2641
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2642
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2643
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2644
    def load(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2645
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2646
        Load an object from a reference.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2647
        @param path: The reference where to load the object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2648
        @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
  2649
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2650
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2651
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2652
    path = property(get_path, set_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2653
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2654
class Resource(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2655
    STATE_OPEN = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2656
    STATE_CLOSE = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2657
    def __init__(self, storage, path, mode=Storage.MODE_READ):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2658
        self.storage = storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2659
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2660
        self.mode = mode
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2661
        self.state = Resource.STATE_OPEN
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2662
        self.content_info = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2663
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2664
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2665
        return self.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2666
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2667
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2668
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2669
        Close the resource. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2670
        Note1: the resource object cannot be accessed anymore after it has been closed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2671
        Note2: the changes are not automatically saved. The save operation must be explicitly called, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2672
        to save data. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2673
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2674
        self.storage.close_resource(self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2675
        self.state = Resource.STATE_OPEN
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2676
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2677
    def read(self, bytes=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2678
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2679
        Read data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2680
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2681
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2682
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2683
    def write(self, string):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2684
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2685
        Write data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2686
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2687
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2688
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2689
    def truncate(self, size=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2690
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2691
        Trunkate this resource data to the given size.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2692
        @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
  2693
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2694
        raise NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2695
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2696
    def save(self, size=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2697
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2698
        Save all changes to data to storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2699
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2700
        raise NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2701
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2702
    def get_mode(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2703
        return self.storage.get_mode(self.mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2704
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2705
    def get_size(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2706
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2707
        Return the size of this resource in bytes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2708
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2709
        Note that this does not work in write mode.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2710
        @return: The resource size in bytes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2711
        @raise exceptions.StorageException: The resource was opened in write mode.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2712
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2713
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2714
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2715
    def get_content_info(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2716
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2717
        Return the ContentInfo class that contains content information about
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2718
        resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2719
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2720
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2721
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2722
class ContentInfo(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2723
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2724
    A ContentInfo object is used to describe content of Resource. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2725
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2726
    logger = logging.getLogger('cone.contentinfo')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2727
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2728
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2729
    def __init__(self, mimetype, mimesubtype):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2730
        #: MIME Media type (http://www.iana.org/assignments/media-types/)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2731
        #: as a string. E.g. 'image' or 'application'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2732
        self.mimetype = mimetype
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2733
        #: MIME Media subtype as a string. E.g. 'svg+xml' or 'bmp'.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2734
        self.mimesubtype = mimesubtype
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2735
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2736
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2737
    def content_type(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2738
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2739
        Returns MIME Media type (http://www.iana.org/assignments/media-types/) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2740
        and subtype as a string. E.g. 'image/bmp'. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2741
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2742
        return self.mimetype + '/' + self.mimesubtype
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2743
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2744
class ImageContentInfo(ContentInfo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2745
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2746
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2747
    A ImageContentInfo object is used to describe content of image Resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2748
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2749
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2750
        ContentInfo.__init__(self, 'image', '')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2751
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2752
class BmpImageContentInfo(ImageContentInfo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2753
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2754
    A BmpImageContentInfo object is used to describe content of bmp image 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2755
    Resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2756
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2757
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2758
    _BMP_BITS_PER_PIXEL_OFFSET_ = int('0x1C', 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2759
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2760
    def __init__(self, resource, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2761
        ContentInfo.__init__(self, 'image', 'bmp')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2762
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2763
        #: Color depth as bits per pixel.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2764
        self.color_depth = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2765
        if (resource != None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2766
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2767
                self.color_depth = ord(data[self._BMP_BITS_PER_PIXEL_OFFSET_])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2768
            except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2769
                self.logger.warning("Invalid BMP-file: %s" % resource.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2770
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2771
class Folder(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2772
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2773
    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
  2774
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2775
    def __init__(self, storage, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2776
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2777
        Create a layer folder to the storage if it does not exist.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2778
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2779
        #if not storage.is_folder(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2780
        #    storage.create_folder(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2781
        self.storage = copy.copy(storage)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2782
        self.storage.set_current_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2783
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2784
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2785
        return getattr(self.storage, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2786
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2787
class CompositeLayer(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2788
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2789
    A base class for composite Configuration objects.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2790
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2791
    def __init__(self, path="", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2792
        self.layers = kwargs.get('layers', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2793
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2794
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2795
    def add_layer(self, layer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2796
        self.layers.append(layer)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2797
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2798
    def remove_layer(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2799
        if self.get_layer(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2800
            self.layers.remove(self.get_layer(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2801
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2802
            raise exceptions.NotFound('Layer with given path %s not found!' % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2803
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2804
    def get_layer(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2805
        for layer in self.layers:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2806
            if layer.get_current_path() == path:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2807
                return layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2808
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2809
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2810
    def list_layers(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2811
        return [layer.get_current_path() for layer in self.layers]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2812
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2813
    def list_confml(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2814
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2815
        @return: array of confml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2816
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2817
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2818
        for layerpath in self.list_layers():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2819
            for respath in self.get_layer(layerpath).list_confml():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2820
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2821
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2822
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2823
    def list_implml(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2824
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2825
        @return: array of implml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2826
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2827
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2828
        for layerpath in self.list_layers():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2829
            for respath in self.get_layer(layerpath).list_implml():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2830
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2831
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2832
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2833
    def list_content(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2834
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2835
        @return: array of content file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2836
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2837
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2838
        for layerpath in self.list_layers():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2839
            for respath in self.get_layer(layerpath).list_content():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2840
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2841
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2842
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2843
    def list_doc(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2844
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2845
        @return: array of document file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2846
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2847
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2848
        for layerpath in self.list_layers():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2849
            for respath in self.get_layer(layerpath).list_doc():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2850
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2851
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2852
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2853
    def list_all_resources(self, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2854
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2855
        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
  2856
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2857
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2858
        for layerpath in self.list_layers():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2859
            sublayer = self.get_layer(layerpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2860
            for respath in sublayer.list_all_resources(empty_folders):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2861
                lres.append(utils.resourceref.join_refs([layerpath, respath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2862
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2863
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2864
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2865
class Layer(CompositeLayer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2866
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2867
    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
  2868
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2869
    def __init__(self, storage, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2870
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2871
        Create a layer folder to the storage if it does not exist.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2872
        @param storage: a reference to the Storage object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2873
        @param path: path for the layer 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2874
        @param confml_path: optional parameter for confml files path (give in confml_path="something") 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2875
        @param imlpml_path: optional parameter for implml files path (give in implml_path="something")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2876
        @param content_path: optional parameter for content files path (give in content_path="something")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2877
        @param doc_path: optional parameter for doc files path (give in doc_path="something")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2878
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2879
        super(Layer, self).__init__(path, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2880
        #if not storage.is_folder(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2881
        #    storage.create_folder(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2882
        self.storage = copy.copy(storage)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2883
        self.storage.set_current_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2884
        self.predefined = {'confml_path' : 'confml', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2885
                           'implml_path' : 'implml', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2886
                           'content_path' : 'content', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2887
                           'doc_path' : 'doc'}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2888
        # list through all "hardcoded" paths and check whether the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2889
        # hardcoded or given path exists under this Layer. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2890
        # if it does then create a folder instance to that path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2891
        for (pretag, prevalue) in self.predefined.items():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2892
            self.predefined[pretag] = kwargs.get(pretag, prevalue)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2893
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2894
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2895
        return getattr(self.storage, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2896
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2897
    def list_confml(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2898
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2899
        @return: array of confml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2900
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2901
        res = self.storage.list_resources(self.predefined['confml_path'], True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2902
        res += super(Layer, self).list_confml()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2903
        return res 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2904
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2905
    def list_implml(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2906
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2907
        @return: array of implml file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2908
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2909
        res = self.storage.list_resources(self.predefined['implml_path'], True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2910
        res += super(Layer, self).list_implml()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2911
        return res 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2912
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2913
    def list_content(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2914
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2915
        @return: array of content file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2916
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2917
        res = self.storage.list_resources(self.predefined['content_path'], True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2918
        res += super(Layer, self).list_content()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2919
        return res
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2920
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2921
    def list_doc(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2922
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2923
        @return: array of document file references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2924
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2925
        res = self.storage.list_resources(self.predefined['doc_path'], True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2926
        res += super(Layer, self).list_doc()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2927
        return res
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2928
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2929
    def confml_folder(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2930
        cpath = self.storage.get_current_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2931
        spath = self.predefined['confml_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2932
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2933
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2934
    def implml_folder(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2935
        cpath = self.storage.get_current_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2936
        spath = self.predefined['implml_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2937
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2938
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2939
    def content_folder(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2940
        cpath = self.storage.get_current_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2941
        spath = self.predefined['content_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2942
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2943
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2944
    def doc_folder(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2945
        cpath = self.storage.get_current_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2946
        spath = self.predefined['doc_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2947
        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2948
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2949
    def list_all_resources(self, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2950
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2951
        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
  2952
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2953
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2954
        mypath = self.get_current_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2955
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2956
        for folderpath in sorted(self.predefined.values()):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2957
            lres += self.storage.list_resources(folderpath, recurse=True, empty_folders=empty_folders)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2958
                 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2959
        lres += super(Layer, self).list_all_resources(empty_folders)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2960
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2961
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2962
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2963
    def list_all_related(self, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2964
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2965
        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
  2966
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2967
        lres = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2968
        predef = self.predefined.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2969
        del predef['confml_path']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2970
        mypath = self.get_current_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2971
        for folderpath in sorted(predef.values()):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2972
            lres += self.storage.list_resources(folderpath, recurse=True, empty_folders=empty_folders)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2973
        lres += super(Layer, self).list_all_resources(empty_folders=empty_folders)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2974
       
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2975
        return lres
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2976
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2977
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2978
class Rule(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2979
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2980
    Base class for Rules in the system.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2981
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2982
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2983
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2984
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2985
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2986
class FactoryBase(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2987
    pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2988
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2989
class Factory(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2990
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2991
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2992
        The Factory getattr find all subclasses for the Factory and searches for given attr 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2993
        in those.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2994
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2995
        for sub_factory in utils.all_subclasses(FactoryBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2996
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2997
                return getattr(sub_factory(), name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2998
            except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2999
                continue 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3000
        raise AttributeError("type object %s has no attribute '%s'" % (self.__class__, name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3001
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3002
def get_mapper(modelname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3003
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3004
    Return a instance of appropriate mapper for given model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3005
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3006
    mapmodule = __import__('cone.public.mapping')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3007
    return mapmodule.public.mapping.BaseMapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3008
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3009
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3010
##################################################################
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3011
class NullHandler(logging.Handler):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3012
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3013
    Default handler that does not do anything.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3014
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3015
    def emit(self, record):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3016
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3017
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3018
#Initialization of default logger that contains NullHandler.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3019
logger = logging.getLogger('cone')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  3020
logger.addHandler(NullHandler())