Statistics
| Branch: | Tag: | Revision:

root / ncclient / glue.py @ bf31e33e

History | View | Annotate | Download (2.7 kB)

1 2bfd0fef Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 2bfd0fef Shikhar Bhushan
#
3 2bfd0fef Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 2bfd0fef Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 2bfd0fef Shikhar Bhushan
# You may obtain a copy of the License at
6 2bfd0fef Shikhar Bhushan
#
7 2bfd0fef Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 2bfd0fef Shikhar Bhushan
#
9 2bfd0fef Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 2bfd0fef Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 2bfd0fef Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 2bfd0fef Shikhar Bhushan
# See the License for the specific language governing permissions and
13 2bfd0fef Shikhar Bhushan
# limitations under the License.
14 2bfd0fef Shikhar Bhushan
15 2bfd0fef Shikhar Bhushan
"TODO: docstring"
16 2bfd0fef Shikhar Bhushan
17 2bfd0fef Shikhar Bhushan
from cStringIO import StringIO
18 2bfd0fef Shikhar Bhushan
from Queue import Queue
19 2bfd0fef Shikhar Bhushan
from threading import Lock
20 2bfd0fef Shikhar Bhushan
from xml.etree import cElementTree as ET
21 2bfd0fef Shikhar Bhushan
22 2bfd0fef Shikhar Bhushan
23 2bfd0fef Shikhar Bhushan
def parse_root(raw):
24 2bfd0fef Shikhar Bhushan
    '''Parse the top-level element from a string representing an XML document.
25 2bfd0fef Shikhar Bhushan
    
26 2bfd0fef Shikhar Bhushan
    Returns a `(tag, attributes)` tuple, where `tag` is a string representing
27 2bfd0fef Shikhar Bhushan
    the qualified name of the root element and `attributes` is an
28 2bfd0fef Shikhar Bhushan
    `{attribute: value}` dictionary.
29 2bfd0fef Shikhar Bhushan
    '''
30 2bfd0fef Shikhar Bhushan
    fp = StringIO(raw)
31 2bfd0fef Shikhar Bhushan
    for event, element in ET.iterparse(fp, events=('start',)):
32 2bfd0fef Shikhar Bhushan
        return (element.tag, element.attrib)
33 2bfd0fef Shikhar Bhushan
34 2bfd0fef Shikhar Bhushan
35 ea04739a Shikhar Bhushan
class Subject(object):
36 bf31e33e Shikhar Bhushan
    
37 bf31e33e Shikhar Bhushan
    'Meant for subclassing by transport.Session'
38 2bfd0fef Shikhar Bhushan
39 2bfd0fef Shikhar Bhushan
    def __init__(self):
40 2bfd0fef Shikhar Bhushan
        "TODO: docstring"
41 e91a5349 Shikhar Bhushan
        self._q = Queue()
42 bf31e33e Shikhar Bhushan
        self._listeners = set()
43 2bfd0fef Shikhar Bhushan
        self._lock = Lock()
44 e91a5349 Shikhar Bhushan
    
45 2bfd0fef Shikhar Bhushan
    def _dispatch_received(self, raw):
46 2bfd0fef Shikhar Bhushan
        "TODO: docstring"
47 2bfd0fef Shikhar Bhushan
        root = parse_root(raw)
48 2bfd0fef Shikhar Bhushan
        with self._lock:
49 2bfd0fef Shikhar Bhushan
            listeners = list(self._listeners)
50 2bfd0fef Shikhar Bhushan
        for l in listeners:
51 4f748648 Shikhar Bhushan
            l.callback(root, raw)
52 2bfd0fef Shikhar Bhushan
    
53 2bfd0fef Shikhar Bhushan
    def _dispatch_error(self, err):
54 2bfd0fef Shikhar Bhushan
        "TODO: docstring"
55 2bfd0fef Shikhar Bhushan
        with self._lock:
56 2bfd0fef Shikhar Bhushan
            listeners = list(self._listeners)
57 2bfd0fef Shikhar Bhushan
        for l in listeners:
58 2bfd0fef Shikhar Bhushan
            l.errback(err)
59 2bfd0fef Shikhar Bhushan
    
60 2bfd0fef Shikhar Bhushan
    def add_listener(self, listener):
61 2bfd0fef Shikhar Bhushan
        "TODO: docstring"
62 2bfd0fef Shikhar Bhushan
        with self._lock:
63 2bfd0fef Shikhar Bhushan
            self._listeners.add(listener)
64 2bfd0fef Shikhar Bhushan
    
65 2bfd0fef Shikhar Bhushan
    def remove_listener(self, listener):
66 2bfd0fef Shikhar Bhushan
        "TODO: docstring"
67 2bfd0fef Shikhar Bhushan
        with self._lock:
68 2bfd0fef Shikhar Bhushan
            self._listeners.discard(listener)
69 2bfd0fef Shikhar Bhushan
    
70 ea04739a Shikhar Bhushan
    def get_listener_instance(self, cls):
71 ea04739a Shikhar Bhushan
        '''This is useful when we want to maintain one listener of a particular
72 ea04739a Shikhar Bhushan
        type per subject i.e. a multiton.
73 ea04739a Shikhar Bhushan
        '''
74 ea04739a Shikhar Bhushan
        with self._lock:
75 ea04739a Shikhar Bhushan
            for listener in self._listeners:
76 ea04739a Shikhar Bhushan
                if isinstance(listener, cls):
77 ea04739a Shikhar Bhushan
                    return listener
78 ea04739a Shikhar Bhushan
    
79 2bfd0fef Shikhar Bhushan
    def send(self, message):
80 2bfd0fef Shikhar Bhushan
        "TODO: docstring"
81 2bfd0fef Shikhar Bhushan
        logger.debug('queueing:%s' % message)
82 e91a5349 Shikhar Bhushan
        self._q.put(message)
83 2bfd0fef Shikhar Bhushan
84 2bfd0fef Shikhar Bhushan
85 ea04739a Shikhar Bhushan
class Listener(object):
86 2bfd0fef Shikhar Bhushan
    
87 4f748648 Shikhar Bhushan
    "TODO: docstring"
88 4f748648 Shikhar Bhushan
    
89 4f748648 Shikhar Bhushan
    def callback(self, root, raw):
90 2bfd0fef Shikhar Bhushan
        raise NotImplementedError
91 2bfd0fef Shikhar Bhushan
    
92 2bfd0fef Shikhar Bhushan
    def errback(self, err):
93 2bfd0fef Shikhar Bhushan
        raise NotImplementedError