Statistics
| Branch: | Tag: | Revision:

root / ncclient / content / builders.py @ 8b4b9936

History | View | Annotate | Download (2.9 kB)

1 1dd43130 Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 1dd43130 Shikhar Bhushan
#
3 1dd43130 Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 1dd43130 Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 1dd43130 Shikhar Bhushan
# You may obtain a copy of the License at
6 1dd43130 Shikhar Bhushan
#
7 1dd43130 Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 1dd43130 Shikhar Bhushan
#
9 1dd43130 Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 1dd43130 Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 1dd43130 Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 1dd43130 Shikhar Bhushan
# See the License for the specific language governing permissions and
13 1dd43130 Shikhar Bhushan
# limitations under the License.
14 1dd43130 Shikhar Bhushan
15 1dd43130 Shikhar Bhushan
from xml.etree import cElementTree as ET
16 1dd43130 Shikhar Bhushan
17 1dd43130 Shikhar Bhushan
from common import BASE_NS
18 1dd43130 Shikhar Bhushan
from common import qualify as _
19 1dd43130 Shikhar Bhushan
20 1dd43130 Shikhar Bhushan
class TreeBuilder:
21 1dd43130 Shikhar Bhushan
    '''Build an ElementTree.Element instance from an XML tree specification
22 1dd43130 Shikhar Bhushan
    based on nested dictionaries.
23 1dd43130 Shikhar Bhushan
    '''
24 1dd43130 Shikhar Bhushan
    
25 1dd43130 Shikhar Bhushan
    def __init__(self, spec):
26 8b4b9936 Shikhar Bhushan
        self._root = TreeBuilder.build(spec)
27 1dd43130 Shikhar Bhushan
        
28 1dd43130 Shikhar Bhushan
    def to_string(self, encoding='utf-8'):
29 1dd43130 Shikhar Bhushan
        return ET.tostring(self._root, encoding)
30 1dd43130 Shikhar Bhushan
    
31 1dd43130 Shikhar Bhushan
    @property
32 1dd43130 Shikhar Bhushan
    def tree(self):
33 1dd43130 Shikhar Bhushan
        return self._root
34 1dd43130 Shikhar Bhushan
    
35 1dd43130 Shikhar Bhushan
    @staticmethod
36 1dd43130 Shikhar Bhushan
    def build(spec):
37 1dd43130 Shikhar Bhushan
        'Returns constructed ElementTree.Element'
38 1dd43130 Shikhar Bhushan
        if spec.has_key('tag'):
39 1dd43130 Shikhar Bhushan
            ele = ET.Element(spec.get('tag'), spec.get('attributes', {}))
40 1dd43130 Shikhar Bhushan
            ele.text = spec.get('text', '')
41 1dd43130 Shikhar Bhushan
            for child in spec.get('children', []):
42 8b4b9936 Shikhar Bhushan
                ele.append(TreeBuilder.build(child))
43 1dd43130 Shikhar Bhushan
            return ele
44 1dd43130 Shikhar Bhushan
        elif spec.has_key('comment'):
45 1dd43130 Shikhar Bhushan
            return ET.Comment(spec.get('comment'))
46 1dd43130 Shikhar Bhushan
        else:
47 1dd43130 Shikhar Bhushan
            raise ValueError('Invalid tree spec')
48 1dd43130 Shikhar Bhushan
49 1dd43130 Shikhar Bhushan
50 1dd43130 Shikhar Bhushan
class HelloBuilder:
51 1dd43130 Shikhar Bhushan
        
52 1dd43130 Shikhar Bhushan
    @staticmethod
53 1dd43130 Shikhar Bhushan
    def build(capabilities, encoding='utf-8'):
54 1dd43130 Shikhar Bhushan
        children = [{'tag': 'capability', 'text': uri } for uri in capabilities]
55 1dd43130 Shikhar Bhushan
        spec = {
56 8b4b9936 Shikhar Bhushan
            'tag': _('hello', BASE_NS),
57 1dd43130 Shikhar Bhushan
            'children': [{
58 1dd43130 Shikhar Bhushan
                        'tag': 'capabilities',
59 1dd43130 Shikhar Bhushan
                        'children': children
60 1dd43130 Shikhar Bhushan
                        }]
61 1dd43130 Shikhar Bhushan
            }
62 1dd43130 Shikhar Bhushan
        return TreeBuilder(spec).to_string(encoding)
63 1dd43130 Shikhar Bhushan
64 1dd43130 Shikhar Bhushan
65 1dd43130 Shikhar Bhushan
class RPCBuilder:
66 1dd43130 Shikhar Bhushan
    
67 1dd43130 Shikhar Bhushan
    @staticmethod
68 8b4b9936 Shikhar Bhushan
    def build(msgid, op, encoding='utf-8'):
69 8b4b9936 Shikhar Bhushan
        if isinstance(opspec, basestring):
70 8b4b9936 Shikhar Bhushan
            return build_from_string(msgid, op, encoding)
71 8b4b9936 Shikhar Bhushan
        else:
72 8b4b9936 Shikhar Bhushan
            return build_from_spec(msgid, op, encoding)
73 8b4b9936 Shikhar Bhushan
    
74 8b4b9936 Shikhar Bhushan
    @staticmethod
75 1dd43130 Shikhar Bhushan
    def build_from_spec(msgid, opspec, encoding='utf-8'):
76 1dd43130 Shikhar Bhushan
        if isinstance(opspec, dict):
77 1dd43130 Shikhar Bhushan
            opspec = [opspec]
78 1dd43130 Shikhar Bhushan
        return TreeBuilder({
79 8b4b9936 Shikhar Bhushan
                'tag': _('rpc', BASE_NS),
80 1dd43130 Shikhar Bhushan
                'attributes': {'message-id': msgid},
81 1dd43130 Shikhar Bhushan
                'children': opspec
82 1dd43130 Shikhar Bhushan
                }).to_string(encoding)
83 1dd43130 Shikhar Bhushan
    
84 1dd43130 Shikhar Bhushan
    @staticmethod
85 1dd43130 Shikhar Bhushan
    def build_from_string(msgid, opstr, encoding='utf-8'):
86 1dd43130 Shikhar Bhushan
        decl = '<?xml version="1.0" encoding="%s"?>' % encoding
87 1dd43130 Shikhar Bhushan
        doc = (u'''<rpc message-id="%s" xmlns="%s">%s</rpc>''' %
88 1dd43130 Shikhar Bhushan
               (msgid, RPC.NS, opstr)).encode(encoding)
89 1dd43130 Shikhar Bhushan
        return (decl + doc)