configurationengine/source/cone/public/container.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
Container classes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
Mainly internal classed that the public data model uses internally.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import pickle
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 utils, exceptions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
def object_container_filter(obj,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
    """ Create a list of filter functions for each argument """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
    filters=[]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
    if kwargs.has_key('name'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
        filters.append(lambda x: re.match(kwargs.get('name'), x._name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    if kwargs.has_key('path'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
        filters.append(lambda x: re.match(kwargs.get('path'), x._path()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    if kwargs.has_key('type'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
        filters.append(lambda x: isinstance(x, kwargs.get('type')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    if kwargs.has_key('filters'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
        filters += kwargs.get('filters')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    for sobj in utils.get_list(obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
        if utils.filter(obj,filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
            ret.append(sobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
    return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
def _apply_filter(obj,filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    """ Create a list of filter functions for each argument """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    if utils.filter(obj,filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        return [obj]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
""" object container adding policies """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
REPLACE = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
APPEND = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
PREPEND = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
ERROR = 3
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
class DataContainer(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
    Class for data containers. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
    Container is a data storage that can hold several keys, where each key is unique. Each key however 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
    can hold several values, where the active value is the last one added. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    Example:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
    data = {'key1' :[1,2,3,4], 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
            'key2' :['foo','bar],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
            'key3' :['testing'],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
            'path/to/key' :['some','value','in','here','too']}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    The active values for keys are the last ones in the array. E.g. key1 = 4.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        self.data = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
    def list_keys(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        List all keys of the DataStorage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        return self.data.keys()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
    def add_value(self,key,value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        Add the value as a topmost item for the given key.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        @param key: name for the key to store the data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        @param value: the value to store.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        if self.data.has_key(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
            self.data[key].append(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
            self.data[key] = [value]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
    def remove_value(self,key,value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        remove individual value of the key value array
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        self.data[key].remove(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
    def remove_key(self,key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        del self.data[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
    def get_value(self,key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        self.data = {'key1' :[1,2,3,4], 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
                    'key2' :['foo','bar],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
                    'key3' :['testing'],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
                    'path/to/key' :['some','value','in','here','too']}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        self.get_value('key1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        return self.data[key][-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
    def get_values(self,key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        return a copy of data values inside the container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        values = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        values.extend(self.data[key])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        return values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
    def flatten(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
        return a new dictionary of the DataContainer data with only single values for each key, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        instead of the array of values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        rest = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        for key in self.data.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
            rest[key] = self.get_value(key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        return rest
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
    def clear(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        Remove all data from the container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        return self.data.clear()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
class ContainerBase(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
    def _set_parent(self, newparent):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        @param newparent:  The new parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
        self._parent = newparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
    def _get_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        @return: existing parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        return self._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
    def _del_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
        Set the current parent to None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        self._parent = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
    parent = property(_get_parent, _set_parent,_del_parent)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
class ObjectProxy(ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
    An object proxy class. The ObjectProxy overrides the python builtin methdo __getattr__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
    to redirect any function/member access to the subobject.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
    def __init__(self,obj=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        self._obj  = obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        self._parent = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
    def __getattr__(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        return getattr(self._obj,name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
#    def _set_parent(self, newparent):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
#        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
#        @param newparent:  The new parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
#        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
#        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
#        self._parent = newparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
#        if isinstance(self._obj, ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
#            self._obj._set_parent(newparent)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
class LoadInterface(ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
    def load(self,ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        file = open(ref,"r")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        self._parent = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        return pickle.load(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
    def unload(self,ref, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        unload or release
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
        file = open(ref,"w")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
        pickle.dump(obj,file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        file.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
        return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
class LoadProxy(ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
    This class is meant for loading & unloading an object, when it need.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
    def __init__(self, path, store_interface=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
        @param path: the path which is used in loadin
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        @param store_interface: the loading interface object, which is used. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        Expects load(path) and dump(obj) functions  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
        self.set('_obj', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
        self.set('_parent', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        self.set('path', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
        self.set('_storeint', store_interface)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    def __getattr__(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        if not self._obj: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
            self._load()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        return getattr(self._obj,name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
    def __setattr__(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        direct attribute setting calls to the sub object setattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        if not self._obj: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
            self._load()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        setattr(self._obj,name,value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
    def __delattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        direct attribute setting calls to the sub object setattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        if not self._obj: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
            self._load()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        delattr(self._obj,name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
    def _set_parent(self, newparent):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
        @param newparent:  The new parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        self.set('_parent',newparent)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        if self._obj:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
            self._obj._parent = self._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
    def _set_obj(self, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        self.set('_obj',obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        # set the same _parent for the actual object as is stored for the proxy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        self._obj._parent = self._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        self._obj.set_path(self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
    def _get_obj(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        if not self._obj: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
            self._load()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
        return self._obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
    def _load(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
        # Should the loading of layer external resources be supported?
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        # E.g. resources with absolute path relative to the storage (starts with slash)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        """ If the loading of the object fails => Raise an InvalidObject exception """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
            obj = self._store_interface().load(self.fullpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
            self._set_obj(obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
            obj.set_ref(utils.resourceref.to_objref(self.path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        except exceptions.NotResource,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
            logging.getLogger('cone').warning("Loading %s from parent %s failed! %s" % (self.path,self.get_parent_path(), e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
            raise exceptions.InvalidObject("Invalid configuration object %s" % self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
    def _unload(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
        if self._obj:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
            self._store_interface().unload(self.fullpath, self._obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
            self.set('_obj',None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
    def _store_interface(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
        if not self._storeint:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
            self.set('_storeint',self._parent.get_project())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
        return self._storeint
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
    def set(self,name,value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        Proxy has a specific attribute setting function, because by default all attributes are 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        stored to the actual proxy object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        self.__dict__[name] = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
    def get(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        Proxy has also a specific attribute getting function, because by default all attributes are 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        stored to the actual proxy object  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        return self.__dict__[name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
    def save(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        if hasattr(self._obj,'save'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
            self._obj.save()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        self._unload()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        if hasattr(self._obj,'close'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
            self._obj.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
    def get_parent_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        if self._parent:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
            return utils.resourceref.get_path(self._parent.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
            return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        if self._obj:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
            return self._obj.get_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
            return self.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
    def fullpath(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
            return self._obj.get_full_path() 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
            parent_path = self.get_parent_path() 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
            return utils.resourceref.join_refs([parent_path,self.path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
class ObjectContainer(ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
    An object container class. The ObjectContainer is actually a Tree data structure. Any ObjectContainer 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
    instance can include any number of children, that must be instances of ObjectContainer.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
    def __init__(self,name="",**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        if len(name.split(".")) > 1 or len(name.split("/")) > 1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
            raise exceptions.InvalidRef("Illegal name for ObjectContainer %s" % name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
        self._name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        self._parent = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
        self._order = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        self._children = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        for arg in kwargs.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
            setattr(self, arg, kwargs.get(arg))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
    def __getattr__(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
            return self.__dict__['_children'][name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
            return getattr(super(ObjectContainer),name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
    def _path(self, toparent=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        Get the path to this ObjectContainer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        @param toparent: the _parent object up to which the path is relative. Default value is None.,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        which gives the fully qualified path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        @return: The path to the ObjectContainer from toparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
        if self == toparent:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
            return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
        elif self._parent and self._parent != toparent:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
            # return the path with list index if the given element is in a list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
            if utils.is_list(self.parent._get(self._name)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
                return self._parent._path(toparent)+"."+"%s[%s]" % (self._name,self.get_index())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
                return self._parent._path(toparent)+"."+self._name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
            return self._name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
    def _add(self, child, policy=REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
        Add a child object. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
        @param child: The child object to add. The child needs to be an instance of ObjectContainer. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
        @param policy: The policy which is used when an object with same name exists already  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        # check that the child is a supported type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
        if not self._supported_type(child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
            raise exceptions.IncorrectClassError("Cannot add instance of %s to %s." % (child.__class__,self.__class__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        if policy == REPLACE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
            self._replace(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
        elif policy == ERROR:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
            self._error(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
        elif policy == APPEND:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
            self._append(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
        elif policy == PREPEND:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
            self._prepend(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
    def _append(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
        Add the given child to the proper key. Create a list entry if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
            # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
                self._order.append(child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
            self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
            """ Create a list under the child name """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
            self._children[child._name] = utils.add_list(self._children[child._name], child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
    def _prepend(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
        Add the given child to the proper key. Create a list entry if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
            # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
                self._order.insert(0,child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
            self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
            """ Create a list under the child name """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
            self._children[child._name] = utils.prepend_list(self._children[child._name], child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
    def _replace(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
        If the given child already exists => Replace the child, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
        but maintain the current children of that child 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
        # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
                self._order.append(child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
            """ if the existing child is a instance of ObjectContainer, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
                add all children of the existing contianer to this new object """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
            existingchild = self._children[child._name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
            if isinstance(existingchild, ObjectContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
                for subchild in existingchild._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
                     child._add(subchild)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
        self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
    def _error(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
        If the given child already exists => raise an exception.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
        @raise exceptions.AlreadyExists: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
            # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
                self._order.insert(0,child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
            self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
            raise exceptions.AlreadyExists('Child %s already exists' % child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
    def _add_to_path(self, path, child, policy=REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
        Add a child object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
        @param path: the path for the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
        @param child: The child object to add 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
        @param namespace: The namespace of the object, which defines where the object is created  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
        # check that the child is a supported type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
        if not self._supported_type(child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
            raise exceptions.IncorrectClassError("Cannot add instance of %s to %s Container" % (child.__class__,self.__class__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
        # ensure that the elements to the namespace exist  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
        curelem = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
        for ppath in utils.dottedref.split_ref(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
            if not curelem._children.has_key(ppath):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
                # Create missing elem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
                curelem._add(self._default_object(ppath))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
            curelem = curelem._get(ppath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
        curelem._add(child,policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
    def _get(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        Get a child object by it path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
        @return: The child object if it is found. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
        @raise NotFound: when object is not found from the children.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
            # traverse to the actual child element 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
            curelem = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
            for pathelem in utils.dottedref.split_ref(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
                if utils.dottedref.get_index(pathelem) == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
                    curelem = curelem._children[pathelem]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
                    # If the given pathelem is referring to a list 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
                    name = utils.dottedref.get_name(pathelem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
                    index = utils.dottedref.get_index(pathelem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
                    curelem = utils.get_list(curelem._children[name])[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
            return curelem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
        # Catch the KeyError exception from dict and IndexError from list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
        except (KeyError,IndexError): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
            raise exceptions.NotFound("Child %s not found!" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
    def _has(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
        Returns True if an element under the path is found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
        @return: Boolean value. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
            # traverse to the actual child element 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
            curelem = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
            for pathelem in utils.dottedref.split_ref(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
                curelem = curelem._children[pathelem]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
        except KeyError: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
    def _remove(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
        Remove a child object by it path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
        # if the patherence is a long patherence (dotted name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
        # first get the _parent object and call the remove to the _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
        (parentref,name) = utils.dottedref.psplit_ref(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
        if parentref != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
            self._get(parentref)._remove(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
        elif utils.dottedref.get_index(path) != None and \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
             self._get(utils.dottedref.get_name(path)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
            # Delete If the given pathelem is referring to a list 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
            name = utils.dottedref.get_name(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
            index = utils.dottedref.get_index(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
            del self._children[name][index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
            if len(self._children[name]) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
                del self._order[self._order.index(name)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
        elif self._get(path) != None: # delete if the child is found
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
            del self._children[path]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
            del self._order[self._order.index(path)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
            raise exceptions.NotFound("Child %s not found!" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
    def _list_traverse(self,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
        Return a list of all children paths. This function calls internally __traverse__, see it for 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
        more details.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
        @return: an unordered list of children paths. The path is relative to this node. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
        return [child._path(self) for child in self._traverse(**kwargs)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
    def _traverse(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
        The traverse goes recursively through the tree of children of this node and returns a result set as list.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
        Arguments can be passed to it to filter out elements of the result set. All arguments are 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
        given as dict, so they must be given with name. E.g. _traverse(name='test')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
        @param name: The node name or part of name which is used as a filter. This is a regular expression (uses internally re.match()) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
        @param path: The path name or part of name which is used as a filter. This is a regular expression (uses internally re.match())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
        @param filters: A list of predefined filters can be given as lambda functions. E.g. filters=[lambda x: isinstance(x._obj, FooClass)]  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
        @return: a list of ObjectContainer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
        filterlist=[]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
        if kwargs.has_key('ref'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
            filterlist.append(lambda x: re.match(kwargs.get('ref'), x.ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
        if kwargs.has_key('name'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
            filterlist.append(lambda x: re.match(kwargs.get('name'), x._name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
        if kwargs.has_key('path'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
            filterlist.append(lambda x: re.match(kwargs.get('path'), x._path()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
        if kwargs.has_key('type'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
            filterlist.append(lambda x: isinstance(x, kwargs.get('type')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
        if kwargs.has_key('filters'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
            filterlist += kwargs.get('filters')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
        ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
            subchildren = child._tail_recurse(_apply_filter,filters=filterlist)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
            ret += subchildren
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
    def _find_leaves(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
        Find all leaf nodes in the tree that satisfy the given filtering criteria.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
        For possible keyword arguments see _traverse().
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
        @return: A list of ObjectContainer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
        # Find all children
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
        nodes = self._traverse(**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        # Filter out non-leaves
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
        return filter(lambda node: len(node._objects()) == 0, nodes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
    def _tail_recurse(self, function, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
        Run a tail recursion on all container children and execute the given function.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
        1. function will receive self as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
        2. function will receive all kwargs as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
        3. tail recursion means that the function is executed first and then the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
        recursion continues.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
        @param function: the function which is executed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
        @param kwargs: a list of arguments as dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
        @return: an list of objects, which can be anything that the funtion returns   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
        ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
        ret += function(self,**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
                # We wont add the object to the ret until we know that it is a valid object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
                subchildren = child._tail_recurse(function,**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
                #ret += function(child,**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
                ret += subchildren
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
            except exceptions.InvalidObject,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
                # remove the invalid object from this container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   625
                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   626
                self._remove(child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   627
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   628
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   629
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   630
    def _head_recurse(self, function,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   631
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   632
        Run a tail recursion on all container children and execute the given function.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   633
        1. function will receive self as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   634
        2. function will receive all kwargs as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   635
        3. head recursion means that the recursion continues to the leaf nodes and then the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   636
        execution of the function begins.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   637
        @param function: the function which is executed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
        @param kwargs: a list of arguments as dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   639
        @return: an list of objects, which can be anything that the funtion returns   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   640
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   641
        ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   642
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   643
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   644
                ret += child._head_recurse(function,**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   645
                ret += function(child,**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   646
            except exceptions.InvalidObject,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   647
                # remove the invalid object from this container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   648
                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   649
                self._remove(child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   650
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   653
    def _list(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   654
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   655
        Return a array of immediate children names.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   656
        @return: an unordered list of immediate children path-references
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   657
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   658
        # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
        return [name for name in self._order if not name.startswith('?')] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
    def _objects(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
        Return a array of immediate children.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
        @return: an unordered list of immediate children
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
        ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
        for cname in self._order:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
                if object_container_filter(self._children[cname], **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   670
                    ret += utils.get_list(self._children[cname])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   671
            except exceptions.InvalidObject,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   672
                # remove the invalid object from this container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   673
                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   674
                self._remove(cname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   675
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   676
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   677
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   678
    def _get_index(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   679
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   680
        Get the index of a child object by its name. The index matches the index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   681
        of the child object in the _children array. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   682
        @return: integer. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   683
        @raise NotFound: when object is not found from the children.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   684
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   685
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   686
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   687
            return self._order.index(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   688
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   689
            raise exceptions.NotFound("Child %s not found!" % name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   690
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   691
    def _supported_type(self,obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   692
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   693
        An internal function to check that the given object is a supported for this Tree. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   694
        This is used in every __add__ operation to check whether the object can be added to the tree.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   695
        This function should be overloaded by a subclass if the supported types need to be changed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   696
        @return: True if object is supported, otherwise false.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   697
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   698
        return isinstance(obj, ObjectContainer)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   699
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   700
    def _default_object(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   701
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   702
        An internal function to create a default object for this container in case of __add_to_path__, which
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   703
        creates the intermediate objects automatically. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   704
        This function should be overloaded by a subclass if the default object need to be changed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   705
        @return: A new object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   706
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   707
        return ObjectContainer(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   708
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   709
    def _find_parent(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   710
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   711
        find a _parent object by arguments. You can define any number of object attributes that 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   712
        have to match to the object. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   713
        Example1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   714
           _find_parent(foobar=True) searches for a _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   715
          object which has a member attribute foobar and its value is True. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   716
        Example2:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   717
           _find_parent(name="test") searches for a _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   718
          object which has a member attribute name and its value is "test". 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   719
        Example3: type is a special case
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   720
           _find_parent(type=Configuration) searches for a _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   721
          object which is an instance of Configuration (checked with isinstance). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   722
        @param kwargs: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   723
        @return: The object that matches the arguments
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   724
        @raise exceptions.NotFound: When no matching parent is found
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   725
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   726
        type = kwargs.get('type', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   727
        if hasattr(self,'_parent') and self._parent != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   728
            found = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   729
            for key in kwargs.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   730
                try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   731
                    # handle type as a special case
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   732
                    if key == 'type':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   733
                        if not isinstance(self._parent, kwargs.get(key)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   734
                            found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   735
                            break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   736
                    elif key == 'match':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   737
                        if not self._parent == kwargs.get(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   738
                            found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   739
                            break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   740
                    elif not getattr(self._parent, key) == kwargs.get(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   741
                        found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   742
                        break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   743
                except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   744
                    found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   745
                    break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   746
            if found:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   747
                return self._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   748
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   749
                return self._parent._find_parent(**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   750
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   751
            raise exceptions.NotFound("Parent not found!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   752
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   753
    def _find_parent_or_default(self, default=None,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   754
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   755
        Calls internally the find parent function, which is encapsulated with try except 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   756
        returns the given default value if find parent raises NotFound exception. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   757
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   758
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   759
            return self._find_parent(**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   760
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   761
            return default
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   762
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   763
    def set_ref(self,ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   764
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   765
        @param ref: The new reference of the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   766
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   767
        self._name = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   768
        self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   769
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   770
    def get_ref(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   771
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   772
        @return: The reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   773
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   774
        return self.ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   775
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   776
class ObjectProxyContainer(ObjectProxy,ObjectContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   777
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   778
    Combines the Container and Proxy classes to one.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   779
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   780
    def __init__(self,obj=None,name=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   781
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   782
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   783
        ObjectContainer.__init__(self,name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   784
        ObjectProxy.__init__(self,obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   785
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   786
    def __getattr__(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   787
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   788
        First check if the requested attr is a children then 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   789
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   790
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   791
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   792
            return self.__dict__['_children'][name] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   793
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   794
            return getattr(self._obj,name)