
    Pj1                         d Z ddlZddlZddlZddlZddlZd Zd Zd Zd Z	ddZ
ddZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zedk(  r e        yy)a  
mcsj-swing-bridge-client.py

CLI client for the in-process Swing control bridge agent (SwingBridgeAgent.java).
Talks to 127.0.0.1:9797 (or a custom host:port) using a trivial line-based
text protocol: send one line, read one line (or full response) back.

Usage:
    python mcsj-swing-bridge-client.py tree [--pretty]
    python mcsj-swing-bridge-client.py click <selector>
    python mcsj-swing-bridge-client.py settext <selector> <value...>
    python mcsj-swing-bridge-client.py gettext <selector>
    python mcsj-swing-bridge-client.py ping
    python mcsj-swing-bridge-client.py raw "<any raw command line>"

Options:
    --host HOST     default 127.0.0.1
    --port PORT     default 9797
    --timeout SEC   socket timeout, default 15

Examples:
    python mcsj-swing-bridge-client.py tree --pretty
    python mcsj-swing-bridge-client.py click MyClickButton
    python mcsj-swing-bridge-client.py settext MyTextField hello world
    python mcsj-swing-bridge-client.py gettext MyTextField
    Nc                    t        j                  | |f|      5 }|j                  |       |j                  d      s|dz  }|j	                  |j                  d             |j                  t         j                         g }	 	 |j                  d      }|sn|j                  |       'dj                  |      j                  dd      cddd       S # t         j                  $ r Y @w xY w# 1 sw Y   yxY w)	zOpen a fresh TCP connection, send one line, read the full response
    (server closes the connection after replying), return raw text.)timeout
utf-8i       replace)errorsN)socketcreate_connection
settimeoutendswithsendallencodeshutdownSHUT_WRrecvr   appendjoindecode)hostportr   command_lineschunksdatas          4C:/MCSJAgent/SwingBridge/mcsj-swing-bridge-client.pysend_commandr   #   s     
	!	!4,	@A	W$$T*D L			,%%g./	

6>>"vve} MM$  xx&&wy&A 
A	@ >>  
A	@s0   A*C/C6C/C,)C/+C,,C//C8c                 :    | dk(  rt        j                  d      | S )N*z/wildcard '*' is forbidden for guarded mutationsargparseArgumentTypeErrorvalues    r   non_wildcardr%   8   s     |(()Z[[Lr   c                 B    | dk(  sd| vrt        j                  d      | S )Nr   .z0a fully-qualified non-wildcard class is requiredr    r#   s    r   fully_qualified_classr(   >   s'    |s%'(()[\\Lr   c                     | dk(  ry| dk(  ryt        j                  | j                  d            j                  d      j	                  d      S )Nr    r'   r   ascii=)base64urlsafe_b64encoder   r   rstripr#   s    r   protocol_tokenr0   D   sG    |{##ELL$9:AA'JQQRUVVr   c                    	 t        j                  |       }t        t        j                  ||rdnd |rd nd             |S # t         j                  $ r4}t        t        j                  dd|z  d             t        d      d }~ww xY w)NERRORznon-JSON bridge response: %s)statusmessage   ),:)indent
separators)jsonloadsJSONDecodeErrorprintdumps
SystemExit)respprettyobjexcs       r   print_json_responserD   L   sy    jj 
$**Sf$64Wa
bcJ	  djjG8VY\8\]^_ms   A B	/BB	c                 Z    t        | |      }|j                  d      dk7  rt        d      y )Nr3   OKr5   )rD   getr?   )r@   rA   rB   s      r   print_mutation_responserH   V   s.    
dF
+C
wwxD m !r   c                    dj                  t        | j                        | j                  t        | j                        t        | j
                        t        | j                        | j                  t        | j                        t        | j                              }t        t        | j                  | j                  | j                  |      | j                         y )Nz"FXEDITTEXT {} {} {} {} {} {} {} {})formatr0   panel_class	panel_nth
