Statistics
| Branch: | Tag: | Revision:

root / ncclient / content.py @ 2acc860a

History | View | Annotate | Download (3.9 kB)

1 a4850088 Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 a4850088 Shikhar Bhushan
#
3 a4850088 Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 a4850088 Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 a4850088 Shikhar Bhushan
# You may obtain a copy of the License at
6 a4850088 Shikhar Bhushan
#
7 a4850088 Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 a4850088 Shikhar Bhushan
#
9 a4850088 Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 a4850088 Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 a4850088 Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 a4850088 Shikhar Bhushan
# See the License for the specific language governing permissions and
13 a4850088 Shikhar Bhushan
# limitations under the License.
14 a4850088 Shikhar Bhushan
15 ee4bb099 Shikhar Bhushan
import logging
16 38a9b062 Shikhar Bhushan
from xml.etree import cElementTree as ElementTree
17 2acc860a Shikhar Bhushan
from cStringIO import StringIO
18 38a9b062 Shikhar Bhushan
19 ee4bb099 Shikhar Bhushan
logger = logging.getLogger('ncclient.content')
20 a4850088 Shikhar Bhushan
21 a4850088 Shikhar Bhushan
22 2acc860a Shikhar Bhushan
def qualify(tag, ns=None):
23 2acc860a Shikhar Bhushan
    if ns is None:
24 2acc860a Shikhar Bhushan
        return tag
25 2acc860a Shikhar Bhushan
    else:
26 2acc860a Shikhar Bhushan
        return '{%s}%s' % (ns, tag)
27 a4850088 Shikhar Bhushan
_ = qualify
28 a4850088 Shikhar Bhushan
29 2acc860a Shikhar Bhushan
30 2acc860a Shikhar Bhushan
class RootElementParser:
31 2acc860a Shikhar Bhushan
    
32 2acc860a Shikhar Bhushan
    '''Parse the root element of an XML document. The tag and namespace of
33 2acc860a Shikhar Bhushan
    recognized elements, and attributes of interest can be customized.
34 2acc860a Shikhar Bhushan
    
35 2acc860a Shikhar Bhushan
    RootElementParser does not parse any sub-elements.
36 2acc860a Shikhar Bhushan
    '''
37 2acc860a Shikhar Bhushan
    
38 2acc860a Shikhar Bhushan
    def __init__(self, recognize=[]):
39 2acc860a Shikhar Bhushan
        self._recognize = recognize
40 2acc860a Shikhar Bhushan
    
41 2acc860a Shikhar Bhushan
    def recognize(self, element):
42 2acc860a Shikhar Bhushan
        '''Specify an element that should be successfully parsed.
43 2acc860a Shikhar Bhushan
        
44 2acc860a Shikhar Bhushan
        element should be a string that represents a qualified name of the form
45 2acc860a Shikhar Bhushan
        *{namespace}tag*.
46 2acc860a Shikhar Bhushan
        '''
47 2acc860a Shikhar Bhushan
        self._recognize.append((element, attrs))
48 2acc860a Shikhar Bhushan
    
49 2acc860a Shikhar Bhushan
    def parse(self, raw):
50 2acc860a Shikhar Bhushan
        '''Parse the root element from a string representing an XML document.
51 2acc860a Shikhar Bhushan
        
52 2acc860a Shikhar Bhushan
        Returns a (tag, attributes) tuple. tag is a string representing
53 2acc860a Shikhar Bhushan
        the qualified name of the recognized element. attributes is a
54 2acc860a Shikhar Bhushan
        {'attr': value} dictionary.
55 2acc860a Shikhar Bhushan
        '''
56 2acc860a Shikhar Bhushan
        fp = StringIO(raw)
57 2acc860a Shikhar Bhushan
        for event, element in ElementTree.iterparse(fp, events=('start',)):
58 2acc860a Shikhar Bhushan
            for e in self._recognize:
59 2acc860a Shikhar Bhushan
                if element.tag == e:
60 2acc860a Shikhar Bhushan
                    return (element.tag, element.attrib)
61 2acc860a Shikhar Bhushan
            break
62 2acc860a Shikhar Bhushan
        return None
63 2acc860a Shikhar Bhushan
64 2acc860a Shikhar Bhushan
65 2acc860a Shikhar Bhushan
###########
66 2acc860a Shikhar Bhushan
67 2acc860a Shikhar Bhushan
class XMLBuilder:
68 2acc860a Shikhar Bhushan
    
