ó
]|OVc           @   sÃ   d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l m Z d  d l Z d  d l Z d  d l j	 Z
 d  d l m Z m Z m Z d  d l m Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(	   iÿÿÿÿN(   t   StringIO(   t   ElementTreet   Elementt
   SubElement(   t   ArtifactValidationExceptiont   XMvnConfigExceptionc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyR   .   s   t
   XMvnConfigc           B   sÈ   e  Z d  Z e j j d d ƒ Z e j j d d ƒ Z d Z d „  Z	 d „  Z
 d „  Z d d	 „ Z d
 „  Z d „  Z d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z e d „ Z d „  Z RS(   s0   
    Class for modifying XMvn configuration
    s   .xmvns   javapackages-rule-indexs   config.ds)   http://fedorahosted.org/xmvn/CONFIG/0.6.0c         C   s§   d |  _  y t j t j d ƒ Wn t k
 r3 n Xy5 t t j ƒ   } t | j	 ƒ  ƒ d |  _
 Wd  QXWn7 t k
 r¢ } | j t j k r™ d |  _
 q£ | ‚ n Xd  S(   Ns„   <?xml version='1.0' encoding='utf-8'?>
<configuration xmlns="http://fedorahosted.org/xmvn/CONFIG/0.6.0">
{content}
</configuration>
ií  i   (   t   templateXMLt   ost   makedirsR   t
   CONFIG_DIRt   OSErrort   opent
   INDEX_PATHt   intt   readt   indext   IOErrort   errnot   ENOENT(   t   selfR   t   e(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __init__:   s    	#c         C   sE   t  t j d ƒ - } | j t |  j ƒ ƒ |  j d |  _ Wd  QXd  S(   Nt   wi   (   R   R   R   t   writet   strR   (   R   R   (    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __write_indexP   s    c         C   s+   d j  d |  j ƒ } t j j t j | ƒ S(   Ns#   javapackages-config-{index:05d}.xmlR   (   t   formatR   R
   t   patht   joinR   R   (   R   t   fname(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __get_current_configU   s    t    c         C   s^   |  j  ƒ  t ƒ  } | j |  j j d | ƒ ƒ t j | j ƒ  ƒ } | j t j	 d ƒ ƒ | S(   Nt   contents[   XMvn configuration file generated by javapackages.xmvn_config  (part of javapackages-tools)(
   t   _XMvnConfig__write_indexR    R   R	   R   t   ETt
   fromstringt   getvaluet   appendt   Comment(   R   R#   t   xmlbuft   root(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt
   __init_xmlZ   s    
	c      
   C   sN   t  ƒ  } t ƒ  } | j | ƒ | j | d t d d d d d t ƒ| j ƒ  S(   Nt   xml_declarationt   encodings   utf-8t   methodt   xmlt   pretty_print(   R    R   t   _setrootR   t   TrueR'   (   R   t   elemR*   t   et(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __prettify_elementf   s    		c         C   s>   |  j  | ƒ } t j | d d ƒ  } | j | ƒ Wd  QXd  S(   Ns   w+s   utf-8(   t   _XMvnConfig__prettify_elementt   codecsR   R   (   R   R   R+   t   xmlstrt   fout(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __write_xmlr   s    c   	      C   sÕ   | s t  d ƒ ‚ n  |  j ƒ  } |  j ƒ  } t | | ƒ } t | | ƒ } | } | ri t | | ƒ } n  t | t ƒ r„ | | _ n= t | t ƒ r´ x+ | D] } | j | ƒ qš Wn | j | ƒ |  j	 | | ƒ d  S(   Ns#   Provide content as keyword argument(
   t	   Exceptiont   _XMvnConfig__get_current_configt   _XMvnConfig__init_xmlR   t
   isinstancet
   basestringt   textt   listR(   t   _XMvnConfig__write_xml(	   R   t   level1t   level2t   level3R#   t   confpathR+   t
   cont_levelR4   (    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __add_configx   s     c         C   s^   t  j d ƒ } g  | j | ƒ D] } t | ƒ ^ q } | rZ t d „  | j | ƒ Dƒ ƒ Sd S(   sI   
        Return maximum number of backreference used in string s
        s   @(\d+)c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R   (   t   .0t   x(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pys	   <genexpr>–   s    i    (   t   ret   compilet   findallR   t   max(   R   t   st
   backref_reRK   t   backref_nos(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __count_backreferences   s
    (c         C   s=   | j  d ƒ } | j  d ƒ } | | k r9 t d ƒ ‚ n  | S(   sC   
        Return number of wildcard groups used in string s
        t   {t   }sW   Number of opening and closing parenthesis for groups of wildcard matching is different.(   t   countR<   (   R   RP   t   leftt   right(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   __count_wildcard_groups™   s
    c   	      C   sã   | j  d t ƒ |  j | j ƒ  ƒ } | j d d ƒ } | g } t d ƒ } xm | D]e } | j  d t d t ƒ |  j | j ƒ  ƒ } | | k rŸ t d ƒ ‚ n  | j | j d d ƒ ƒ qS W| j | ƒ |  j	 d	 d
 d | ƒd S(   sÄ   
        Adds alias artifacts for given main artifact

        artifact -- main Artifact for which aliases are being provided
        aliases -- list of alternate Artifact representations
        t   allow_backrefR+   t   artifactGlobt   aliasest   allow_emptyt   allow_wildcardss8   Number of backrefenreces is higher than wildcard groups.t   aliast   artifactManagementt   ruleR#   N(
   t   validatet   Falset"   _XMvnConfig__count_wildcard_groupst   get_rpm_strt   get_xml_elementR   t!   _XMvnConfig__count_backreferencesR   R(   t   _XMvnConfig__add_config(	   R   t   artifactR\   t   wild_groupst   maint   elemst   aelemR_   t   backrefs(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   add_aliases¥   s    	c   
      C   sÌ   | j  d t ƒ |  j | j | j ƒ ƒ } | j d d ƒ } | g } t d ƒ } xP | D]H } |  j | ƒ } | | k r‰ t d ƒ ‚ n  t	 | d ƒ }	 | |	 _
 qY W| j | ƒ |  j d d d	 | ƒd
 S(   s´   
        Change where on filesystem given artifact is installed

        artifact -- Artifact to be modified
        versions -- list of compat versions for given artifact
        RZ   R+   R[   t   versionss8   Number of backrefenreces is higher than wildcard groups.t   versionR`   Ra   R#   N(   Rb   Rc   Rd   Re   Rq   Rf   R   Rg   R   R   RA   R(   Rh   (
   R   Ri   Rp   Rj   Rk   Rl   t   velemRq   Rn   t   ve(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   add_compat_versions¼   s    	c   
      C   s   | j  d t ƒ |  j | j ƒ  ƒ } | j d d ƒ } | g } t d ƒ } g  | D] } t j j | ƒ sS | ^ qS s† t	 d ƒ ‚ n  xP | D]H } |  j
 | ƒ } | | k r½ t d ƒ ‚ n  t | d ƒ }	 | |	 _ q W| j | ƒ |  j d d	 d
 | ƒd S(   s§   
        Change where on filesystem given artifact is installed

        artifact -- Artifact to be modified
        paths -- list of paths for given artifact
        RZ   R+   R[   t   filess"   At least one path must be relatives8   Number of backrefenreces is higher than wildcard groups.t   fileR`   Ra   R#   N(   Rb   Rc   Rd   Re   Rf   R   R
   R   t   isabsR   Rg   R   R   RA   R(   Rh   (
   R   Ri   t   pathsRj   Rk   Rl   t   felemR   Rn   t   pe(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   add_file_mappingÓ   s    	+c   
      C   sÑ   | j  d t ƒ |  j | j ƒ  ƒ } | j d d ƒ } |  j | ƒ } | | k ra t d ƒ ‚ n  | g } | r• t d ƒ } d | _ | j	 | ƒ n  t d ƒ }	 | |	 _ | j	 |	 ƒ |  j
 d d	 d
 | ƒd S(   s§   
        Change which package given artifact belongs to

        artifact -- Artifact to be modified
        package -- subpackage name where artifact belongs
        RZ   R+   R[   s8   Number of backrefenreces is higher than wildcard groups.t   optionalt   truet   targetPackageR`   Ra   R#   N(   Rb   Rc   Rd   Re   Rf   Rg   R   R   RA   R(   Rh   (
   R   Ri   t   packageR|   Rj   Rk   Rn   Rl   t   optt   target(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   add_package_mappingì   s    			c         C   sÓ   | j  d ƒ } |  j ƒ  } |  j ƒ  } | } x | D] } t | | ƒ } q4 WyL d j | ƒ } t j | ƒ }	 |	 j | _ x |	 D] }
 | j |
 ƒ q WWn# t	 j
 j k
 r¾ t d ƒ ‚ n X|  j | | ƒ d S(   sâ  
        Add custom configuration option

        optionstr -- XPath-like expression for specifying XMvn configuration
                     option location with '/' used as delimiter

                     example: buildSettings/compilerSource
        content -- XML content to be added to specified node. Can be just text, XML node or multiple nodes.

                   examples:
                   someText
                   <someNode>someText</someNode><someOtherNode/>
        t   /s   <root>{0}</root>s)   content is not valid content for XML nodeN(   t   splitR=   R>   R   R   R%   R&   RA   R(   t   lxmlt   etreet   XMLSyntaxErrorR<   RC   (   R   t	   optionstrR#   t
   node_namesRG   R+   t   part   nodet   insertedt   contentRoott   element(    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   add_custom_option  s    N(   R   R   t   __doc__R
   R   R   R   R   t   XMLNSR   R$   R=   R>   R7   RC   t   NoneRh   Rg   Rd   Ro   Rt   R{   Rc   R‚   R   (    (    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyR   1   s$   						
				(   R8   R
   R   RL   R    t   xml.dom.minidomR0   R…   t
   lxml.etreeR†   R%   R   R   R   t   javapackages.artifactR   R<   R   t   objectR   (    (    (    s<   /usr/lib/python2.7/site-packages/javapackages/xmvn_config.pyt   <module>!   s   