node_classidtextnode_nthexpectednew_textrH   r   r   r   r   rA   argscommands     r   cmd_fxedittextrV   \   s    299t''($..t')@.QUQZQZB[~dmm4nT]]6SUG LDIIt||WUW[WbWbcr   c                    dj                  t        | j                        | j                  t        | j                        | j
                  | j                  | j                  | j                  t        | j                              }t        t        | j                  | j                  | j                  |      | j                         y )Nz#FXTABLECELL {} {} {} {} {} {} {} {})rJ   r0   rK   rL   header	table_nthrowcolumnactionrQ   rH   r   r   r   r   rA   rS   s     r   cmd_fxtablecellr]   d   s    3::t''($...:U$++t{{N4==<Y[G LDIIt||WUW[WbWbcr   c                 8   dj                  t        | j                        t        | j                        t	        | j
                        j                               }t        t        | j                  | j                  | j                  |      | j                         y )NzFXSELECTRADIO {} {} {} true)rJ   r0   rK   rO   strexpected_selectedlowerrH   r   r   r   r   rA   rS   s     r   cmd_fxselectradiorb   k   sl    +22t''(.*CD""#))+-G LDIIt||WUW[WbWbcr   c                 8   dj                  t        | j                        t        | j                        t	        | j
                        j                               }t        t        | j                  | j                  | j                  |      | j                         y )NzFXFIREBUTTON {} {} {})rJ   r0   rK   rO   r_   expected_disabledra   rH   r   r   r   r   rA   rS   s     r   cmd_fxfirebuttonre   r   sl    %,,t''(.*CD""#))+-G LDIIt||WUW[WbWbcr   c                 2   dj                  t        | j                        t        | j                        t        | j                        | j
                        }t        t        | j                  | j                  | j                  |      | j                         y )NzFXCOMBOOPTIONS {} {} {} {})rJ   r0   rK   rM   rN   rP   rD   r   r   r   r   rA   rS   s     r   cmd_fxcombooptionsrg   y   sg    *11t''(.*Itww0G TYY		4<<QSWS^S^_r   c           
         dj                  t        | j                        t        | j                        t        | j                        | j
                  t        | j                        t        | j                              }t        t        | j                  | j                  | j                  |      | j                         y )NzFXSELECTCOMBO {} {} {} {} {} {}rJ   r0   rK   rM   rN   rP   rQ   rR   rH   r   r   r   r   rA   rS   s     r   cmd_fxselectcomborj      s    /66t''(.*Itwwt}}%~dmm'DFG LDIIt||WUW[WbWbcr   c           
         dj                  t        | j                        t        | j                        t        | j                        | j
                  t        | j                        t        | j                              }t        t        | j                  | j                  | j                  |      | j                         y )NzFXSELECTDATE {} {} {} {} {} {}ri   rS   s     r   cmd_fxselectdaterl      s    .55t''(.*Itwwt}}%~dmm'DFG LDIIt||WUW[WbWbcr   c           	      p   dj                  t        | j                        | j                  t        | j                        t        | j
                        t        | j                        | j                        }t        t        | j                  | j                  | j                  |      | j                         y )NzFXFIND {} {} {} {} {} {})rJ   r0   rK   rL   rM   rN   rO   limitrD   r   r   r   r   rA   rS   s     r   