69 2acc860a Shikhar Bhushan
    @staticmethod
70 2acc860a Shikhar Bhushan
    def _element(node):
71 2acc860a Shikhar Bhushan
        element = ElementTree.Element( _(node.get('tag'),
72 2acc860a Shikhar Bhushan
                                         node.get('namespace', None)),
73 2acc860a Shikhar Bhushan
                                      node.get('attributes', {}))
74 2acc860a Shikhar Bhushan
        if node.has_key('children'):
75 2acc860a Shikhar Bhushan
            for child in node['children']:
76 2acc860a Shikhar Bhushan
                element.append(_make_element(child))
77 ee4bb099 Shikhar Bhushan
        else:
78 2acc860a Shikhar Bhushan
            return element
79 2acc860a Shikhar Bhushan
    
80 2acc860a Shikhar Bhushan
    @staticmethod
81 2acc860a Shikhar Bhushan
    def _etree(tree_dict):
82 2acc860a Shikhar Bhushan
        return ElementTree.ElementTree(XMLBuilder._element(tree_dict))
83 2acc860a Shikhar Bhushan
    
84 2acc860a Shikhar Bhushan
    @staticmethod
85 2acc860a Shikhar Bhushan
    def to_xml(tree_dict, encoding='utf-8'):
86 2acc860a Shikhar Bhushan
        fp = StringIO()
87 2acc860a Shikhar Bhushan
        self._etree(tree_dict).write(fp, encoding)
88 2acc860a Shikhar Bhushan
        return fp.get_value()
89 2acc860a Shikhar Bhushan
90 2acc860a Shikhar Bhushan
91 2acc860a Shikhar Bhushan
### Hello exchange
92 2acc860a Shikhar Bhushan
93 2acc860a Shikhar Bhushan
class Hello:
94 2acc860a Shikhar Bhushan
    
95 2acc860a Shikhar Bhushan
    NS = 'urn:ietf:params:xml:ns:netconf:base:1.0'
96 2acc860a Shikhar Bhushan
    
97 2acc860a Shikhar Bhushan
    @staticmethod
98 2acc860a Shikhar Bhushan
    def build(capabilities, encoding='utf-8'):
99 2acc860a Shikhar Bhushan
        hello = ElementTree.Element(_('hello', Hello.NS))
100 2acc860a Shikhar Bhushan
        caps = ElementTree.Element('capabilities')
101 2acc860a Shikhar Bhushan
        for uri in capabilities:
102 2acc860a Shikhar Bhushan
            cap = ElementTree.Element('capability')
103 2acc860a Shikhar Bhushan
            cap.text = uri
104 2acc860a Shikhar Bhushan
            caps.append(cap)
105 2acc860a Shikhar Bhushan
        hello.append(caps)
106 2acc860a Shikhar Bhushan
        tree = ElementTree.ElementTree(hello)
107 2acc860a Shikhar Bhushan
        fp = StringIO()
108 2acc860a Shikhar Bhushan
        tree.write(fp, encoding)
109 2acc860a Shikhar Bhushan
        return fp.getvalue()
110 2acc860a Shikhar Bhushan
    
111 2acc860a Shikhar Bhushan
    @staticmethod
112 2acc860a Shikhar Bhushan
    def parse(raw):
113 2acc860a Shikhar Bhushan
        'Returns tuple of (session-id, ["capability_uri", ...])'
114 2acc860a Shikhar Bhushan
        id, capabilities = 0, []
115 2acc860a Shikhar Bhushan
        root = ElementTree.fromstring(raw)
116 2acc860a Shikhar Bhushan
        if root.tag == _('hello', Hello.NS):
117 2acc860a Shikhar Bhushan
            for child in root.getchildren():
118 2acc860a Shikhar Bhushan
                if child.tag == _('session-id', Hello.NS):
119 2acc860a Shikhar Bhushan
                    id = int(child.text)
120 2acc860a Shikhar Bhushan
                elif child.tag == _('capabilities', Hello.NS):
121 2acc860a Shikhar Bhushan
                    for cap in child.getiterator(_('capability', Hello.NS)):
122 2acc860a Shikhar Bhushan
                        capabilities.append(cap.text)
123 2acc860a Shikhar Bhushan
        return id, capabilities