configurationengine/source/cone/public/utils.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
import StringIO
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import tokenize
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import inspect
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import traceback
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import imghdr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
from token import ENDMARKER, NAME, NUMBER, STRING
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
import api
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import mimetypes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
import exceptions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
import _etree_wrapper
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
etree = _etree_wrapper.ElementTreeWrapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
class resourceref(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    Class container for set of resource reference related functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    def filter_resources(cls, resources, regexp):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        Filter out all resources that do not match the given regexp
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        @return a array of resources that match the given resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        test = re.compile(regexp, re.IGNORECASE)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        return [r for r in resources if test.search(r)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    def neg_filter_resources(cls, resources, regexp):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        Filter out all resources that do match the given regexp
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        @return a array of resources that dont match the given resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        test = re.compile(regexp, re.IGNORECASE)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        return [r for r in resources if not test.search(r)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
    def insert_begin_slash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
        if not ref.startswith('/'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
            return '/' + ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
    def remove_begin_slash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
        if ref.startswith('/'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
            return ref.replace('/', '', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
        return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
    def remove_end(self, path, str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
            (ret, sep, rest) = path.partition(str)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
            return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
            return path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    def add_end_slash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        if not ref.endswith('/'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
            return ref+'/'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    def remove_end_slash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        if ref.endswith('/'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
            return ref[:-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    def norm(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        Normalize the reference to common cone form. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        1. Always with forward slashes 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        2. no beginning slash
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        3. no end slash
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        @return: A normalized reference string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        # Do not modify emtpy string at all
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        if not ref == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
            normref = os.path.normpath(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
            normref = normref.replace('\\','/').replace('"','').replace('//','/')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
            normref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        return normref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
    def replace_dir(cls, ref, frompart, topart):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        Replace a part of directory beginning from ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        @param ref: the resource reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        @param frompart: the part of directory name to be replaced
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        @param topart: the partial name which replaces the frompart
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        @return: a refenence with forward slashes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        # Normalize all paths and replace the name with string replace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        # 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        normref = cls.norm(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        normfrom = cls.norm(frompart)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        normto = cls.norm(topart)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        # Add the end slash to from and to as it should be a dir (if not empty)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        if normto != "": normto = cls.add_end_slash(normto)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        if normfrom != "": normfrom = cls.add_end_slash(normfrom)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        if normref != "": normref = cls.add_end_slash(normref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        retref = cls.norm(normref.replace(normfrom, normto, 1))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
        if retref  != "": retref = cls.remove_end_slash(retref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        return retref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
    def join_refs(cls, refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        join a list of dotted references together with dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        1. ignore empty refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
        2. no dot include begin dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        3. no dot include end dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        @param refs: a list of references
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        @return: A normalized dotted reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        # Create a copy of references without any empty strings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        import posixpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        paramdict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
        retref = posixpath.join(*refs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        #retref = "/".join([ref for ref in refs if ref != ''])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        #subs = re.sub('/+', '/', retref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        return retref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
    def split_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
        Replace a part of directory beginning from ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        @param ref: the resource reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
        @return: a list of path elems
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        return [r for r in ref.split('/') if r]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
    def psplit_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        pop split that splits the last element of the array 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
        @param ref: a resource references string (e.g. aaa/bbb/ccc.txt)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        @return: A tuple of references (with given param ('aaa/bbb','ccc.txt')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        refs = ref.rsplit('/', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        return ("".join(refs[0:-1]), refs[-1])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    def remove_ext(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        Remove file extension from ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        @return: a reference. E.g. (foo/test.confml) => foo/test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        filenameparts = cls.get_filename(ref).rsplit('.', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        path = cls.get_path(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        if len(filenameparts)==2 and filenameparts[0] != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
            return cls.join_refs([path, filenameparts[0]])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
            return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
    def get_ext(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
        get file extension from ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        1. get file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        @return: a reference. E.g. (foo/test.confml) => confml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
        if len(ref.rsplit('.', 1)) == 2: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
            return ref.rsplit('.', 1)[1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
            return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
    def get_filename(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
        get file name part from ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        1. get file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        @return: a reference. E.g. (foo/test.confml) => confml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
        return ref.rsplit('/', 1)[-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
    def get_path(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
        get file name part from ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
        1. get file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        @return: a reference. E.g. (foo/test.confml) => confml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
        if len(ref.rsplit('/', 1)) == 2: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
            return ref.rsplit('/', 1)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
            return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
    def to_dottedref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
        Convert a resource ref to dotted ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        2. convert path delims to dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        @return: a dotted reference. E.g. (foo/test.confml) => foo_test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
        newref = cls.remove_ext(ref).replace('/', '_').replace(' ', '_')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        return dottedref.remove_begin_dot(newref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
    def to_objref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
        Convert a resource ref to dotted ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        2. convert path delims to dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        3. using double underscores for directory separation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        @return: a dotted reference. E.g. (foo/test.confml) => foo_test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        ref = ref.replace('/', '__')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        newref = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        first_token = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
            for toknum, tokval, spos, epos, _ in tokenize.generate_tokens(StringIO.StringIO(unicode(ref)).readline):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
                if toknum == ENDMARKER:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
                    break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
                elif toknum == NAME:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
                    newref += str(tokval)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
                elif toknum == NUMBER:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
                    # Add a character before the number token if the first token is a number
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
                    if first_token:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
                        newref += '_'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
                    # replace a possible dot in number .123
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
                    newref += str(tokval.replace('.','_'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
                elif toknum == STRING:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
                    newref += str(tokval.replace('"', ''))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
                    newref += '_'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
                # After first round set the first token to false
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
                first_token = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        except tokenize.TokenError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
            pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        return newref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
    def to_dref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        Convert a resource ref to dotted ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        2. convert path delims to dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        @return: a dotted reference. E.g. (foo/test.confml) => foo.test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
        return dottedref.remove_begin_dot(cls.remove_ext(ref).replace('/','.'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
    def to_hash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        Convert a resource ref to to hash 32 bit integer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        @return: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
        return "%s" % hex(hash(ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
class dottedref(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
    Class container for set of dotted reference related functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
    def join_refs(cls, refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
        join a list of dotted references together with dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
        1. ignore empty refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
        2. no dot include begin dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
        3. no dot include end dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
        @param refs: a list of references
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
        @return: A normalized dotted reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
        # Create a dotted reference without any empty strings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        return '.'.join([ref for ref in refs if ref.strip()])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
    def split_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        split a dotted references string to a list of ref elements
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        @return: A list of references (with given param ['aaa','bbb','ccc']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        # list of reference parts without any empty strings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        return [r for r in ref.split('.') if r]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
    def psplit_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        pop split that splits the last element of the array 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        @return: A tuple of references (with given param ('aaa.bbb','ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        refs = ref.rsplit('.', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        return ("".join(refs[0:-1]), refs[-1])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
    def remove_last(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        removes the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
        @return: A reference (with given param ('aaa.bbb')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        return ref.rsplit('.', 1)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
    def get_last(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        returns the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        1. empty ref returns an empty string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
        @return: A reference (with given param ('ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        return ref.rsplit('.', 1)[-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
    def get_name(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        returns the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        1. empty ref returns an empty string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        @return: A reference (with given param ('ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
        if re.match('^(.*)\[.*\]$', ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
            return re.match('^(.*)\[.*\]$', ref).group(1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
            return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
    def get_index(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
        returns the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
        1. empty ref returns an empty string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
        @return: A reference (with given param ('ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        if re.match('^.*\[(\d+)\]$', ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
            return int( re.match('^.*\[(\d+)\]$', ref).group(1) )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
    def remove_begin_dot(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        removes all the dots from the begin of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        @param ref: a dotted references string (e.g. .aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
        @return: A reference (with given param ('aaa.bbb.ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        return ref.lstrip('.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
    def ref2filter(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        elems = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        for refelem in dottedref.split_ref(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
            if refelem == "**":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
                elems.append(".*")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
                elems.append(refelem.replace("*","[^\.]*"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
        return "\\.".join(elems)+"$"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
def extract_delimited_tokens(string, delimiters=('${', '}')):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
    Return a list of all tokens delimited by the given strings in the given string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
    This function returns basically the first row of the result of
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
    extract_delimited_token_tuples(), with duplicates removed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
    >>> dottedref.extract_refs("test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2}")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
    ['my.ref1', 'my.ref2']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
    ref_tuples = extract_delimited_token_tuples(string, delimiters)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
    return distinct_array([ref for ref, raw_ref in ref_tuples])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
def extract_delimited_token_tuples(string, delimiters=('${', '}')):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
    Extract a list of (token, raw_token) tuples from the given string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
    'token' is the the token extracted from the string and trimmed (surrounding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
    whitespace removed), and raw_token is the unmodified match from the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
    string, which can be used for replacing.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
    >>> dottedref.extract_ref_tuples("test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2}")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
    [('my.ref1', '${my.ref1}'), ('my.ref1', '${ my.ref1 }'), ('my.ref2', '${my.ref2}')]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
    pattern = '%s.*?%s' % (re.escape(delimiters[0]), re.escape(delimiters[1]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
    matches = distinct_array(re.findall(pattern, string, re.DOTALL))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
    result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
    for match in matches:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
        ref = match[len(delimiters[0]):-len(delimiters[1])].strip()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
        result.append((ref, match))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
    return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
def expand_delimited_tokens(string, expander_func, delimiters=('${', '}')):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
    Expand all tokens in the given string using the given expander function.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
    @param string: The string to expand.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
    @param expander_func: The function used for expanding. Should take two parameters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        1 - The token to expand.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
        2 - The index of the token in the string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
    @param delimiters: Tuple specifying the delimiters for tokens.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
    @return: The expanded string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
    # Collect a dictionary of token-entry pairs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
    class Entry(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
    tokens = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
    for index, (token, raw_token) in enumerate(extract_delimited_token_tuples(string, delimiters)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
        if token not in tokens:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
            entry = Entry()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
            entry.index = index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
            entry.raw_tokens = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
            entry.value = unicode(expander_func(token, index))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
            tokens[token] = entry
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
            entry = tokens[token]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
        entry.raw_tokens.append(raw_token)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
    # Replace all tokens with the expanded values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
    result = string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
    for entry in tokens.itervalues():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
        for raw_token in entry.raw_tokens:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
            result = result.replace(raw_token, entry.value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
    return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
def expand_refs_by_default_view(string, default_view, delimiters=('${', '}'), default_value_for_missing=''):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
    Convenience function for expanding the refs in a string using setting values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
    @param default_value_for_missing: The default value used if a setting for
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
        a reference cannot be found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
    @return: The expanded string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
    def expand(ref, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
            return default_view.get_feature(ref).get_original_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
            logging.getLogger('cone').error("Feature '%s' not found" % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
            return default_value_for_missing
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
    return expand_delimited_tokens(string, expand, delimiters)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
def distinct_array(arr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
    newarray = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
    for val in arr:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
            # test to see whether the value already is in thearray
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
            newarray.index(val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
            newarray.append(val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
    return newarray
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
def list_files(path):    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
    Get an array of files in a folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
    retarray = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
    # Walk through all files in the layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
    path = os.path.abspath(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
    for root, dirs, files in os.walk(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
        for name in files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
            entry = os.path.join(root, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
            entry = os.path.normpath(os.path.abspath(entry))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
            if os.path.isfile(entry):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
                retarray.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
    return retarray
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
def all_subclasses(classname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
    @return: A list of all subclasses of classname
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
    subclasses = classname.__subclasses__()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
    # Create copy of the subclasses list for the iteration, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
    # so that added items are not recursed again
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
    for subclass in classname.__subclasses__():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
        subclasses += all_subclasses(subclass)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
    return subclasses
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
def pathmatch(pattern, refpath):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
    Check for matching pattern for a ref path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
    filter = dottedref.ref2filter(pattern)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
    return re.match(filter, refpath) != None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
def filter(obj, filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
    for filter in filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
        if not filter(obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
    return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
def get_list(elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
    if not isinstance(elem, list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
        return [elem]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
        return elem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
def add_list(elem, add):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
    retlist = get_list(elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
    retlist.append(add)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
    return retlist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
def prepend_list(elem, prepend):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
    retlist = get_list(elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
    retlist.insert(0, prepend)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
    return retlist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
def is_list(elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
    return isinstance(elem, list)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
def get_class(modelinstance, classinstance):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
    Get the actual model specific implementation class for a classinstance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
    for attr in dir(modelinstance):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
        modelclass = getattr(modelinstance, attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
        if inspect.isclass(modelclass): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
            if issubclass(modelclass, classinstance):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
                return modelclass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
    return classinstance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
class DataMapRef(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
    Utility class for handling map attributes in data section
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
    def get_feature_ref(cls, map):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
        index = map.find("@")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
        if index != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
            parts = map.split("@")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
            return parts[0][:-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
    def get_key_value(cls, map):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
        index = map.find("@")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
        if index != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
            parts = map.split("@")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
            key = parts[1][:-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
            keys = key.split("=")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
            value = keys[1].strip()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
            return value[1:-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
class xml(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
    Class container for set of XML-related helper functions.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
    def split_tag_namespace(cls, xml_tag):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
        Split the given XML tag into a (namespace, tag) tuple.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
        >>> ReaderBase._split_tag_namespace("test")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
        (None, 'test')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
        >>> ReaderBase._split_tag_namespace("{http://www.test.com/xml/1}test")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
        ('http://www.test.com/xml/1', 'test')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
        if xml_tag.startswith('{'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
            parts = xml_tag[1:].split('}')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
            return (parts[0], parts[1])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
            return (None, xml_tag)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
def log_exception(logger, msg, msg_level=logging.ERROR, traceback_level=logging.DEBUG):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
    Log an exception so that the given message and the exception's
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
    traceback are logged separately with the given log levels.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
    The purpose is to print minimal information to the user when running
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
    the CLI (default level for STDOUT logging is WARNING), but the traceback
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
    should still be available in the log file (which uses the level DEBUG
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
    by default).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
    Note that this function should be only used in an exception handler.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
    logger.log(msg_level, msg)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
    logger.log(traceback_level, traceback.format_exc())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
def make_content_info(resource, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
    Factory for ContentInfo
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
    cnt_inf = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
    if resource != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
        guessed_type = mimetypes.guess_type(resource.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
        mimetype = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
        mimesubtype = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
        if guessed_type != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
            mimetype, mimesubtype = guessed_type[0].split('/') 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
        if mimetype == 'image' and mimesubtype == 'x-ms-bmp':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
            cnt_inf = api.BmpImageContentInfo(resource, data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
            cnt_inf = api.ContentInfo(mimetype, mimesubtype)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
    return cnt_inf