configurationengine/source/cone/public/container.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
child 4 0951727b8815
permissions -rw-r--r--
ConE 1.2.11 release
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
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    25
import utils
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    26
from cone.public import exceptions
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
def object_container_filter(obj,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
    """ Create a list of filter functions for each argument """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
    filters=[]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
    if kwargs.has_key('name'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
        filters.append(lambda x: re.match(kwargs.get('name'), x._name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    if kwargs.has_key('path'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
        filters.append(lambda x: re.match(kwargs.get('path'), x._path()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    if kwargs.has_key('type'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
        filters.append(lambda x: isinstance(x, kwargs.get('type')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    if kwargs.has_key('filters'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        filters += kwargs.get('filters')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    for sobj in utils.get_list(obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        if utils.filter(obj,filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
            ret.append(sobj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
    return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
def _apply_filter(obj,filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    """ Create a list of filter functions for each argument """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    if utils.filter(obj,filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        return [obj]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
""" object container adding policies """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
REPLACE = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
APPEND = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
PREPEND = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
ERROR = 3
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
class DataContainer(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
    Class for data containers. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
    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
    63
    can hold several values, where the active value is the last one added. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
    Example:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
    data = {'key1' :[1,2,3,4], 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
            'key2' :['foo','bar],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
            'key3' :['testing'],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
            'path/to/key' :['some','value','in','here','too']}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
    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
    72
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        self.data = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
    def list_keys(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        List all keys of the DataStorage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        return self.data.keys()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    def add_value(self,key,value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        Add the value as a topmost item for the given key.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        @param key: name for the key to store the data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        @param value: the value to store.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        if self.data.has_key(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
            self.data[key].append(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
            self.data[key] = [value]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
    def remove_value(self,key,value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        remove individual value of the key value array
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        self.data[key].remove(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    def remove_key(self,key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        del self.data[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
    def get_value(self,key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        self.data = {'key1' :[1,2,3,4], 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
                    'key2' :['foo','bar],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
                    'key3' :['testing'],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
                    'path/to/key' :['some','value','in','here','too']}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        self.get_value('key1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        return self.data[key][-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
    def get_values(self,key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        return a copy of data values inside the container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        values = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        values.extend(self.data[key])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        return values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
    def flatten(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        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
   127
        instead of the array of values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        rest = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        for key in self.data.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
            rest[key] = self.get_value(key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        return rest
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
    def clear(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        Remove all data from the container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        return self.data.clear()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
class ContainerBase(object):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   141
    def __init__(self, name="",**kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   142
        if len(name.split(".")) > 1 or len(name.split("/")) > 1:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   143
            raise exceptions.InvalidRef("Illegal name for ObjectContainer %s" % name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   144
        self._name = name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   145
        self._parent = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   146
        self._order = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   147
        self._children = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   148
        self._respath = ""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   149
        for arg in kwargs.keys():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   150
            setattr(self, arg, kwargs.get(arg))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   151
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   152
    def __getstate__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   153
        state = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   154
        if self._parent: state['_parent'] = self._parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   155
        if self._order: state['_order'] = self._order
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   156
        if self._children: state['_children'] = self._children
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   157
        if self._respath: state['_respath'] = self._respath
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   158
        return state
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   160
    def __setstate__(self, state):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   161
        self._name = state.get('ref','')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   162
        self._parent = state.get('_parent',None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   163
        self._order = state.get('_order',[])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   164
        self._children = state.get('_children',{})
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   165
        self._respath = state.get('_respath',"")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   166
        # update the parent link for all the children of this object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   167
        for child in self._objects():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   168
            child._parent = self
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
    def _set_parent(self, newparent):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        @param newparent:  The new parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        self._parent = newparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
    def _get_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        @return: existing parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
        return self._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
    def _del_parent(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        Set the current parent to None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
        self._parent = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   189
    def get_store_interface(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   190
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   191
        Get a possible store interface for this ContainerBase object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   192
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   193
        return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   194
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   195
    def get_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   196
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   197
        Return the path of the object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   198
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   199
        return self._respath
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   200
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
    parent = property(_get_parent, _set_parent,_del_parent)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
class ObjectProxy(ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
    An object proxy class. The ObjectProxy overrides the python builtin methdo __getattr__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
    to redirect any function/member access to the subobject.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
    def __init__(self,obj=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        self._obj  = obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        self._parent = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
    def __getattr__(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        return getattr(self._obj,name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
#    def _set_parent(self, newparent):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
#        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
#        @param newparent:  The new parent object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
#        @return: None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
#        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
#        self._parent = newparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
#        if isinstance(self._obj, ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
#            self._obj._set_parent(newparent)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
class LoadInterface(ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
    def load(self,ref):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   233
        file = open(ref,"rb")
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        self._parent = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        return pickle.load(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
    def unload(self,ref, obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        unload or release
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   241
        file = open(ref,"wb")
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        pickle.dump(obj,file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        file.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
    def get_path(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        Return the path of the configuration resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
        return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
class ObjectContainer(ContainerBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
    An object container class. The ObjectContainer is actually a Tree data structure. Any ObjectContainer 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
    instance can include any number of children, that must be instances of ObjectContainer.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
    def __init__(self,name="",**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   260
        super(ObjectContainer,self).__init__(name, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
    def __getattr__(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
            return self.__dict__['_children'][name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        except KeyError:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   269
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   270
                return getattr(super(ObjectContainer),name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   271
            except AttributeError,e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   272
                raise AttributeError("%s object has not attribute '%s'" % (self.__class__, name))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
    def _path(self, toparent=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
        Get the path to this ObjectContainer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        @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
   278
        which gives the fully qualified path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
        @return: The path to the ObjectContainer from toparent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
        if self == toparent:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
            return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
        elif self._parent and self._parent != toparent:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
            # return the path with list index if the given element is in a list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
            if utils.is_list(self.parent._get(self._name)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
                return self._parent._path(toparent)+"."+"%s[%s]" % (self._name,self.get_index())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
                return self._parent._path(toparent)+"."+self._name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
            return self._name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   292
    def _add(self, child_or_children, policy=REPLACE):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   294
        Add a child object or multiple child objects. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   295
        @param child_or_children: The child object or list of child objects to add.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   296
            The children need to be instances of ObjectContainer. 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        @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
   298
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   299
        if isinstance(child_or_children, list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   300
            objs = child_or_children
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   301
            if policy == PREPEND:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   302
                objs = reversed(objs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   303
                policy_first = PREPEND
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   304
                policy_rest = PREPEND
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   305
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   306
                policy_first = policy
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   307
                policy_rest = APPEND
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   308
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   309
            for i, obj in enumerate(objs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   310
                if i == 0:  p = policy_first
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   311
                else:       p = policy_rest
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   312
                self._add(obj, p)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   313
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   314
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   315
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
        # check that the child is a supported type
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   317
        child = child_or_children
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        if not self._supported_type(child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
            raise exceptions.IncorrectClassError("Cannot add instance of %s to %s." % (child.__class__,self.__class__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        if policy == REPLACE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
            self._replace(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
        elif policy == ERROR:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
            self._error(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        elif policy == APPEND:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
            self._append(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        elif policy == PREPEND:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
            self._prepend(child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
    def _append(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
        Add the given child to the proper key. Create a list entry if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
            # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
                self._order.append(child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
            self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
            """ Create a list under the child name """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
            self._children[child._name] = utils.add_list(self._children[child._name], child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
    def _prepend(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        Add the given child to the proper key. Create a list entry if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
            # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
                self._order.insert(0,child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
            self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
            """ Create a list under the child name """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
            self._children[child._name] = utils.prepend_list(self._children[child._name], child)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
    def _replace(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        If the given child already exists => Replace the child, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
        but maintain the current children of that child 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
                self._order.append(child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   370
            """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   371
            if the existing child is a instance of ObjectContainer, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   372
            add all children of the existing container to this new object, except if the 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   373
            child already exists in the new child. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   374
            """
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
            existingchild = self._children[child._name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
            if isinstance(existingchild, ObjectContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
                for subchild in existingchild._objects():
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   378
                    if not child._children.has_key(subchild._name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   379
                        child._add(subchild)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   380
                     
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
        self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
    def _error(self, child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
        If the given child already exists => raise an exception.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
        @raise exceptions.AlreadyExists: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
        child._set_parent(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
        if not self._children.has_key(child._name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
            # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
            if not child._name.startswith('?'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
                self._order.insert(0,child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
            self._children[child._name] = child
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
            raise exceptions.AlreadyExists('Child %s already exists' % child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
    def _add_to_path(self, path, child, policy=REPLACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
        Add a child object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
        @param path: the path for the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
        @param child: The child object to add 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
        @param namespace: The namespace of the object, which defines where the object is created  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
        # check that the child is a supported type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
        if not self._supported_type(child):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
            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
   410
        # ensure that the elements to the namespace exist  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
        curelem = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
        for ppath in utils.dottedref.split_ref(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
            if not curelem._children.has_key(ppath):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
                # Create missing elem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
                curelem._add(self._default_object(ppath))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
            curelem = curelem._get(ppath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        curelem._add(child,policy)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
    def _get(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
        Get a child object by it path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
        @return: The child object if it is found. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
        @raise NotFound: when object is not found from the children.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
            # traverse to the actual child element 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
            curelem = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
            for pathelem in utils.dottedref.split_ref(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
                if utils.dottedref.get_index(pathelem) == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
                    curelem = curelem._children[pathelem]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
                    # If the given pathelem is referring to a list 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
                    name = utils.dottedref.get_name(pathelem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
                    index = utils.dottedref.get_index(pathelem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
                    curelem = utils.get_list(curelem._children[name])[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
            return curelem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
        # Catch the KeyError exception from dict and IndexError from list
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   440
        except (KeyError,IndexError), e: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   441
            raise exceptions.NotFound("Child %s not found from %s! %s" % (path, self, e))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
    def _has(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
        Returns True if an element under the path is found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
        @return: Boolean value. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
            # traverse to the actual child element 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
            curelem = self
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
            for pathelem in utils.dottedref.split_ref(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
                curelem = curelem._children[pathelem]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
        except KeyError: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
    def _remove(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
        Remove a child object by it path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
        # if the patherence is a long patherence (dotted name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
        # first get the _parent object and call the remove to the _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
        (parentref,name) = utils.dottedref.psplit_ref(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
        if parentref != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
            self._get(parentref)._remove(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        elif utils.dottedref.get_index(path) != None and \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
             self._get(utils.dottedref.get_name(path)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
            # Delete If the given pathelem is referring to a list 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
            name = utils.dottedref.get_name(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
            index = utils.dottedref.get_index(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
            del self._children[name][index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
            if len(self._children[name]) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
                del self._order[self._order.index(name)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
        elif self._get(path) != None: # delete if the child is found
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
            del self._children[path]
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   477
            # hidded children are not added to the order list 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   478
            if not path.startswith('?'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   479
                del self._order[self._order.index(path)]
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
            raise exceptions.NotFound("Child %s not found!" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
    def _list_traverse(self,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
        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
   487
        more details.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
        @return: an unordered list of children paths. The path is relative to this node. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
        return [child._path(self) for child in self._traverse(**kwargs)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
    def _traverse(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
        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
   495
        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
   496
        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
   497
        @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
   498
        @param path: The path name or part of name which is used as a filter. This is a regular expression (uses internally re.match())
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   499
        @param type: The type (class) of the objects that should be returned (this can be a tuple of types)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   500
        @param depth: The max recursion depth that traverse goes through. 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
        @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
   502
        @return: a list of ObjectContainer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
        filterlist=[]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
        if kwargs.has_key('ref'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
            filterlist.append(lambda x: re.match(kwargs.get('ref'), x.ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
        if kwargs.has_key('name'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
            filterlist.append(lambda x: re.match(kwargs.get('name'), x._name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
        if kwargs.has_key('path'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
            filterlist.append(lambda x: re.match(kwargs.get('path'), x._path()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
        if kwargs.has_key('type'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
            filterlist.append(lambda x: isinstance(x, kwargs.get('type')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
        if kwargs.has_key('filters'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
            filterlist += kwargs.get('filters')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
        ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
        for child in self._objects():
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   518
            subchildren = child._tail_recurse(_apply_filter,filters=filterlist,depth=kwargs.get('depth',-1))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
            ret += subchildren
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
    def _find_leaves(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
        Find all leaf nodes in the tree that satisfy the given filtering criteria.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
        For possible keyword arguments see _traverse().
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
        @return: A list of ObjectContainer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
        # Find all children
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
        nodes = self._traverse(**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
        # Filter out non-leaves
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
        return filter(lambda node: len(node._objects()) == 0, nodes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
    def _tail_recurse(self, function, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
        Run a tail recursion on all container children and execute the given function.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
        1. function will receive self as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
        2. function will receive all kwargs as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
        3. tail recursion means that the function is executed first and then the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
        recursion continues.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
        @param function: the function which is executed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
        @param kwargs: a list of arguments as dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
        @return: an list of objects, which can be anything that the funtion returns   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   547
        depth = kwargs.get('depth',-1)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
        ret = []
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   549
        # check the if the recursion maximum depth has been reached
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   550
        # if not reached but set, decrease it by one and set that to subrecursion
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   551
        if depth != 0:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   552
            ret += function(self,kwargs.get('filters',[]))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   553
            kwargs['depth'] = depth - 1
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   554
            for child in self._objects():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   555
                try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   556
                    # We wont add the object to the ret until we know that it is a valid object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   557
                    subchildren = child._tail_recurse(function,**kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   558
                    #ret += function(child,**kwargs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   559
                    ret += subchildren
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   560
                except exceptions.InvalidObject,e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   561
                    # remove the invalid object from this container
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   562
                    logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   563
                    self._remove(child._name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   564
                    continue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   565
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    def _head_recurse(self, function,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
        Run a tail recursion on all container children and execute the given function.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
        1. function will receive self as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
        2. function will receive all kwargs as argument to it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
        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
   574
        execution of the function begins.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
        @param function: the function which is executed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
        @param kwargs: a list of arguments as dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
        @return: an list of objects, which can be anything that the funtion returns   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
        ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
        for child in self._objects():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
                ret += child._head_recurse(function,**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
                ret += function(child,**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
            except exceptions.InvalidObject,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
                # remove the invalid object from this container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
                self._remove(child._name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
    def _list(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
        Return a array of immediate children names.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
        @return: an unordered list of immediate children path-references
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
        # skip all internal objects (that start with _)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
        return [name for name in self._order if not name.startswith('?')] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
    def _objects(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
        Return a array of immediate children.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
        @return: an unordered list of immediate children
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
        ret = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
        for cname in self._order:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
                if object_container_filter(self._children[cname], **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
                    ret += utils.get_list(self._children[cname])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
            except exceptions.InvalidObject,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
                # remove the invalid object from this container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
                self._remove(cname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
        return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
    def _get_index(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
        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
   619
        of the child object in the _children array. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
        @return: integer. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
        @raise NotFound: when object is not found from the children.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   625
            return self._order.index(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   626
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   627
            raise exceptions.NotFound("Child %s not found!" % name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   628
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   629
    def _supported_type(self,obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   630
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   631
        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
   632
        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
   633
        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
   634
        @return: True if object is supported, otherwise false.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   635
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   636
        return isinstance(obj, (ObjectContainer,ContainerBase))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   637
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
    def _default_object(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   639
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   640
        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
   641
        creates the intermediate objects automatically. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   642
        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
   643
        @return: A new object.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   644
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   645
        return ObjectContainer(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   646
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   647
    def _find_parent(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   648
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   649
        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
   650
        have to match to the object. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
        Example1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
           _find_parent(foobar=True) searches for a _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   653
          object which has a member attribute foobar and its value is True. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   654
        Example2:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   655
           _find_parent(name="test") searches for a _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   656
          object which has a member attribute name and its value is "test". 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   657
        Example3: type is a special case
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   658
           _find_parent(type=Configuration) searches for a _parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
          object which is an instance of Configuration (checked with isinstance). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
        @param kwargs: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
        @return: The object that matches the arguments
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
        @raise exceptions.NotFound: When no matching parent is found
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
        type = kwargs.get('type', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
        if hasattr(self,'_parent') and self._parent != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
            found = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
            for key in kwargs.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
                try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
                    # handle type as a special case
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   670
                    if key == 'type':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   671
                        if not isinstance(self._parent, kwargs.get(key)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   672
                            found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   673
                            break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   674
                    elif key == 'match':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   675
                        if not self._parent == kwargs.get(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   676
                            found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   677
                            break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   678
                    elif not getattr(self._parent, key) == kwargs.get(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   679
                        found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   680
                        break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   681
                except AttributeError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   682
                    found = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   683
                    break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   684
            if found:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   685
                return self._parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   686
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   687
                return self._parent._find_parent(**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   688
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   689
            raise exceptions.NotFound("Parent not found!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   690
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   691
    def _find_parent_or_default(self, default=None,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   692
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   693
        Calls internally the find parent function, which is encapsulated with try except 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   694
        returns the given default value if find parent raises NotFound exception. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   695
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   696
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   697
            return self._find_parent(**kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   698
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   699
            return default
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   700
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   701
    def set_ref(self,ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   702
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   703
        @param ref: The new reference of the object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   704
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   705
        self._name = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   706
        self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   707
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   708
    def get_ref(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   709
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   710
        @return: The reference of the object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   711
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   712
        return self.ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   713
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   714
    def has_ref(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   715
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   716
        Check if object container contains the given reference.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   717
        @param ref: reference
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   718
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   719
        return self._has(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   720
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   721
class ObjectProxyContainer(ObjectProxy,ObjectContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   722
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   723
    Combines the Container and Proxy classes to one.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   724
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   725
    def __init__(self,obj=None,name=""):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   726
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   727
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   728
        ObjectContainer.__init__(self,name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   729
        ObjectProxy.__init__(self,obj)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   730
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   731
    def __getattr__(self,name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   732
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   733
        First check if the requested attr is a children then 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   734
        direct all not found attribute calls to the sub object getattr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   735
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   736
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   737
            return self.__dict__['_children'][name] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   738
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   739
            return getattr(self._obj,name)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   740
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   741
class LoadContainer(ContainerBase):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   742
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   743
    This class is meant for loading & unloading an object(s), to a ObjectContainer. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   744
    The loading is done if the object container methods are accessed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   745
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   746
    def __init__(self, path, store_interface=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   747
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   748
        @param path: the path which is used in loading
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   749
        @param store_interface: the loading interface object, which is used. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   750
        Expects load(path) and dump(obj) functions  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   751
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   752
        super(LoadContainer, self).__init__()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   753
        self._parent = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   754
        self._container = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   755
        self._storeint = store_interface
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   756
        self._respath = path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   757
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   758
    def __getattr__(self,name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   759
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   760
        Load the container objects if they are not allready loaded
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   761
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   762
        if not self._container:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   763
            self._load()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   764
        return getattr(self._container,name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   765
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   766
    def _load(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   767
        """ If the loading of the object fails => Raise an InvalidObject exception """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   768
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   769
            self._container = ObjectContainer()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   770
            # this should be modified to support loading multiple elements 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   771
            intf = self.get_store_interface()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   772
            # Do not try to load the objects if interface cannot be found
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   773
            if intf:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   774
                obj = intf.load(self.get_full_path())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   775
                self._container._add(obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   776
        except exceptions.NotResource,e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   777
            logging.getLogger('cone').warning("Loading %s from parent %s failed! %s" % (self.path,self.get_parent_path(), e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   778
            raise exceptions.InvalidObject("Invalid configuration object %s" % self.path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   779
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   780
    def _unload(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   781
        # go through objects in the container
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   782
        intf = self.get_store_interface()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   783
        for obj in self._container._objects():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   784
            # remove the parent link 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   785
            obj._parent = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   786
            if intf:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   787
                intf.unload(self.get_full_path(), obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   788
            self._container._remove(obj._name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   789
        # set the container back to None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   790
        self._container = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   791
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   792
    def get_store_interface(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   793
        if not self._storeint and self._parent:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   794
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   795
                self._storeint = self._parent.get_store_interface()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   796
            except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   797
                # If project is not found, let the store interface be None 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   798
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   799
        return self._storeint
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   800
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   801
    def get_parent_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   802
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   803
        Return the path of the configuration resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   804
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   805
        if self._parent:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   806
            return utils.resourceref.get_path(self._parent.get_path())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   807
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   808
            return ""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   809
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   810
    def get_full_path(self, obj=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   811
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   812
        Return the path of the configuration resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   813
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   814
        if obj != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   815
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   816
                return obj.get_full_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   817
            except AttributeError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   818
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   819
        # default path processing returns the fullpath of this elem
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   820
        parent_path = self.get_parent_path() 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   821
        return utils.resourceref.join_refs([parent_path,self.get_path()])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   822
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   823
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   824
class LoadLink(ContainerBase):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   825
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   826
    This class is meant for loading & unloading an object(s), to a ObjectContainer. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   827
    The loading is done if the object container methods are accessed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   828
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   829
    def __init__(self, path, store_interface=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   830
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   831
        @param path: the path which is used in loading
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   832
        @param store_interface: the loading interface object, which is used. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   833
        Expects load(path) and dump(obj) functions  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   834
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   835
        super(LoadLink, self).__init__()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   836
        self._parent = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   837
        self._loaded = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   838
        self._storeint = store_interface
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   839
        self._respath = path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   840
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   841
    def populate(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   842
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   843
        Populate the object to the parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   844
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   845
        if self._parent == None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   846
            raise exceptions.NoParent("Cannot populate a LoadLink object without existing parent object")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   847
        if not self._loaded:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   848
            for obj in self._load():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   849
                self._parent._add(obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   850
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   851
    def _load(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   852
        """ If the loading of the object fails => Raise an InvalidObject exception """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   853
        objs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   854
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   855
            # this should be modified to support loading multiple elements 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   856
            intf = self.get_store_interface()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   857
            # Do not try to load the objects if interface cannot be found
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   858
            if intf:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   859
                obj = intf.load(self.get_full_path())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   860
                objs.append(obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   861
        except exceptions.NotResource,e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   862
            logging.getLogger('cone').warning("Loading %s from parent %s failed! %s" % (self.path,self.get_parent_path(), e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   863
            raise exceptions.InvalidObject("Invalid configuration object %s" % self.path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   864
        return objs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   865
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   866
    def _unload(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   867
        pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   868
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   869
    def get_store_interface(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   870
        if not self._storeint and self._parent:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   871
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   872
                self._storeint = self._parent.get_store_interface()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   873
            except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   874
                # If project is not found, let the store interface be None 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   875
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   876
        return self._storeint
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   877
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   878
    def get_parent_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   879
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   880
        Return the path of the configuration resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   881
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   882
        if self._parent:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   883
            return utils.resourceref.get_path(self._parent.get_path())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   884
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   885
            return ""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   886
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   887
    def get_full_path(self, obj=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   888
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   889
        Return the path of the configuration resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   890
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   891
        if obj != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   892
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   893
                return obj.get_full_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   894
            except AttributeError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   895
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   896
        # default path processing returns the fullpath of this elem
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   897
        parent_path = self.get_parent_path() 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   898
        return utils.resourceref.join_refs([parent_path,self.get_path()])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   899
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   900
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   901
class LoadProxy(ContainerBase):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   902
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   903
    This class is meant for representing any object loading & unloading an object, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   904
    when it is actually needed.  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   905
    object 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   906
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   907
    def __init__(self, path, store_interface=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   908
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   909
        @param path: the path which is used in loadin
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   910
        @param store_interface: the loading interface object, which is used. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   911
        Expects load(path) and dump(obj) functions  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   912
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   913
        self.set('_obj', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   914
        self.set('_parent', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   915
        self.set('path', path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   916
        self.set('_storeint', store_interface)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   917
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   918
    def __getattr__(self,name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   919
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   920
        direct all not found attribute calls to the sub object getattr
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   921
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   922
        if not self._obj: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   923
            self._load()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   924
        return getattr(self._obj,name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   925
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   926
    def __getstate__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   927
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   928
        Return a state which should have sufficient info to load the proxy object but 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   929
        dont serialize the object itself.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   930
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   931
        state = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   932
        state['path'] = self.path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   933
        state['_obj'] = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   934
        # state['_parent'] = self._parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   935
        state['_storeint'] = self._storeint
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   936
        return state
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   937
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   938
    def __setstate__(self, state):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   939
        self.set('_obj', state.get('_obj',None))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   940
        self.set('_storeint', state.get('_storeint',None))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   941
        self.set('_parent', state.get('_parent',self._storeint))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   942
        self.set('path', state.get('path',''))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   943
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   944
    def __setattr__(self, name, value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   945
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   946
        direct attribute setting calls to the sub object setattr
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   947
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   948
        if not self._obj: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   949
            self._load()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   950
        setattr(self._obj,name,value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   951
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   952
    def __delattr__(self, name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   953
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   954
        direct attribute setting calls to the sub object setattr
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   955
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   956
        if not self._obj: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   957
            self._load()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   958
        delattr(self._obj,name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   959
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   960
    def _set_parent(self, newparent):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   961
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   962
        @param newparent:  The new parent object
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   963
        @return: None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   964
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   965
        self.set('_parent',newparent)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   966
        if self._obj:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   967
            self._obj._parent = self._parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   968
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   969
    def _set_obj(self, obj):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   970
        self.set('_obj',obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   971
        # set the same _parent for the actual object as is stored for the proxy
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   972
        if self._obj:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   973
            self._obj._parent = self._parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   974
            self._obj.set_path(self.path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   975
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   976
    def _get_obj(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   977
        if not self._obj: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   978
            self._load()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   979
        return self._obj
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   980
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   981
    def _load(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   982
        # Should the loading of layer external resources be supported?
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   983
        # E.g. resources with absolute path relative to the storage (starts with slash)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   984
        """ If the loading of the object fails => Raise an InvalidObject exception """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   985
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   986
            obj = self.get_store_interface().load(self.fullpath)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   987
            self._set_obj(obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   988
            obj.set_ref(utils.resourceref.to_objref(self.path))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   989
        except exceptions.NotResource,e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   990
            logging.getLogger('cone').warning("Loading %s from parent %s failed! %s" % (self.path,self.get_parent_path(), e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   991
            raise exceptions.InvalidObject("Invalid configuration object %s" % self.path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   992
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   993
    def _unload(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   994
        if self._obj:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   995
            self.get_store_interface().unload(self.fullpath, self._obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   996
            self.set('_obj',None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   997
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   998
    def get_store_interface(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   999
        if not self._storeint:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1000
            self.set('_storeint',self._parent.get_store_interface())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1001
        return self._storeint
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1002
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1003
    def set(self,name,value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1004
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1005
        Proxy has a specific attribute setting function, because by default all attributes are 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1006
        stored to the actual proxy object  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1007
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1008
        self.__dict__[name] = value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1009
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1010
    def get(self,name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1011
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1012
        Proxy has also a specific attribute getting function, because by default all attributes are 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1013
        stored to the actual proxy object  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1014
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1015
        return self.__dict__[name]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1016
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1017
    def save(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1018
        if hasattr(self._obj,'save'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1019
            self._obj.save()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1020
        self._unload()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1021
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1022
    def close(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1023
        if hasattr(self._obj,'close'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1024
            self._obj.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1025
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1026
    def get_parent_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1027
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1028
        Return the path of the configuration resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1029
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1030
        if self._parent:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1031
            return utils.resourceref.get_path(self._parent.get_path())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1032
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1033
            return ""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1034
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1035
    def get_path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1036
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1037
        Return the path of the configuration resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1038
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1039
        if self._obj:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1040
            return self._obj.get_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1041
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1042
            return self.path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1043
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1044
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1045
    def fullpath(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1046
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1047
        Return the path of the configuration resource
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1048
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1049
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1050
            return self._obj.get_full_path() 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1051
        except AttributeError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1052
            parent_path = self.get_parent_path() 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1053
            return utils.resourceref.join_refs([parent_path,self.path])