buildframework/helium/sf/python/pythoncore/lib/amara.py
changeset 628 7c4a911dc066
parent 587 85df38eb4012
child 645 b8d81fa19e7d
equal deleted inserted replaced
588:c7c26511138f 628:7c4a911dc066
    16 #
    16 #
    17 #Description:
    17 #Description:
    18 #===============================================================================
    18 #===============================================================================
    19 """amara"""
    19 """amara"""
    20 
    20 
    21 # pylint: disable-msg=E1103
    21 # pylint: disable=E1103
    22 import sys
    22 #import sys
    23 if 'java' in sys.platform:
    23 #if 'java' in sys.platform:
       
    24 #    pass
       
    25 if True:
       
    26     import os
    24     import xml.dom.minidom
    27     import xml.dom.minidom
    25     import urllib
    28     import urllib
       
    29     import xpath
       
    30     import xml.etree.ElementTree
       
    31     import xml.etree.ElementInclude
       
    32     
       
    33     # pylint: disable=W0212
       
    34     def fixed_writexml(self, writer, indent="", addindent="", newl=""):
       
    35         # indent = current indentation
       
    36         # addindent = indentation to add to higher levels
       
    37         # newl = newline string
       
    38         writer.write(indent + "<" + self.tagName)
       
    39     
       
    40         attrs = self._get_attributes()
       
    41         a_names = attrs.keys()
       
    42         a_names.sort()
       
    43     
       
    44         for a_name in a_names:
       
    45             writer.write(" %s=\"" % a_name)
       
    46             xml.dom.minidom._write_data(writer, attrs[a_name].value)
       
    47             writer.write("\"")
       
    48         if self.childNodes:
       
    49             if len(self.childNodes) == 1 \
       
    50               and self.childNodes[0].nodeType == xml.dom.minidom.Node.TEXT_NODE:
       
    51                 writer.write(">")
       
    52                 self.childNodes[0].writexml(writer, "", "", "")
       
    53                 writer.write("</%s>%s" % (self.tagName, newl))
       
    54                 return
       
    55             writer.write(">%s" % (newl))
       
    56             for node in self.childNodes:
       
    57                 if node.__class__ == xml.dom.minidom.Text and node.data.strip() == '':
       
    58                     continue
       
    59                 node.writexml(writer, indent + addindent, addindent, newl)
       
    60             writer.write("%s</%s>%s" % (indent, self.tagName, newl))
       
    61         else:
       
    62             writer.write("/>%s" % (newl))
       
    63     # replace minidom's function with ours
       
    64     xml.dom.minidom.Element.writexml = fixed_writexml
    26     
    65     
    27     def parse(param):
    66     def parse(param):
    28         """parse"""
    67         """parse"""
    29         return MinidomAmara(param)
    68         return MinidomAmara(param)
    30     
    69     
    40         def __init__(self, dom, parent=None):
    79         def __init__(self, dom, parent=None):
    41             self.parent = parent
    80             self.parent = parent
    42             if isinstance(dom, file):
    81             if isinstance(dom, file):
    43                 self.dom = xml.dom.minidom.parse(dom)
    82                 self.dom = xml.dom.minidom.parse(dom)
    44             elif isinstance(dom, basestring):
    83             elif isinstance(dom, basestring):
    45                 if dom.startswith('file:///'):
    84                 cwd_backup = os.getcwd()
       
    85                 if dom.startswith('file:///') or dom.startswith('///') or os.path.exists(dom):
       
    86                     try:
       
    87                         path = urllib.url2pathname(dom)
       
    88                         path = path.replace('file:///', '')
       
    89                         os.chdir(os.path.dirname(path))
       
    90                     except IOError:
       
    91                         pass
    46                     dom = urllib.urlopen(dom).read()
    92                     dom = urllib.urlopen(dom).read()
       
    93                 
       
    94                 ettree = xml.etree.ElementTree.fromstring(dom)
       
    95                 xml.etree.ElementInclude.include(ettree)
       
    96                 dom = xml.etree.ElementTree.tostring(ettree)
       
    97                 os.chdir(cwd_backup)
    47                 self.dom = xml.dom.minidom.parseString(dom)
    98                 self.dom = xml.dom.minidom.parseString(dom)
    48             else:
    99             else:
    49                 self.dom = dom
   100                 self.dom = dom
    50         
   101         
    51         def __getitem__(self, name):
   102         def __getitem__(self, name):
    52             return self.__getattr__(name)
   103             return self.__getattr__(name)
    53         
   104             
       
   105         def __setitem__(self, key, value):
       
   106             self.xml_set_attribute(key, value)
       
   107             
    54         def __getattr__(self, attr):
   108         def __getattr__(self, attr):
    55             if isinstance(attr, basestring):
   109             if isinstance(attr, basestring):
    56                 res = self.dom.getElementsByTagName(attr)
   110                 res = self.dom.getElementsByTagName(attr)
    57                 if len(res) == 0:
   111                 if len(res) == 0:
    58                     if hasattr(self.dom, 'documentElement'):
   112                     if hasattr(self.dom, 'documentElement'):
    59                         val = self.dom.documentElement.getAttribute(attr)
   113                         val = self.dom.documentElement.getAttribute(attr)
       
   114                         if not self.dom.documentElement.hasAttribute(attr):
       
   115                             raise Exception(attr + ' not found')
    60                     else:
   116                     else:
    61                         val = self.dom.getAttribute(attr)
   117                         val = self.dom.getAttribute(attr)
    62                     if val == '':
   118                         if not self.dom.hasAttribute(attr):
    63                         raise Exception(attr + ' not found')
   119                             raise Exception(attr + ' not found')
    64                     return val
   120                     return val
    65                 return MinidomAmara(res[0], self.dom)
   121                 return MinidomAmara(res[0], self.dom)
    66             return MinidomAmara(self.parent.getElementsByTagName(self.dom.tagName)[attr])
   122             if self.parent:
    67     
   123                 return MinidomAmara(self.parent.getElementsByTagName(self.dom.tagName)[attr])
       
   124             else:
       
   125                 raise Exception(str(attr) + ' not found')
       
   126     
       
   127         def __setattr__(self, name, value):
       
   128             if isinstance(value, basestring):
       
   129                 self.xml_set_attribute(name, value)
       
   130             else:
       
   131                 object.__setattr__(self, name, value)
       
   132         
    68         def __iter__(self):
   133         def __iter__(self):
    69             for entry in self.parent.getElementsByTagName(self.dom.tagName):
   134             for entry in self.parent.getElementsByTagName(self.dom.tagName):
    70                 yield MinidomAmara(entry)
   135                 yield MinidomAmara(entry)
    71     
   136     
    72         def __str__(self):
   137         def __str__(self):
    74             for t_text in self.dom.childNodes:
   139             for t_text in self.dom.childNodes:
    75                 if t_text.nodeType == t_text.TEXT_NODE and t_text.data != None:
   140                 if t_text.nodeType == t_text.TEXT_NODE and t_text.data != None:
    76                     text = text + t_text.data
   141                     text = text + t_text.data
    77             return text
   142             return text
    78         
   143         
    79         def xml(self, out=None, indent=True, omitXmlDeclaration=False, encoding=''):
   144         def xml(self, out=None, indent=False, omitXmlDeclaration=False, encoding='utf-8'):
    80             """xml"""
   145             """xml"""
       
   146             if omitXmlDeclaration:
       
   147                 pass
    81             if out:
   148             if out:
    82                 out.write(self.dom.toprettyxml())
   149                 out.write(self.dom.toprettyxml(encoding=encoding))
    83             if indent:
   150             if indent:
    84                 return self.dom.toprettyxml()
   151                 return self.dom.toprettyxml(encoding=encoding)
    85             return self.dom.toxml()
   152             return self.dom.toxml(encoding=encoding)
    86         
   153         
    87         def xml_append_fragment(self, text):
   154         def xml_append_fragment(self, text):
    88             """xml append fragment"""
   155             """xml append fragment"""
    89             self.dom.appendChild(xml.dom.minidom.parseString(text).documentElement)
   156             self.dom.appendChild(xml.dom.minidom.parseString(text).documentElement)
    90     
   157     
    91         def xml_set_attribute(self, name, value):
   158         def xml_set_attribute(self, name, value):
    92             """set XML attribute"""
   159             """set XML attribute"""
    93             self.dom.setAttribute(name, value)
   160             self.dom.setAttribute(name, value)
       
   161         
       
   162         def xml_remove_child(self, value):
       
   163             self.dom.removeChild(value.dom)
    94         
   164         
    95         def _getxml_children(self):
   165         def _getxml_children(self):
    96             """get xml children"""
   166             """get xml children"""
    97             l_attrib = []
   167             l_attrib = []
    98             for elem in self.dom.childNodes:
   168             for elem in self.dom.childNodes:
   140         xml_children = property(_getxml_children)
   210         xml_children = property(_getxml_children)
   141         xml_attributes = property(_getxml_attributes)
   211         xml_attributes = property(_getxml_attributes)
   142         
   212         
   143         def __eq__(self, obj):
   213         def __eq__(self, obj):
   144             return str(self) == obj
   214             return str(self) == obj
       
   215         def __ne__(self, obj):
       
   216             return str(self) != obj
   145         
   217         
   146         def __len__(self):
   218         def __len__(self):
   147             return len(self.parent.getElementsByTagName(self.dom.tagName))
   219             if self.parent:
   148         
   220                 return len(self.parent.getElementsByTagName(self.dom.tagName))
   149         def xml_xpath(self, xpath):
   221             return 1
       
   222         
       
   223         def xml_xpath(self, axpath):
   150             """append to the XML path"""
   224             """append to the XML path"""
   151             import java.io.ByteArrayInputStream
   225             results  = [] 
   152             import org.dom4j.io.SAXReader
   226             for result in xpath.find(axpath, self.dom): 
   153             import org.dom4j.DocumentHelper
   227                 results.append(MinidomAmara(result)) 
   154 
   228             return results 
   155             stream = java.io.ByteArrayInputStream(java.lang.String(self.dom.toxml()).getBytes("UTF-8"))
   229 #            import java.io.ByteArrayInputStream
   156             xmlReader = org.dom4j.io.SAXReader()
   230 #            import org.dom4j.io.SAXReader
   157             doc = xmlReader.read(stream)
   231 #            import org.dom4j.DocumentHelper
   158             xpath = org.dom4j.DocumentHelper.createXPath(xpath)
   232 #
   159             signalNodes = xpath.selectNodes(doc)
   233 #            stream = java.io.ByteArrayInputStream(java.lang.String(self.dom.toxml()).getBytes("UTF-8"))
   160             iterator = signalNodes.iterator()
   234 #            xmlReader = org.dom4j.io.SAXReader()
   161             out = []
   235 #            doc = xmlReader.read(stream)
   162             while iterator.hasNext():
   236 #            xpath = org.dom4j.DocumentHelper.createXPath(xpath)
   163                 p_iterator = iterator.next()
   237 #            signalNodes = xpath.selectNodes(doc)
   164                 out.append(MinidomAmara(p_iterator.asXML()))
   238 #            iterator = signalNodes.iterator()
   165             return out
   239 #            out = []
       
   240 #            while iterator.hasNext():
       
   241 #                p_iterator = iterator.next()
       
   242 #                out.append(MinidomAmara(p_iterator.asXML()))
       
   243 #            return out