cmd_fxfindro      sy    (//t''($..t')@tyy!4::/G TYY		4<<QSWS^S^_r   c                     t        t        | j                  | j                  | j                  d      | j
                         y )NFXSTATE)rD   r   r   r   r   rA   )rT   s    r   cmd_fxstaterr      s*    TYY		4<<SUYU`U`ar   c                 t   t        | j                  | j                  | j                  d      }| j                  r7	 t        j                  |      }t        t        j                  |d             y t        |       y # t
        j                  $ r(}t        d|z  t        j                         Y d }~Bd }~ww xY w)NTREEr5   )r8   z5[warn] response was not valid JSON (%s); printing rawfile)r   r   r   r   rA   r:   r;   r=   r>   r<   sysstderr)rT   r@   rB   es       r   cmd_treerz      s    		499dllFCD{{	`**T"C$**S+, 
$K ## 	`IAMTWT^T^__	`s   5A< <B7B22B7c                     t        | j                  | j                  | j                  d| j                  z        }t        |       y )NzCLICK %sr   r   r   r   selectorr=   rT   r@   s     r   	cmd_clickr      s.    		499dllJ<VWD	$Kr   c           	          dj                  | j                        }t        | j                  | j                  | j
                  d| j                  d|      }t        |       y )N zSETTEXT )r   r$   r   r   r   r   r}   r=   )rT   r$   r@   s      r   cmd_settextr      sA    HHTZZ E		499dllt}}^c<deD	$Kr   c                     t        | j                  | j                  | j                  d| j                  z        }t        |       y )Nz
GETTEXT %sr|   r~   s     r   cmd_gettextr      s.    		499dllL4==<XYD	$Kr   c                 r    t        | j                  | j                  | j                  d      }t	        |       y )NPING)r   r   r   r   r=   r~   s     r   cmd_pingr      s%    		499dllFCD	$Kr   c                     t        | j                  | j                  | j                  | j                        }t        |       y )N)r   r   r   r   liner=   r~   s     r   cmd_rawr      s)    		499dllDIIFD	$Kr   c                     t        j                  d      } | j                  dd       | j                  dt        d       | j                  d	t        d
       | j                  dd      }|j                  dd      }|j                  ddt               |j                  dt        dgd       |j                  ddt        d       |j                  ddt               |j                  dd       |j                  dt        dgd       |j                  ddt               |j                  dd d       |j                  d!d"#       |j                  t        $       |j                  d%d&      }|j                  ddt               |j                  dt        dgd       |j                  d'dt        d()       |j                  d*t        dgd       |j                  d+t        d,       |j                  d-t        d,       |j                  d.g d/d01       |j                  ddt               |j                  d!d"#       |j                  t        $       |j                  d2d3      }|j                  ddt               |j                  ddt               |j                  d4d"#       |j                  d!d"#       |j                  t        $       |j                  d5d6      }|j                  ddt               |j                  ddt               |j                  d7d"#       |j                  d!d"#       |j                  t        $       |j                  d8d9      }|j                  ddt               |j                  dddt        :       |j                  dd       |j                  dt        dd;gd       |j                  d!d"#       |j                  t        $       |j                  d<d=      }|j                  ddt               |j                  dddt        :       |j                  dd       |j                  dt        dd;gd       |j                  ddt               |j                  dd dt        :       |j                  d!d"#       |j                  t        $       |j                  d>d?      }|j                  ddt               |j                  dddt        :       |j                  dd       |j                  dt        dd;gd       |j                  ddt               |j                  dd dt        :       |j                  d!d"#       |j                  t         $       |j                  d@dA      }|j                  ddB       |j                  dt        d       |j                  dddC       |j                  dd       |j                  dd       |j                  dDt        dE       |j                  d!d"#       |j                  t"        $       |j                  dFdG      }|j                  d!d"dHI       |j                  t$        $       |j                  dJdK      }|j                  d!d"dHI       |j                  t&        $       |j                  dLdM      }|j                  dN       |j                  t(        $       |j                  dOdP      }|j                  t*        $       | j-                         }	 |j/                  |       y # t0        t2        j4                  t6        f$ rT}t9        dQ|j:                  |j<                  |fz  t>        j@                  R       t?        jB                  d;       Y d }~y d }~ww xY w)SNzSwing control bridge client)descriptionz--hostz	127.0.0.1)defaultz--portiE&  )typer   z	--timeoutg      .@cmdT)destrequired
fxedittextz/guarded panel-scoped JavaFX text edit (AgentV7))helpz--panel-class)r   r   z--panel-nthr   )r   choicesr   z--classrM   zjavafx.scene.control.TextField)r   r   r   z--idz--textr   z
--node-nthz
--expectedz--newrR   z--pretty
store_true)r\   )funcfxtablecellz-target a specific JavaFX table cell (AgentV7)z--headerz'exact header text identifying the table)r   r   r   z--table-nthz--row)r   r   z--columnz--action)selecteditdoubleclickr   )r   r   fxselectradioz9fire an exact panel-scoped JavaFX radio action (AgentV10)z--expected-selectedfxfirebuttonz;fire an exact enabled panel-scoped JavaFX button (AgentV10)z--expected-disabledfxcombooptionsz2list exact options for a panel-scoped JavaFX combo)r   r   r      fxselectcomboz$guarded exact JavaFX combo selectionfxselectdatez/guarded exact JavaFX DatePicker value selectionfxfindz0exact panel-scoped JavaFX node lookup (AgentV10))r   )r   r   z--limit2   fxstatez'compact JavaFX semantic state (AgentV7)zpretty-print JSON)r\   r   treez dump full component tree as JSONgettextz'get text of a component by name or textr}   pingzcheck the agent is alivez/[error] could not talk to bridge at %s:%d -- %sru   )"r!   ArgumentParseradd_argumentintfloatadd_subparsers
add_parserr(   r%   set_defaultsrV   r]   rb   re   rg   rj   rl   ro   rr   rz   r   r   
parse_argsr   ConnectionRefusedErrorr
   r   OSErrorr=   r   r   rw   rx   exit)psubsprT   ry   s        r   mainr      sS   ,IJANN8[N1NN8#tN4NN;UDN9




5C	+\	]BOOOd9NOOOOMaS!ODOOIL7LVvOwOOFTO=OOHcO*OOLsQCOCOOL4lOCOOG*tO<OOJ|O4OOO(	,[	\BOOOd9NOOOOMaS!ODOOJLGpOqOOMaS!ODOOG#O5OOJS4O8OOJ(IS[O\OOL4lOCOOJ|O4OOO)	.i	jBOOOd9NOOOOHt,O?OO),O?OOJ|O4OO*O+	-j	kBOOOd9NOOOOHt,O?OO),O?OOJ|O4OO)O*	(/c	dBOOOd9NOOOOIL4F[O\OOFCO(OOLsQFAOFOOJ|O4OO+O,	.T	UBOOOd9NOOOOIL4F[O\OOFCO(OOLsQFAOFOOL4lOCOOG*t,OOOOJ|O4OO*O+	-^	_BOOOd9NOOOOIL4F[O\OOFCO(OOLsQFAOFOOL4lOCOOG*t,OOOOJ|O4OO)O*	'Y	ZBOOOdO3OOMQO7OOIL#O>OOFCO(OOHcO*OOICO4OOJ|O4OOO$		(Q	RBOOJ|:MONOOO%	%G	HBOOJ|:MONOOO"		(Q	RBOOJOOO%	%?	@BOOO" <<>D		$"FNNG< ?499diiYZB[[beblblms   <] _ ,A
^;;_ __main__)F)__doc__r!   r-   r:   r
   rw   r   r%   r(   r0   rD   rH   rV   r]   rb   re   rg   rj   rl   ro   rr   rz   r   r   r   r   r   r   __name__ r   r   <module>r      s   4     
B*Wdddd`dd`b	



hV zF r   