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