JBoss Rich Faces SVN: r19656 - in management/design-4x: fileUpload and 2 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: admitriev
Date: 2010-10-22 12:54:29 -0400 (Fri, 22 Oct 2010)
New Revision: 19656
Added:
management/design-4x/fileUpload/
management/design-4x/fileUpload/fileUpload.html
management/design-4x/fileUpload/images/
management/design-4x/fileUpload/images/bg_ProgressBar.png
management/design-4x/fileUpload/images/bg_ProgressBar_perm.gif
management/design-4x/fileUpload/images/bg_RegressBar.png
management/design-4x/fileUpload/images/bg_RegressBar_perm.gif
management/design-4x/fileUpload/images/bg_button.png
management/design-4x/fileUpload/images/bg_header.png
management/design-4x/fileUpload/images/bg_press.png
management/design-4x/fileUpload/images/bg_uploaded.png
management/design-4x/fileUpload/images/ico_add.gif
management/design-4x/fileUpload/images/ico_add_dis.gif
management/design-4x/fileUpload/images/ico_clear.gif
management/design-4x/fileUpload/images/ico_clear_dis.gif
management/design-4x/fileUpload/images/ico_file.gif
management/design-4x/fileUpload/images/ico_file_32.gif
management/design-4x/fileUpload/images/ico_start.gif
management/design-4x/fileUpload/images/ico_start_dis.gif
management/design-4x/fileUpload/images/ico_stop.gif
management/design-4x/panel_menu/
management/design-4x/panel_menu/icon.gif
management/design-4x/panel_menu/panel_menu.html
management/design-4x/panel_menu/pmenu_bg.gif
Log:
Added: management/design-4x/fileUpload/fileUpload.html
===================================================================
--- management/design-4x/fileUpload/fileUpload.html (rev 0)
+++ management/design-4x/fileUpload/fileUpload.html 2010-10-22 16:54:29 UTC (rev 19656)
@@ -0,0 +1,290 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+<head>
+<title>1</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
+
+<style>
+body{margin : 20px}
+
+.rf_upd_font{font-family : verdana /*generalFamilyFont*/ ; font-size : 11px/*generalSizeFont*/;}
+
+#rf_upd_tbl{width : 100%}
+#rf_upd_tbl td{border-bottom:1px solid #c0c0c0 /*tableBorderColor*/;white-space : nowrap;}
+
+.rf_upd_lst_width{ width:400px;}
+.rf_upd_lst_decor{ border:1px solid #c0c0c0 /*tableBorderColor*/; background : #FFFFFF /*tableBackgroundColor*/;}
+.rf_upd_lst_oflw{height : 210px; overflow : auto; overflow-x : hidden;}
+.rf_upd_name{ width : 100%; height : 50px; padding : 2px 10px 2px 10px;}
+.rf_upd_del{ width : 90px; text-align : center; padding-top : 3; padding-bottom : 3;}
+.rf_upd_scrl{ width : 10px; text-align : center;}
+.rf_upd_anc{ color : ##0078D0/*generalLinkColor*/;}
+
+.rf_upd_tbr_decor{ background : #EAF0F8 /*additionalBackgroundColor*/;border-bottom:1px solid #c0c0c0 /*tableBorderColor*/;border-top:1px solid #FFFFFF /*tableBackgroundColor*/;border-left:1px solid #FFFFFF /*tableBackgroundColor*/;padding : 2px}
+
+
+.rf_upd_bar_extr{height : 7px; border : 1px solid #c0c0c0 /*panelBorderColor*/;}
+.rf_upd_bar_uploaded{height : 7px; width : 70%; height : 100%; background : #FF9409 /**/; background-image : url(images/bg_ProgressBar_perm.gif);background-repeat : repeat-x; font-size : 0px;}
+.rf_upd_bar_del{height : 7px; width : 40%; height : 100%; background : #FF9409 /**/; background-image : url(images/bg_RegressBar_perm.gif);background-repeat : repeat-x; font-size : 0px;}
+.rf_upd_bar_shell{height : 7px; width : 100%; height : 8; background : #F1F1F1/*tableSubfooterBackgroundColor*/;}
+
+
+.rf_upd_btn_brd{
+ border : 1px solid #C0C0C0; /*tableBorderColor*/
+ margin : 2px;
+}
+.rf_upd_btn{
+ background : url(images/bg_header.png) /*from additionalBackgroundColor to trimColor*/ top left #C6D6EA /*trimColor*/ repeat-x;
+ cursor : pointer;
+ padding : 2px;
+}
+.rf_upd_btn_light{
+ background : url(images/bg_header.png) /*from additionalBackgroundColor to headerGradientColor*/ top left #C6D6EA /*trimColor*/ repeat-x;
+ border : 1px solid #E79A00; /*selectControlColor*/
+ cursor : pointer;
+ padding : 1px;
+}
+.rf_upd_btn_dis{
+ background :#f1f1f1 /*trimColor*/ repeat-x;
+ cursor : pointer;
+ padding : 2px;
+}
+
+.rf_upd_btn_press{
+ background : url(images/bg_press.png) /*from additionalBackgroundColor to trimColor*/ top left repeat-x #EAF0F8; /* additionalBackgroundColor*/
+ border : 1px solid #E79A00; /*selectControlColor*/
+ padding : 2px 0px 0px 2px;
+}
+a.rf_upd_btn_sel{
+ text-decoration : none;
+ color : #000000; /*generalTextColor*/
+ display : block;
+}
+.rf_upd_btn_cnt{
+ padding : 2px 6px 2px 3px;
+ text-align : left;
+ white-space : nowrap;
+}
+.rf_upd_ico{
+ vertical-align: middle;
+ margin-right : 3px;
+}
+
+.rf_upd_name_pdng{padding : 2px 0px 2px 0px;}
+
+.rf_upd_ico{background-position : 0px 50%; background-repeat : no-repeat; padding-left : 19px}
+.rf_upd_ico_add{background-image : url(images/ico_add.gif)}
+.rf_upd_ico_add_dis{background-image : url(images/ico_add_dis.gif); color:#C0C0C0; /*tableBorderColor*/}
+
+.rf_upd_ico_start{background-image : url(images/ico_start.gif)}
+.rf_upd_ico_start_dis{background-image : url(images/ico_start_dis.gif); color:#C0C0C0; /*tableBorderColor*/}
+
+.rf_upd_ico_stop{background-image : url(images/ico_stop.gif)}
+
+.rf_upd_ico_clear{background-image : url(images/ico_clear.gif)}
+.rf_upd_ico_clear_dis{background-image : url(images/ico_clear_dis.gif); color:#C0C0C0; /*tableBorderColor*/}
+
+
+</style>
+</head>
+<body>
+
+
+<div class="rf_upd_lst_width rf_upd_lst_decor">
+ <table class="rf_upd_lst_width" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="rf_upd_tbr_decor">
+ <div class="rf_upd_btn_brd" style=" float:left"><div class="rf_upd_btn rf_upd_font" onmouseover="this.className='rf_upd_btn_light rf_upd_font'" onmousedown="this.className='rf_upd_btn_press rf_upd_font'" onmouseup="this.className='rf_upd_btn rf_upd_font'" onmouseout="this.className='rf_upd_btn rf_upd_font'"><a href="#" class="rf_upd_btn_sel"><div class="rf_upd_btn_cnt rf_upd_font rf_upd_ico rf_upd_ico_add">Add...</div></a></div></div>
+ <div class="rf_upd_btn_brd" style=" float:left"><div class="rf_upd_btn_dis rf_upd_font" onmouseover="this.className='rf_upd_btn_light rf_upd_font'" onmousedown="this.className='rf_upd_btn_press rf_upd_font'" onmouseup="this.className='rf_upd_btn rf_upd_font'" onmouseout="this.className='rf_upd_btn rf_upd_font'"><a href="#" class="rf_upd_btn_sel"><div class="rf_upd_btn_cnt rf_upd_font rf_upd_ico rf_upd_ico_start_dis"><b>Upload</b></div></a></div></div>
+ <!--div class="rf_upd_btn_brd" style=" float:left"><div class="rf_upd_btn rf_upd_font" onmouseover="this.className='rf_upd_btn_light rf_upd_font'" onmousedown="this.className='rf_upd_btn_press rf_upd_font'" onmouseup="this.className='rf_upd_btn rf_upd_font'" onmouseout="this.className='rf_upd_btn rf_upd_font'"><a href="#" class="rf_upd_btn_sel"><div class="rf_upd_btn_cnt rf_upd_font rf_upd_ico rf_upd_ico_stop"><b>Stop</b></div></a></div></div-->
+ <div class="rf_upd_btn_brd" style=" float:right"><div class="rf_upd_btn rf_upd_font" onmouseover="this.className='rf_upd_btn_light rf_upd_font'" onmousedown="this.className='rf_upd_btn_press rf_upd_font'" onmouseup="this.className='rf_upd_btn rf_upd_font'" onmouseout="this.className='rf_upd_btn rf_upd_font'"><a href="#" class="rf_upd_btn_sel"><div class="rf_upd_btn_cnt rf_upd_font rf_upd_ico rf_upd_ico_clear">Clear All</div></a></div></div>
+ </td>
+ </tr>
+ </table>
+ <div class="rf_upd_lst_width rf_upd_lst_oflw">
+
+ <table border="0" cellpadding="0" cellspacing="0" id="rf_upd_tbl">
+ <tr>
+ <td class="rf_upd_font rf_upd_name">
+ <div class="rf_upd_name_pdng" style="word-wrap: break-word">
+ wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfile_upload.html
+ </div>
+
+
+ <!--div class="rf_upd_bar_extr">
+ <div class="rf_upd_bar_shell">
+ <div class="rf_upd_bar_uploaded">
+
+ </div>
+ </div>
+ </div-->
+
+ <div class="rf_upd_name_pdng">
+ <b>Done</b>
+ </div>
+
+
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_del"><a href="#" class="rf_upd_anc">Clear</a></div>
+ <div class="rf_upd_font rf_upd_del"><br /></div>
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_scrl"> </div>
+ </td>
+ </tr>
+ </table>
+
+
+
+ <table border="0" cellpadding="0" cellspacing="0" id="rf_upd_tbl">
+ <tr>
+ <td class="rf_upd_font rf_upd_name">
+ <div class="rf_upd_name_pdng">
+ file_upload.html
+ </div>
+
+
+ <div class="rf_upd_bar_extr">
+ <div class="rf_upd_bar_shell">
+ <div class="rf_upd_bar_uploaded">
+
+ </div>
+ </div>
+ </div>
+
+ <div class="rf_upd_name_pdng">
+ 120kb from 2000kb 04:56
+ </div>
+
+
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_del"><a href="#" class="rf_upd_anc">Stop</a></div>
+ <div class="rf_upd_font rf_upd_del"><br></div>
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_scrl"> </div>
+ </td>
+ </tr>
+ </table>
+
+
+
+ <table border="0" cellpadding="0" cellspacing="0" id="rf_upd_tbl">
+ <tr>
+ <td class="rf_upd_font rf_upd_name">
+ <div class="rf_upd_name_pdng">
+ file_upload.html
+ </div>
+
+
+ <!--div class="rf_upd_bar_extr">
+ <div class="rf_upd_bar_shell">
+ <div class="rf_upd_bar_uploaded">
+
+ </div>
+ </div>
+ </div-->
+
+ <div class="rf_upd_name_pdng">
+ <br>
+ </div>
+
+
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_del"><a href="#" class="rf_upd_anc">Clear</a></div>
+ <div class="rf_upd_font rf_upd_del"><br></div>
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_scrl"> </div>
+ </td>
+ </tr>
+ </table>
+
+
+
+
+ <table border="0" cellpadding="0" cellspacing="0" id="rf_upd_tbl">
+ <tr>
+ <td class="rf_upd_font rf_upd_name">
+ <div class="rf_upd_name_pdng">
+ file_upload.html
+ </div>
+
+
+ <!--div class="rf_upd_bar_extr">
+ <div class="rf_upd_bar_shell">
+ <div class="rf_upd_bar_uploaded">
+
+ </div>
+ </div>
+ </div-->
+
+ <div class="rf_upd_name_pdng">
+ <br>
+ </div>
+
+
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_del"><a href="#" class="rf_upd_anc">Clear</a></div>
+ <div class="rf_upd_font rf_upd_del"><br></div>
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_scrl"> </div>
+ </td>
+ </tr>
+ </table>
+
+
+
+
+ <table border="0" cellpadding="0" cellspacing="0" id="rf_upd_tbl">
+ <tr>
+ <td class="rf_upd_font rf_upd_name">
+ <div class="rf_upd_name_pdng">
+ file_upload.html
+ </div>
+
+
+ <!--div class="rf_upd_bar_extr">
+ <div class="rf_upd_bar_shell">
+ <div class="rf_upd_bar_uploaded">
+
+ </div>
+ </div>
+ </div-->
+
+ <div class="rf_upd_name_pdng">
+ <br>
+ </div>
+
+
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_del"><a href="#" class="rf_upd_anc">Clear</a></div>
+ <div class="rf_upd_font rf_upd_del"><br></div>
+ </td>
+ <td>
+ <div class="rf_upd_font rf_upd_scrl"> </div>
+ </td>
+ </tr>
+ </table>
+
+
+
+
+
+
+ </div>
+
+
+
+</div>
+
+
+</body>
+</html>
\ No newline at end of file
Added: management/design-4x/fileUpload/images/bg_ProgressBar.png
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_ProgressBar.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/bg_ProgressBar_perm.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_ProgressBar_perm.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/bg_RegressBar.png
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_RegressBar.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/bg_RegressBar_perm.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_RegressBar_perm.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/bg_button.png
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_button.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/bg_header.png
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_header.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/bg_press.png
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_press.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/bg_uploaded.png
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/bg_uploaded.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_add.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_add.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_add_dis.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_add_dis.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_clear.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_clear.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_clear_dis.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_clear_dis.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_file.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_file.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_file_32.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_file_32.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_start.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_start.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_start_dis.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_start_dis.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/fileUpload/images/ico_stop.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/fileUpload/images/ico_stop.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/panel_menu/icon.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/panel_menu/icon.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: management/design-4x/panel_menu/panel_menu.html
===================================================================
--- management/design-4x/panel_menu/panel_menu.html (rev 0)
+++ management/design-4x/panel_menu/panel_menu.html 2010-10-22 16:54:29 UTC (rev 19656)
@@ -0,0 +1,303 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+<title>coll_panel</title>
+<style>
+.rf_pm_size{
+ width : 300px;
+}
+
+.rf_pm_txt{
+ display : inline-block;
+ padding : 2px 3px 3px 3px;
+ font-size : 11px; /*generalSizeFont*/
+ font-family : verdana; /*generalFamilyFont*/
+}
+
+
+.rf_pm_lbl{
+ border : 1px solid #BED6F8; /*panelBorderColor*/
+ margin-bottom : 3px
+}
+
+.rf_pm_itm{
+ color : #000000; /*headerTextColor*/
+ padding : 2px 1px 2px 2px;
+ cursor : pointer;
+ border-top : 1px solid #BED6F8; /*panelBorderColor*/
+ padding-top : 2px;
+ margin-top : 1px;
+ cursor : pointer;
+}
+
+.rf_pm_1{
+ background-image : url(pmenu_bg.gif); /*from headerGradientColor to headerBackgroundColor*/
+ background-position : top left;
+ background-repeat : repeat-x;
+ background-color : #E9F2FF; /*headerBackgroundColor*/
+ border-top : 0px;
+ font-weight : bold;
+}
+
+.rf_pm_2 .rf_pm_ico_lft{
+ margin-left : 20px;
+}
+
+.rf_pm_3 .rf_pm_ico_lft{
+ margin-left : 40px;
+}
+
+.rf_pm_4 .rf_pm_ico_lft{
+ margin-left : 50px;
+}
+
+.rf_pm_5 .rf_pm_ico_lft{
+ margin-left : 80px;
+}
+
+.rf_pm_6 .rf_pm_ico_lft{
+ margin-left : 100px;
+}
+
+
+
+.rf_pm_grp{
+ font-weight : regular;
+ font-size : 11px; /*generalSizeFont*/
+ font-family : verdana; /*generalFamilyFont*/
+}
+
+.rf_pm_ico_lft{
+ float : left;
+}
+
+.rf_pm_ico_rgt{
+ float : right;
+}
+
+.rf_pm_dis{
+ color : #BED6F8; /*panelBorderColor*/
+}
+
+.rf_pm_sel{
+ background : #C7D7EC; /*additionalBackgroundColor*/
+ border-top : 1px solid #FFFFFF; /*panelBorderColor*/
+}
+
+.rf_pm_vis{
+ display : block;
+}
+
+.rf_pm_hid{
+ display : none;
+}
+
+
+</style>
+
+</head>
+
+<body>
+
+
+<div class="rf_pm_size">
+
+ <div class="rf_pm_lbl">
+ <div class="rf_pm_itm rf_pm_1">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ <div class="rf_pm_2 rf_pm_vis">
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ <div class="rf_pm_3 rf_pm_vis ">
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm rf_pm_sel">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ </div>
+
+ <div class="rf_pm_itm rf_pm_dis">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm rf_pm_dis">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ </div>
+
+ </div>
+
+
+ <div class="rf_pm_lbl">
+ <div class="rf_pm_itm rf_pm_1">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ <div class="rf_pm_2 rf_pm_hid">
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ <div class="rf_pm_3 rf_pm_hid ">
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm rf_pm_sel">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ </div>
+
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ </div>
+
+ </div>
+
+
+ <div class="rf_pm_lbl">
+ <div class="rf_pm_itm rf_pm_1">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ <div class="rf_pm_2 rf_pm_hid">
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ <div class="rf_pm_3 rf_pm_hid ">
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm rf_pm_sel">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ </div>
+
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+ <div class="rf_pm_itm">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_lft">
+ <img src="icon.gif" width="16" height="16" class="rf_pm_ico_rgt">
+ <span class="rf_pm_txt">
+ Display item name
+ </span>
+ </div>
+
+ </div>
+
+ </div>
+
+
+
+
+</div>
+
+
+
+
+
+
+
+</body>
+</html>
Added: management/design-4x/panel_menu/pmenu_bg.gif
===================================================================
(Binary files differ)
Property changes on: management/design-4x/panel_menu/pmenu_bg.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
13 years, 11 months
JBoss Rich Faces SVN: r19655 - in branches/RF-8742/ui/validator: ui and 8 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: pyaschenko
Date: 2010-10-22 11:24:57 -0400 (Fri, 22 Oct 2010)
New Revision: 19655
Added:
branches/RF-8742/ui/validator/ui/src/main/resources/
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/converter-number.js
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/length.js
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces-csv.js
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces.js
branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/validator-length.js
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java
Removed:
branches/RF-8742/ui/validator/impl/src/main/resources/META-INF/resources/
Modified:
branches/RF-8742/ui/validator/ui/pom.xml
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml
Log:
https://jira.jboss.org/browse/RF-8742
https://jira.jboss.org/browse/RF-9215
Modified: branches/RF-8742/ui/validator/ui/pom.xml
===================================================================
--- branches/RF-8742/ui/validator/ui/pom.xml 2010-10-22 15:08:12 UTC (rev 19654)
+++ branches/RF-8742/ui/validator/ui/pom.xml 2010-10-22 15:24:57 UTC (rev 19655)
@@ -84,7 +84,24 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.5.11</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <version>1.5.11</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.jboss.test-jsf</groupId>
+ <artifactId>jsf-test-jetty</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.test-jsf</groupId>
<artifactId>jsf-mock</artifactId>
<version>1.0.5-SNAPSHOT</version>
<scope>test</scope>
Added: branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/converter-number.js
===================================================================
--- branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/converter-number.js (rev 0)
+++ branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/converter-number.js 2010-10-22 15:24:57 UTC (rev 19655)
@@ -0,0 +1,13 @@
+RichFaces.csv.addConverter({"number":
+(function(rf) {
+ return function (value, params) {
+ var result;
+ if (isNaN(value)) {
+ throw rf.csv.getMessage(params.customMessages, 'NumberConverter.isNaN', [value]);
+ } else {
+ result = parseInt(value);
+ }
+ return result;
+ }
+})(window.RichFaces || (window.RichFaces={}))
+});
\ No newline at end of file
Added: branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/length.js
===================================================================
--- branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/length.js (rev 0)
+++ branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/length.js 2010-10-22 15:24:57 UTC (rev 19655)
@@ -0,0 +1,78 @@
+(function($, rf) {
+
+ rf.csv = rf.csv || {};
+
+ var _messages = {};
+ var _validators = {};
+ var _converters = {};
+
+ var RE_MESSAGE_PATTERN = /\{(\d+)\}/g;
+
+ $.extend(rf.csv, {
+ // Messages API
+ addMessage: function (messagesObject) {
+ $.extend(_messages, messagesObject);
+ },
+ getMessage: function(customMessages, id, values) {
+ var message = (customMessages && customMessages[id]) || _messages[id] || "";
+ if (message) {
+ var msgObject = message.replace(RE_MESSAGE_PATTERN,"\n$1\n").split("\n");
+ var value;
+ for (var i=1; i<msgObject.length; i+=2) {
+ value = values[msgObject[i]];
+ msgObject[i] = typeof value == "undefined" ? "" : value;
+ }
+ message = msgObject.join('');
+ }
+ return message;
+ },
+ // Validators API
+ addValidator: function (validatorFunctions) {
+ $.extend(_validators, validatorFunctions);
+ },
+ validate: function (event, id, validatorList, messageComponentList, options) {
+ var value;
+ var element = rf.getDomElement(id);
+ if (element.value) {
+ value = element.value;
+ } else {
+ var component = rf.$(element);
+ value = component && typeof component["getValue"] == "function" ? component.getValue() : "";
+ }
+ var result;
+ var messageComponentsUpdated = false;
+ var validatorFunction;
+ for (var validator in validatorList) {
+ validatorFunction = _validators[validator];
+ if (validatorFunction) {
+ result = validatorFunction(value, validatorList[validator]);
+ }
+ if (result && result.length>0) {
+ messageComponentsUpdated = true;
+ //updateMessageComponents(messageElementIds, result);
+ alert(result);
+ break;
+ }
+ }
+ !messageComponentsUpdated && alert("no message from validators");//updateMessageComponents(messageElementIds, "");
+ },
+ addFormValidators: function (formId, callValidatorFunctions) {
+
+ }
+ });
+})(jQuery, window.RichFaces || (window.RichFaces={}));
+
+
+RichFaces.csv.addValidator({"length":
+(function(rf) {
+ return function (value, params) {
+ var result = "";
+ if (value.length<params.min) {
+ result = rf.csv.getMessage(params.customMessages, 'LengthValidator.MINIMUM', [params.min,value]);
+ } else if (value.length>params.max){
+ result = rf.csv.getMessage(params.customMessages, 'LengthValidator.MAXIMUM', [params.max,value]);
+ }
+ return result;
+ }
+})(window.RichFaces || (window.RichFaces={}))
+});
\ No newline at end of file
Added: branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces-csv.js
===================================================================
--- branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces-csv.js (rev 0)
+++ branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces-csv.js 2010-10-22 15:24:57 UTC (rev 19655)
@@ -0,0 +1,144 @@
+(function($, rf) {
+
+ rf.csv = rf.csv || {};
+
+ var _messages = {};
+ var _validators = {};
+ var _converters = {};
+
+ var RE_MESSAGE_PATTERN = /\{(\d+)\}/g;
+
+ $.extend(rf.csv, {
+ // Messages API
+ addMessage: function (messagesObject) {
+ $.extend(_messages, messagesObject);
+ },
+ getMessage: function(customMessages, id, values) {
+ var message = (customMessages && customMessages[id]) || _messages[id] || "";
+ if (message) {
+ var msgObject = message.replace(RE_MESSAGE_PATTERN,"\n$1\n").split("\n");
+ var value;
+ for (var i=1; i<msgObject.length; i+=2) {
+ value = values[msgObject[i]];
+ msgObject[i] = typeof value == "undefined" ? "" : value;
+ }
+ message = msgObject.join('');
+ }
+ return message;
+ },
+ sendMessage: function (componentId, message) {
+ //rf.messageManager.send(componentId, message);
+ //rf.Event.fire("onMessage.RichFaces.componentId");
+ },
+ // Converters API
+ addConverter: function (converterFunctions) {
+ $.extend(_converters, converterFunctions);
+ },
+ getConverter: function (name) {
+ return _converters[name];
+ },
+ // Validators API
+ addValidator: function (validatorFunctions) {
+ $.extend(_validators, validatorFunctions);
+ },
+ validate: function (event, id, converter, validatorList) {
+ var value;
+ var element = rf.getDomElement(id);
+ if (element.value) {
+ value = element.value;
+ } else {
+ var component = rf.$(element);
+ // TODO: add getValue to baseComponent and change jsdocs
+ value = component && typeof component["getValue"] == "function" ? component.getValue() : "";
+ }
+ if (converter) {
+ try {
+ value = getConverter([converter.name])(value, converter.options);
+ } catch (e){
+ sendMessage(id, id+":"+e);
+ return false;
+ }
+ }
+ if (!validatorList) return true;
+ var validatorFunction;
+ var result;
+ for (var validator in validatorList) {
+ validatorFunction = _validators[validator];
+ if (validatorFunction) {
+ result = validatorFunction(value, validatorList[validator]);
+ }
+ if (result && result.length>0) {
+ sendMessage(id, id+":"+result);
+ return false;
+ }
+ }
+ return true;
+ },
+ addFormValidators: function (formId, callValidatorFunctions) {
+
+ }
+ });
+
+ /*
+ // component ids hash that can send messages
+ // each hash item contains array of message component id that receive messages from the component
+ _componentIds = {};
+ // array of message component id that will receive messages from all components
+ _messageComponentIds = {};
+
+ var messageDispatchers = {};
+ var addDispatcher = function (dispatcherId) {
+ };
+ var removeDispatcher: function (dispatcherId) {
+ };
+
+ rf.MessageDispatcher = function(id) {
+ this.id = id;
+ };
+ rf.BaseComponent.extend(rf.MessageDispatcher);
+
+ $.extend(rf.MessageDispatcher.prototype, {
+ register: function (messageComponentId, componentIds) {
+ if (!componentIds || componentIds.length==0) {
+ // global message listener
+ _messageComponents.push(messageComponentId);
+ }
+ var messageComponents;
+ for (var i=0;i<componentIds.length;i++) {
+ messageComponents = _components[componentIds[i]];
+ if (!messageComponents) {
+ messageComponents = _components[componentIds[i]] = [];
+ }
+ messageComponents.push(messageComponentId);
+ }
+ },
+ unregister: function (messageComponentId) {
+ var messageComponents;
+ for (var i=0;i<_components.length;i++) {
+ messageComponents = _components[i];
+ if (!messageComponents) {
+ messageComponents = _components[componentIds[i]] = [];
+ }
+ messageComponents.push(messageComponentId);
+ }
+ },
+ send: function (componentId, message) {
+ var messageComponents = _components[componentId];
+ if (messageComponents) {
+ for (var i=0;i<messageComponents.length;i++) {
+ rf.$(messageComponents[id]).update(message);
+ }
+ }
+ }
+ });
+ */
+
+ /*
+ * message.constructor () {
+ * rf.Event.bindById(this.id, "onMessage:RichFaces.global", onMessage );
+ * rf.Event.bindById(this.id, "onMessage.RichFaces.componentId", onMessage );
+ * }
+ *
+ */
+
+})(jQuery, window.RichFaces || (window.RichFaces={}));
\ No newline at end of file
Added: branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces.js
===================================================================
--- branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces.js (rev 0)
+++ branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/richfaces.js 2010-10-22 15:24:57 UTC (rev 19655)
@@ -0,0 +1,749 @@
+
+if (!window.RichFaces) {
+ /**
+ * Global object container for RichFaces API.
+ * All classes should be defined here.
+ * @class
+ * @name RichFaces
+ * @static
+ *
+ * */
+ window.RichFaces = {};
+}
+
+(function(jQuery, richfaces) {
+
+ // get DOM element by id or DOM element or jQuery object
+ richfaces.getDomElement = function (source) {
+ var type = typeof source;
+ var element;
+ if (type == "string") {
+ // id
+ element = document.getElementById(source);
+ } else if (type == "object") {
+ if (source.nodeType) {
+ // DOM element
+ element = source;
+ } else
+ if (source instanceof jQuery) {
+ // jQuery object
+ element = source.get(0);
+ }
+ }
+ return element;
+ }
+
+ // get RichFaces component object by component id or DOM element or jQuery object
+ richfaces.$ = function (source) {
+ var element = richfaces.getDomElement(source);
+
+ if (element) {
+ return (element["richfaces"] || {})["component"];
+ }
+ }
+
+ // find component and call his method
+ richfaces.invokeMethod = function(source, method) {
+ var c = richfaces.$(source);
+ if (c) {
+ var f = c[method];
+ if (typeof f == "function") {
+ return f.apply(c, Array.prototype.slice.call(arguments, 2));
+ }
+ }
+ }
+
+ //dom cleaner
+ richfaces.cleanDom = function(source) {
+ var e = (typeof source == "string") ? document.getElementById(source) : jQuery('body').get(0);
+ if (e) {
+ var elements = e.getElementsByTagName("*");
+ if (elements.length) {
+ jQuery.cleanData(elements);
+ jQuery.cleanData([e]);
+ jQuery.each(elements, function(index) {
+ richfaces.invokeMethod(this, "destroy");
+ });
+ richfaces.invokeMethod(e, "destroy");
+ }
+ }
+ }
+
+ //form.js
+ richfaces.submitForm = function(form, parameters, target) {
+ if (typeof form === "string") { form = jQuery(form) };
+ var initialTarget = form.attr("target");
+ var parameterInputs = new Array();
+ try {
+ form.attr("target", target);
+
+ if (parameters) {
+ for (var parameterName in parameters) {
+ var parameterValue = parameters[parameterName];
+
+ var input = jQuery("input[name='" + parameterName + "']", form);
+ if (input.length == 0) {
+ var newInput = jQuery("<input />").attr({type: 'hidden', name: parameterName, value: parameterValue});
+ if (parameterName === 'javax.faces.portletbridge.STATE_ID' /* fix for fileUpload in portlets */) {
+ input = newInput.prependTo(form);
+ } else {
+ input = newInput.appendTo(form);
+ }
+ } else {
+ input.val(parameterValue);
+ }
+
+ input.each(function() {parameterInputs.push(this)});
+ }
+ }
+
+ //TODO: inline onsubmit handler is not triggered - http://dev.jquery.com/ticket/4930
+ form.trigger("submit");
+ } finally {
+ form.attr("target", initialTarget);
+ jQuery(parameterInputs).remove();
+ }
+ };
+ //
+
+ //utils.js
+ jQuery.fn.toXML = function () {
+ var out = '';
+
+ if (this.length > 0) {
+ if (typeof XMLSerializer == 'function' ||
+ typeof XMLSerializer == 'object') {
+
+ var xs = new XMLSerializer();
+ this.each(function() { out += xs.serializeToString(this); });
+ } else if (this[0].xml !== undefined) {
+ this.each(function() { out += this.xml; });
+ } else {
+ this.each( function() { out += this; } );
+ }
+ }
+
+ return out;
+ };
+
+ //there is the same pattern in server-side code:
+ //org.ajax4jsf.javascript.ScriptUtils.escapeCSSMetachars(String)
+ var CSS_METACHARS_PATTERN = /([#;&,.+*~':"!^$\[\]()=>|\/])/g;
+
+ /**
+ * Escapes CSS meta-characters in string according to
+ * <a href="http://api.jquery.com/category/selectors/">jQuery selectors</a> document.
+ *
+ * @param s - string to escape meta-characters in
+ * @return string with meta-characters escaped
+ */
+ richfaces.escapeCSSMetachars = function(s) {
+ //TODO nick - cache results
+
+ return s.replace(CSS_METACHARS_PATTERN, "\\$1");
+ };
+
+ var logImpl;
+
+ richfaces.setLog = function(newLogImpl) {
+ logImpl = newLogImpl;
+ };
+
+ richfaces.log = {
+ debug: function(text) {
+ if (logImpl) {
+ logImpl.debug(text);
+ }
+ },
+
+ info: function(text) {
+ if (logImpl) {
+ logImpl.info(text);
+ }
+ },
+
+ warn: function(text) {
+ if (logImpl) {
+ logImpl.warn(text);
+ }
+ },
+
+ error: function(text) {
+ if (logImpl) {
+ logImpl.error(text);
+ }
+ },
+
+ setLevel: function(level) {
+ if (logImpl) {
+ logImpl.setLevel(level);
+ }
+ },
+
+ getLevel: function() {
+ if (logImpl) {
+ return logImpl.getLevel();
+ }
+ return 'info';
+ },
+
+ clear: function() {
+ if (logImpl) {
+ logImpl.clear();
+ }
+ }
+ };
+
+ /**
+ * Evaluates chained properties for the "base" object.
+ * For example, window.document.location is equivalent to
+ * "propertyNamesString" = "document.location" and "base" = window
+ * Evaluation is safe, so it stops on the first null or undefined object
+ *
+ * @param propertyNamesArray - array of strings that contains names of the properties to evaluate
+ * @param base - base object to evaluate properties on
+ * @return returns result of evaluation or empty string
+ */
+ richfaces.getValue = function(propertyNamesArray, base) {
+ var result = base;
+ var c = 0;
+ do {
+ result = result[propertyNamesArray[c++]];
+ } while (result && c != propertyNamesArray.length);
+
+ return result;
+ };
+
+ var VARIABLE_NAME_PATTERN_STRING = "[_A-Z,a-z]\\w*";
+ var VARIABLES_CHAIN = new RegExp("^\\s*"+VARIABLE_NAME_PATTERN_STRING+"(?:\\s*\\.\\s*"+VARIABLE_NAME_PATTERN_STRING+")*\\s*$");
+ var DOT_SEPARATOR = /\s*\.\s*/;
+
+ richfaces.evalMacro = function(macro, base) {
+ var value = "";
+ // variable evaluation
+ if (VARIABLES_CHAIN.test(macro)) {
+ // object's variable evaluation
+ var propertyNamesArray = jQuery.trim(macro).split(DOT_SEPARATOR);
+ value = richfaces.getValue(propertyNamesArray, base);
+ if (!value) {
+ value = richfaces.getValue(propertyNamesArray, window);
+ }
+ } else {
+ //js string evaluation
+ try {
+ if (base.eval) {
+ value = base.eval(macro);
+ } else with (base) {
+ value = eval(macro) ;
+ }
+ } catch (e) {
+ richfaces.log.warn("Exception: " + e.message + "\n[" + macro + "]");
+ }
+ }
+
+ if (typeof value == 'function') {
+ value = value(base);
+ }
+ //TODO 0 and false are also treated as null values
+ return value || "";
+ };
+
+ var ALPHA_NUMERIC_MULTI_CHAR_REGEXP = /^\w+$/;
+
+ richfaces.interpolate = function (placeholders, context) {
+ var contextVarsArray = new Array();
+ for (var contextVar in context) {
+ if (ALPHA_NUMERIC_MULTI_CHAR_REGEXP.test(contextVar)) {
+ //guarantees that no escaping for the below RegExp is necessary
+ contextVarsArray.push(contextVar);
+ }
+ }
+
+ var regexp = new RegExp("\\{(" + contextVarsArray.join("|") + ")\\}", "g");
+ return placeholders.replace(regexp, function(str, contextVar) {return context[contextVar];});
+ };
+
+ richfaces.clonePosition = function(element, baseElement, positioning, offset) {
+
+ };
+ //
+
+ var pollTracker = {};
+ richfaces.startPoll = function(options) {
+ var pollId = options.pollId;
+ var interval = options.pollinterval;
+ var ontimer = options.ontimer;
+ richfaces.stopPoll(pollId);
+
+ richfaces.setZeroRequestDelay(options);
+
+ pollTracker[pollId] = window.setTimeout(function(){
+ var pollElement = document.getElementById(pollId);
+ try {
+ ontimer.call(pollElement || window);
+ richfaces.startPoll(options);
+ } catch (e) {
+ // TODO: handle exception
+ }
+ },interval);
+ };
+
+ richfaces.stopPoll = function(id) {
+ if(pollTracker[id]){
+ window.clearTimeout(pollTracker[id]);
+ delete pollTracker[id];
+ }
+ };
+
+ var pushTracker = {};
+
+ richfaces.startPush = function(options) {
+ var clientId = options.clientId;
+ var pushResourceUrl = options.pushResourceUrl;
+ var pushId = options.pushId;
+ var interval = options.interval;
+ var ondataavailable = options.ondataavailable;
+ richfaces.setZeroRequestDelay(options);
+
+ richfaces.stopPush(pushId);
+
+ pushTracker[pushId] = setTimeout(function() { // TODO: define this function in richfaces object to avoid definition every time when call startPush
+ var ajaxOptions = {
+ type: "HEAD",
+ //TODO - encodeURIComponent; URL sessionId handling check
+ //TODO - add pushUri supports
+ url: pushResourceUrl + "?id=" + pushId,
+ dataType: "text",
+ complete: function(xhr) {
+ var isPushActive = !!pushTracker[pushId];
+
+ //TODO may someone wish to stop push from dataavailable handler?
+ delete pushTracker[pushId];
+
+ if (xhr.status == 200 && xhr.getResponseHeader("Ajax-Push-Status") == "READY") {
+ var pushElement = document.getElementById(clientId);
+ try {
+ ondataavailable.call(pushElement || window);
+ } catch (e) {
+ // TODO: handle exception
+ }
+ }
+
+ if (isPushActive) {
+ richfaces.startPush(options);
+ }
+ }
+ };
+
+ if (options.timeout) {
+ ajaxOptions.timeout = options.timeout;
+ }
+
+ jQuery.ajax(ajaxOptions);
+ }, interval);
+ };
+
+ richfaces.stopPush = function(id) {
+ if (pushTracker[id]){
+ window.clearTimeout(pushTracker[id]);
+ delete pushTracker[id];
+ }
+ };
+
+ var jsfEventsAdapterEventNames = {
+ event: {
+ 'begin': ['begin'],
+ 'complete': ['beforedomupdate'],
+ 'success': ['success', 'complete']
+ },
+ error: ['error', 'complete']
+ };
+
+ var getExtensionResponseElement = function(responseXML) {
+ return jQuery("partial-response > extension#org\\.richfaces\\.extension", responseXML);
+ };
+
+ var JSON_STRING_START = /^\s*(\[|\{)/;
+
+ var getJSONData = function(extensionElement, elementName) {
+ var dataString = jQuery.trim(extensionElement.children(elementName).text());
+ extensionElement.end();
+ try {
+ if (dataString) {
+ if (JSON_STRING_START.test(dataString)) {
+ return jQuery.parseJSON(dataString);
+ } else {
+ var parsedData = jQuery.parseJSON("{\"root\": " + dataString + "}");
+ return parsedData.root;
+ }
+ }
+ } catch (e) {
+ richfaces.log.warn("Error evaluating JSON data from element <" + elementName + ">: " + e.message);
+ }
+ return null;
+ };
+
+ richfaces.createJSFEventsAdapter = function(handlers) {
+ //hash of handlers
+ //supported are:
+ // - begin
+ // - beforedomupdate
+ // - success
+ // - error
+ // - complete
+ handlers = handlers || {};
+
+ return function(eventData) {
+ var source = eventData.source;
+ //that's request status, not status control data
+ var status = eventData.status;
+ var type = eventData.type;
+
+ var typeHandlers = jsfEventsAdapterEventNames[type];
+ var handlerNames = (typeHandlers || {})[status] || typeHandlers;
+
+ if (handlerNames) {
+ for (var i = 0; i < handlerNames.length; i++) {
+ var eventType = handlerNames[i];
+ var handler = handlers[eventType];
+ if (handler) {
+ var event = {};
+ jQuery.extend(event, eventData);
+ event.type = eventType;
+ if (type != 'error') {
+ delete event.status;
+
+ if (event.responseXML) {
+ var xml = getExtensionResponseElement(event.responseXML);
+ var data = getJSONData(xml, "data");
+ var componentData = getJSONData(xml, "componentData");
+
+ event.data = data;
+ event.componentData = componentData || {};
+ }
+ }
+
+ handler.call(source, event);
+ }
+ }
+ }
+ };
+ };
+
+ var setGlobalStatusNameVariable = function(statusName) {
+ //TODO: parallel requests
+ if (statusName) {
+ richfaces['statusName'] = statusName;
+ } else {
+ delete richfaces['statusName'];
+ }
+ }
+
+ richfaces.setZeroRequestDelay = function(options) {
+ if (typeof options.requestDelay == "undefined") {
+ options.requestDelay = 0;
+ }
+ };
+
+ var getGlobalStatusNameVariable = function() {
+ return richfaces.statusName;
+ }
+
+ var chain = function() {
+ var functions = arguments;
+ if (functions.length == 1) {
+ return functions[0];
+ } else {
+ return function() {
+ var callResult;
+ for (var i = 0; i < functions.length; i++) {
+ var f = functions[i];
+ callResult = f.apply(this, arguments);
+ }
+
+ return callResult;
+ };
+ }
+ };
+
+ /**
+ * curry (g, a) (b) -> g(a, b)
+ */
+ var curry = function(g, a) {
+ var _g = g;
+ var _a = a;
+
+ return function(b) {
+ _g(_a, b);
+ };
+ };
+
+ var createEventHandler = function(handlerCode) {
+ if (handlerCode) {
+ return new Function("event", handlerCode);
+ }
+
+ return null;
+ };
+
+ //TODO take events just from .java code using EL-expression
+ var AJAX_EVENTS = (function() {
+ var serverEventHandler = function(clientHandler, event) {
+ var xml = getExtensionResponseElement(event.responseXML);
+
+ var serverHandler = createEventHandler(xml.children(event.type).text());
+ xml.end();
+
+ if (clientHandler) {
+ clientHandler.call(window, event);
+ }
+
+ if (serverHandler) {
+ serverHandler.call(window, event);
+ }
+ };
+
+ return {
+ 'begin': null,
+ 'complete': serverEventHandler,
+ 'beforedomupdate': serverEventHandler
+ }
+ }());
+
+ richfaces.ajax = function(source, event, options) {
+ var sourceId = (typeof source == 'object' && source.id) ? source.id : source;
+
+ options = options || {};
+
+ parameters = options.parameters || {}; // TODO: change "parameters" to "richfaces.ajax.params"
+ parameters.execute = "@component";
+ parameters.render = "@component";
+
+ if (!parameters["org.richfaces.ajax.component"]) {
+ parameters["org.richfaces.ajax.component"] = sourceId;
+ }
+
+ var eventHandlers;
+
+ for (var eventName in AJAX_EVENTS) {
+ var handlerCode = options[eventName];
+ var handler = typeof handlerCode == "function" ? handlerCode : createEventHandler(handlerCode);
+
+ var serverHandler = AJAX_EVENTS[eventName];
+ if (serverHandler) {
+ handler = curry(serverHandler, handler);
+ }
+
+ if (handler) {
+ eventHandlers = eventHandlers || {};
+ eventHandlers[eventName] = handler;
+ }
+ }
+
+ if (options.status) {
+ var namedStatusEventHandler = function() { setGlobalStatusNameVariable(options.status); };
+
+ //TODO add support for options.submit
+ eventHandlers = eventHandlers || {};
+ if (eventHandlers.begin) {
+ eventHandlers.begin = chain(namedStatusEventHandler, eventHandlers.begin);
+ } else {
+ eventHandlers.begin = namedStatusEventHandler;
+ }
+ }
+
+ if (options.incId) {
+ parameters[sourceId] = sourceId;
+ }
+
+ if (eventHandlers) {
+ var eventsAdapter = richfaces.createJSFEventsAdapter(eventHandlers);
+ parameters['onevent'] = eventsAdapter;
+ parameters['onerror'] = eventsAdapter;
+ }
+
+ if (richfaces.queue) {
+ parameters.queueId = options.queueId;
+ }
+
+ jsf.ajax.request(source, event, parameters);
+ };
+
+ var RICHFACES_AJAX_STATUS = "richfaces:ajaxStatus";
+
+ var getStatusDataAttributeName = function(statusName) {
+ return statusName ? (RICHFACES_AJAX_STATUS + "@" + statusName) : RICHFACES_AJAX_STATUS;
+ };
+
+ var statusAjaxEventHandler = function(data, methodName) {
+ if (methodName) {
+ //global status name
+ var statusName = getGlobalStatusNameVariable();
+ var source = data.source;
+
+ var statusApplied = false;
+ var statusDataAttribute = getStatusDataAttributeName(statusName);
+
+ var statusContainers;
+ if (statusName) {
+ statusContainers = [jQuery(document)];
+ } else {
+ statusContainers = [jQuery(source).parents('form'), jQuery(document)];
+ }
+
+ for (var containerIdx = 0; containerIdx < statusContainers.length && !statusApplied;
+ containerIdx++) {
+
+ var statusContainer = statusContainers[containerIdx];
+ var statuses = statusContainer.data(statusDataAttribute);
+ if (statuses) {
+ for (var statusId in statuses) {
+ var status = statuses[statusId];
+ var result = status[methodName].apply(status, arguments);
+ if (result) {
+ statusApplied = true;
+ } else {
+ delete statuses[statusId];
+ }
+ }
+
+ if (!statusApplied) {
+ statusContainer.removeData(statusDataAttribute);
+ }
+ }
+ }
+ }
+ };
+
+ var initializeStatuses = function() {
+ var thisFunction = arguments.callee;
+ if (!thisFunction.initialized) {
+ thisFunction.initialized = true;
+
+ var jsfEventsListener = richfaces.createJSFEventsAdapter({
+ begin: function(event) { statusAjaxEventHandler(event, 'start'); },
+ error: function(event) { statusAjaxEventHandler(event, 'error'); },
+ success: function(event) { statusAjaxEventHandler(event, 'success'); },
+ complete: function() { setGlobalStatusNameVariable(null); }
+ });
+
+ jsf.ajax.addOnEvent(jsfEventsListener);
+ //TODO blocks default alert error handler
+ jsf.ajax.addOnError(jsfEventsListener);
+ }
+ };
+
+ richfaces.status = function(statusId, options) {
+ this.statusId = statusId;
+ this.options = options || {};
+ this.register();
+ };
+
+ jQuery.extend(richfaces.status.prototype, (function() {
+ //TODO - support for parallel requests
+
+ var getElement = function() {
+ var elt = document.getElementById(this.statusId);
+ return elt ? jQuery(elt) : null;
+ };
+
+ var showHide = function(selector) {
+ var element = getElement.call(this);
+ if (element) {
+ var statusElts = element.children();
+ statusElts.each(function() {
+ var t = jQuery(this);
+ t.css('display', t.is(selector) ? '': 'none');
+ });
+
+ return true;
+ }
+
+ return false;
+ };
+
+ return {
+ register: function() {
+ initializeStatuses();
+
+ var statusName = this.options.statusName;
+ var dataStatusAttribute = getStatusDataAttributeName(statusName);
+
+ var container;
+ if (statusName) {
+ container = jQuery(document);
+ } else {
+ container = getElement.call(this).parents('form');
+ if (container.length == 0) {
+ container = jQuery(document);
+ };
+ }
+
+ var statuses = container.data(dataStatusAttribute);
+ if (!statuses) {
+ statuses = {};
+ container.data(dataStatusAttribute, statuses);
+ }
+
+ statuses[this.statusId] = this;
+ },
+
+ start: function() {
+ if (this.options.onstart) {
+ this.options.onstart.apply(this, arguments);
+ }
+
+ return showHide.call(this, '.rich-status-start');
+ },
+
+ stop: function() {
+ if (this.options.onstop) {
+ this.options.onstop.apply(this, arguments);
+ }
+ },
+
+ success: function() {
+ if (this.options.onsuccess) {
+ this.options.onsuccess.apply(this, arguments);
+ }
+ this.stop();
+
+ return showHide.call(this, '.rich-status-stop');
+ },
+
+ error: function() {
+ if (this.options.onerror) {
+ this.options.onerror.apply(this, arguments);
+ }
+ this.stop();
+
+ return showHide.call(this, ':not(.rich-status-error) + .rich-status-stop, .rich-status-error');
+ }
+ };
+ }()));
+
+ var ajaxOnComplete = function (data) {
+ var type = data.type;
+ var responseXML = data.responseXML;
+
+ if (data.type == 'event' && data.status == 'complete' && responseXML) {
+ var partialResponse = jQuery(responseXML).children("partial-response");
+ if (partialResponse && partialResponse.length) {
+ var elements = partialResponse.children('changes').children('update, delete');
+ jQuery.each(elements, function () {
+ richfaces.cleanDom(jQuery(this).attr('id'));
+ });
+ }
+ }
+ };
+ // move this code to somewhere
+ if (typeof jsf != 'undefined') {
+ jsf.ajax.addOnEvent(ajaxOnComplete);
+ }
+ if (window.addEventListener) {
+ window.addEventListener("unload", richfaces.cleanDom, false);
+ } else {
+ window.attachEvent("onunload", richfaces.cleanDom);
+ }
+}(jQuery, RichFaces));
+
Added: branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/validator-length.js
===================================================================
--- branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/validator-length.js (rev 0)
+++ branches/RF-8742/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/validator-length.js 2010-10-22 15:24:57 UTC (rev 19655)
@@ -0,0 +1,13 @@
+RichFaces.csv.addValidator({"length":
+(function(rf) {
+ return function (value, params) {
+ var result = "";
+ if (value.length<params.min) {
+ result = rf.csv.getMessage(params.customMessages, 'LengthValidator.MINIMUM', [params.min,value]);
+ } else if (value.length>params.max){
+ result = rf.csv.getMessage(params.customMessages, 'LengthValidator.MAXIMUM', [params.max,value]);
+ }
+ return result;
+ }
+})(window.RichFaces || (window.RichFaces={}))
+});
\ No newline at end of file
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java 2010-10-22 15:08:12 UTC (rev 19654)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java 2010-10-22 15:24:57 UTC (rev 19655)
@@ -46,6 +46,7 @@
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.ScriptUtils;
import org.jboss.test.faces.htmlunit.HtmlUnitEnvironment;
+import org.jboss.test.faces.jetty.JettyServer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -171,7 +172,10 @@
this.converterException = e;
}
- converterParametersString = ScriptUtils.toScript(attributes);
+ Map<String,Object> map = new HashMap<String, Object>(attributes);
+ map.put("componentId", TEST_COMPONENT_LABEL);
+
+ converterParametersString = ScriptUtils.toScript(map);
}
}
@@ -196,7 +200,7 @@
public void setUp() throws Exception {
testBean = new TestBean();
- environment = new HtmlUnitEnvironment();
+ environment = new HtmlUnitEnvironment(new JettyServer());
environment.getServer().addResource("/test.xhtml", BaseConverterTest.class.getResource("test.xhtml"));
environment.getServer().addResource("/resources/converter.js", converterScriptName);
environment.getServer().addWebListener(new ServletRequestListener() {
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java 2010-10-22 15:08:12 UTC (rev 19654)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java 2010-10-22 15:24:57 UTC (rev 19655)
@@ -38,7 +38,7 @@
@Test
@TestDataHolder({
@TestData(submittedValue = "18-10-2010"),
- @TestData(submittedValue = "17-10-2010"),
+ @TestData(submittedValue = "17-10-2010")
})
public void testSuccess() throws Exception {
setClientConverterClassName("org.rf.DateTimeConverter");
Added: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java (rev 0)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java 2010-10-22 15:24:57 UTC (rev 19655)
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.convert;
+
+import static org.junit.Assert.*;
+
+import javax.faces.convert.NumberConverter;
+
+import org.junit.Test;
+
+/**
+ * @author Pavel Yaschenko
+ *
+ */
+public class NumberConverterTest extends BaseConverterTest {
+
+ public NumberConverterTest() {
+ super("META-INF/resources/org.richfaces/converter-number.js");
+ }
+
+ @Test
+ @TestDataHolder({
+ @TestData(submittedValue = "111")
+ })
+ public void testSuccess() throws Exception {
+ setClientConverterClassName("RichFaces.csv.getConverter('number')");
+ setConverterId(NumberConverter.CONVERTER_ID);
+ //setAttribute("pattern", "dd-MM-yyyy");
+
+ assertConversionOk();
+ }
+
+ @Test
+ @TestDataHolder({
+ @TestData(submittedValue = "aaa", failureMessage = TEST_COMPONENT_LABEL + ": 'aaa' could not be understood as a number.")
+ })
+ public void testFailures() throws Exception {
+ setClientConverterClassName("RichFaces.csv.getConverter('number')");
+ setConverterId(NumberConverter.CONVERTER_ID);
+ //setConversionErrorMessage("");
+ //setAttribute("pattern", "dd-MM-yyyy");
+
+ assertConversionFailure();
+ }
+}
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java 2010-10-22 15:08:12 UTC (rev 19654)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java 2010-10-22 15:24:57 UTC (rev 19655)
@@ -3,6 +3,8 @@
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Map;
import javax.faces.convert.NumberConverter;
@@ -21,7 +23,9 @@
import org.richfaces.validator.ScriptNotFoundException;
import org.richfaces.validator.ValidatorDescriptor;
+import com.google.common.collect.Iterables;
+
@RunWith(MockTestRunner.class)
public class RendererGetClientSideScriptTest extends RendererTestBase {
@@ -53,7 +57,7 @@
expect((Class) descriptor.getValidatorClass()).andReturn(RegexValidator.class);
expect(scriptService.getScript(RegexValidator.class)).andThrow(new ScriptNotFoundException());
controller.replay();
- renderer.getClientSideValidatorScript(behaviorContext, descriptor);
+ renderer.getClientSideValidatorScript(behaviorContext, Collections.singletonList(descriptor));
controller.verify();
}
@@ -77,7 +81,11 @@
expect(script.getName()).andReturn(REGEX_VALIDATOR);
expect(script.getLibrary()).andReturn(ORG_RICHFACES);
expect(script.getResourceName()).andReturn(CLIENT_VALIDATORS_JS);
- LibraryScriptFunction clientSideScript = renderer.getClientSideValidatorScript(behaviorContext, descriptor);
+ Collection<LibraryScriptFunction> clientSideScriptCollection = renderer.getClientSideValidatorScript(behaviorContext, Collections.singletonList(descriptor));
+
+ assertNotNull(clientSideScriptCollection);
+ LibraryScriptFunction clientSideScript = Iterables.getOnlyElement(clientSideScriptCollection);
+
assertEquals(ClientValidatorRenderer.CONVERTED_VALUE_VAR, clientSideScript.getParameters().get(0));
assertEquals(VALIDATOR_MESSAGE, clientSideScript.getParameters().get(1));
assertEquals(VALIDATOR_PARAMS, clientSideScript.getParameters().get(2));
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java 2010-10-22 15:08:12 UTC (rev 19654)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java 2010-10-22 15:24:57 UTC (rev 19655)
@@ -6,6 +6,8 @@
import static org.junit.matchers.JUnitMatchers.*;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Map;
import javax.faces.component.behavior.ClientBehaviorContext;
@@ -234,12 +236,12 @@
}
@Override
- LibraryScriptFunction getClientSideValidatorScript(ClientBehaviorContext behaviorContext,
- ValidatorDescriptor validator) throws ScriptNotFoundException {
- if (validatorsCounter >= validatorFunctions.length) {
- throw new ScriptNotFoundException();
- }
- return validatorFunctions[validatorsCounter++];
+ Collection<LibraryScriptFunction> getClientSideValidatorScript(ClientBehaviorContext behaviorContext,
+ Collection<ValidatorDescriptor> validators) {
+// if (validatorsCounter >= validatorFunctions.length) {
+// throw new ScriptNotFoundException();
+// }
+ return Arrays.asList(validatorFunctions);
}
};
}
Modified: branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml 2010-10-22 15:08:12 UTC (rev 19654)
+++ branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml 2010-10-22 15:24:57 UTC (rev 19655)
@@ -9,6 +9,8 @@
<f:event type="preRenderView" listener="#{testBean.init}"/>
</f:metadata>
<h:head>
+ <h:outputScript name="jquery.js" />
+ <h:outputScript name="richfaces-csv.js" library="org.richfaces"/>
<h:outputScript name="converter.js" />
</h:head>
<h:body>
13 years, 11 months
JBoss Rich Faces SVN: r19654 - sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component.
by richfaces-svn-commits@lists.jboss.org
Author: amarkhel
Date: 2010-10-22 11:08:12 -0400 (Fri, 22 Oct 2010)
New Revision: 19654
Modified:
sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java
Log:
fix def pattern
Modified: sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java
===================================================================
--- sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java 2010-10-22 15:02:07 UTC (rev 19653)
+++ sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java 2010-10-22 15:08:12 UTC (rev 19654)
@@ -72,7 +72,7 @@
public static final String DEFAULT_DATE_PATTERN = "MMM d, YYYY";
- @Attribute(defaultValue="DEFAULT_DATE_PATTERN")
+ @Attribute(defaultValue="MMM d, YYYY")
public abstract String getDatePattern();
@Attribute(defaultValue="getDefaultLocale()")
13 years, 11 months
JBoss Rich Faces SVN: r19653 - in sandbox/trunk/ui/calendar/ui/src/main: java/org/richfaces/renderkit and 1 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: amarkhel
Date: 2010-10-22 11:02:07 -0400 (Fri, 22 Oct 2010)
New Revision: 19653
Modified:
sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java
sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
sandbox/trunk/ui/calendar/ui/src/main/templates/calendar.template.xml
Log:
implement addLocale script encoding, fix options creation for the calendar script building
Modified: sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java
===================================================================
--- sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java 2010-10-22 14:28:02 UTC (rev 19652)
+++ sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/component/AbstractCalendar.java 2010-10-22 15:02:07 UTC (rev 19653)
@@ -36,6 +36,7 @@
import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.component.UIInput;
+import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.DateTimeConverter;
@@ -59,39 +60,106 @@
tag = @Tag(name="calendar")
)
public abstract class AbstractCalendar extends UIInput{
-
+
public static final String COMPONENT_TYPE = "org.richfaces.Calendar";
public static final String COMPONENT_FAMILY = "org.richfaces.Calendar";
- private static final String DEFAULT_TIME_PATTERN = "HH:mm";
+ public static final String SUB_TIME_PATTERN = "\\s*[hHkKma]+[\\W&&\\S]+[hHkKma]+\\s*";
+
+ public static final String TIME_PATTERN = "HH:mm";
+
+ public static final String DEFAULT_DATE_PATTERN = "MMM d, YYYY";
+
-
- @Attribute(defaultValue=DEFAULT_TIME_PATTERN)
+ @Attribute(defaultValue="DEFAULT_DATE_PATTERN")
public abstract String getDatePattern();
- @Attribute
+ @Attribute(defaultValue="getDefaultLocale()")
public abstract Object getLocale();
- @Attribute
+ @Attribute(defaultValue="TimeZone.getDefault()")
public abstract TimeZone getTimeZone();
- @Attribute
- public abstract boolean isDisabled();
+ @Attribute(defaultValue="Integer.MIN_VALUE")
+ public abstract int getFirstWeekDay();
- @Attribute
+ @Attribute(defaultValue="Integer.MIN_VALUE")
+ public abstract int getMinDaysInFirstWeek();
+
+ @Attribute(defaultValue="select")
+ public abstract String getTodayControlMode();
+
+ @Attribute(defaultValue="true")
+ public abstract boolean isShowWeekDaysBar();
+
+ @Attribute(defaultValue="true")
+ public abstract boolean isShowWeeksBar();
+
+ @Attribute(defaultValue="true")
+ public abstract boolean isShowFooter();
+
+ @Attribute(defaultValue="true")
+ public abstract boolean isShowHeader();
+
+ @Attribute(defaultValue="true")
public abstract boolean isShowInput();
- @Attribute
+ @Attribute(defaultValue="true")
public abstract boolean isPopup();
- @Attribute
+ @Attribute(defaultValue="true")
+ public abstract String getHidePopupOnScroll();
+
+ @Attribute(defaultValue="false")
+ public abstract boolean isDisable();
+
+ @Attribute(defaultValue="false")
public abstract boolean isEnableManualInput();
- @Attribute
+ @Attribute(defaultValue="false")
public abstract boolean isDayEnabled();
+ @Attribute(defaultValue="false")
+ public abstract boolean isShowApplyButton();
+
+ @Attribute(defaultValue="false")
+ public abstract boolean isResetTimeOnDateSelect();
+
+ @Attribute(defaultValue="bottom-left")
+ public abstract String getJointPoint();
+
+ @Attribute(defaultValue="bottom-right")
+ public abstract String getDirection();
+
+ @Attribute(defaultValue="inactive")
+ public abstract String getBoundaryDatesMode();
+
+ @Attribute(defaultValue="0")
+ public abstract String getHorizontalOffset();
+
+ @Attribute(defaultValue="0")
+ public abstract String getVerticalOffsetOffset();
+
+ @Attribute(defaultValue="3")
+ public abstract int getZindex();
+
@Attribute
+ public abstract String getStyle();
+
+ @Attribute
+ public abstract Object getMonthLabels();
+
+ @Attribute
+ public abstract Object getMonthLabelsShort();
+
+ @Attribute
+ public abstract Object getWeekDayLabelsShort();
+
+ @Attribute
+ public abstract Object getWeekDayLabels();
+
+ @Attribute
public abstract String getDayStyleClass();
@Attribute
@@ -123,7 +191,7 @@
@Attribute
public abstract Object getDefaultTime();
-
+
@Attribute(events=@EventName("inputclick"))
public abstract String getOninputclick();
@@ -167,7 +235,7 @@
public abstract String getOninputblur();
public Calendar getCalendar() {
- return Calendar.getInstance(getTimeZone(), getAsLocale(getLocale()));
+ return Calendar.getInstance(getTimeZone(), getAsLocale());
}
public Date getCurrentDateOrDefault() {
@@ -198,7 +266,7 @@
} else if(date instanceof String) {
DateTimeConverter converter = new DateTimeConverter();
converter.setPattern(this.getDatePattern());
- converter.setLocale(getAsLocale(this.getLocale()));
+ converter.setLocale(getAsLocale());
converter.setTimeZone(this.getTimeZone());
value = (Date)converter.getAsObject(facesContext, this,(String) date);
@@ -224,8 +292,31 @@
return value;
}
+ public Locale getAsLocale() {
+ Object locale = getLocale();
+ return getAsLocale(locale);
+ }
+ protected Locale getDefaultLocale() {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ if (facesContext != null) {
+ UIViewRoot viewRoot = facesContext.getViewRoot();
+ if (viewRoot != null) {
+ Locale locale = viewRoot.getLocale();
+ if (locale != null) {
+ return locale;
+ }
+ }
+ }
+ return Locale.US;
+ }
+
public Locale getAsLocale(Object locale) {
+
+ if(locale == null) {
+ return null;
+ }
+
Locale localeValue = null;
if (locale instanceof Locale) {
localeValue = (Locale)locale;
@@ -293,11 +384,11 @@
String defaultTimeString = defaultTime.toString();
String datePattern = getDatePattern();
- String timePattern = "\\s*[hHkKma]+[\\W&&\\S]+[hHkKma]+\\s*";
+ String timePattern = TIME_PATTERN;
Pattern pattern = Pattern.compile(timePattern);
Matcher matcher = pattern.matcher(datePattern);
- String subTimePattern = DEFAULT_TIME_PATTERN;
+ String subTimePattern = SUB_TIME_PATTERN;
if(matcher.find()) {
subTimePattern = matcher.group().trim();
}
Modified: sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
===================================================================
--- sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java 2010-10-22 14:28:02 UTC (rev 19652)
+++ sandbox/trunk/ui/calendar/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java 2010-10-22 15:02:07 UTC (rev 19653)
@@ -23,11 +23,15 @@
package org.richfaces.renderkit;
import java.io.IOException;
+import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
import java.util.TimeZone;
import javax.faces.application.ResourceDependencies;
@@ -42,6 +46,9 @@
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.JSReference;
import org.richfaces.component.AbstractCalendar;
+import org.richfaces.component.util.ComponentUtil;
+import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.component.util.MessageUtil;
import org.richfaces.component.util.SelectUtils;
import org.richfaces.component.util.ViewUtil;
@@ -65,6 +72,8 @@
@ResourceDependency(library = "org.richfaces", name = "calendar.ecss") })
public class CalendarRendererBase extends InputRendererBase {
+ public static final String CALENDAR_BUNDLE = "org.richfaces.renderkit.calendar";
+
public static final String OPTION_ENABLE_MANUAL_INPUT = "enableManualInput";
public static final String OPTION_DISABLED = "disabled";
@@ -115,6 +124,19 @@
public static final String OPTION_DEFAULT_TIME = "defaultTime";
+ public static final String MONTH_LABELS_SHORT = "monthLabelsShort";
+
+ public static final String MONTH_LABELS = "monthLabels";
+
+ public static final String WEEK_DAY_LABELS_SHORT = "weekDayLabelsShort";
+
+ public static final String WEEK_DAY_LABELS = "weekDayLabels";
+
+ public static final String FIRST_DAY_WEEK = "firstWeekDay";
+
+ public static final String MIN_DAYS_IN_FIRST_WEEK = "minDaysInFirstWeek";
+
+
protected static final Map<String, ComponentAttribute> CALENDAR_INPUT_HANDLER_ATTRIBUTES = Collections.unmodifiableMap(ComponentAttribute.createMap(
new ComponentAttribute(HtmlConstants.ONCLICK_ATTRIBUTE)
.setEventNames("inputclick")
@@ -275,55 +297,51 @@
}
public Map<String, Object> getLabels(FacesContext facesContext, AbstractCalendar calendar) {
- /*
ResourceBundle bundle1 = null;
ResourceBundle bundle2 = null;
+
+ Object locale = calendar.getAsLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
- String messageBundle = context.getApplication().getMessageBundle();
- Object locale = calendar.getLocale();
+
+ String messageBundle = facesContext.getApplication().getMessageBundle();
if (null != messageBundle) {
bundle1 = ResourceBundle.getBundle(messageBundle, calendar.getAsLocale(locale), loader);
- }
+ }
+
try {
bundle2 = ResourceBundle.getBundle(CALENDAR_BUNDLE, calendar.getAsLocale(locale), loader);
-
} catch (MissingResourceException e) {
//No external bundle was found, ignore this exception.
}
+ ResourceBundle [] bundles = {bundle1, bundle2};
+ String [] test = new String []{};
+ String[] names = {"apply", "today", "clean", "cancel", "ok", "close"};
+ return getCollectedLabels(bundles, names);
+ }
+
+ protected Map<String, Object> getCollectedLabels(ResourceBundle [] bundles , String[] names) {
Map<String, Object> labels = new HashMap<String, Object>();
-
- if (null != bundle1 || null != bundle2) {
- // TODO: make one function call
- String[] names = {"apply", "today", "clean", "cancel", "ok", "close"};
- RendererUtils utils= getUtils();
-
- for (String name : names) {
+ if(bundles != null && names != null) {
+ for (String name: names) {
String label = null;
String bundleKey = "RICH_CALENDAR_" + name.toUpperCase() + "_LABEL";
-
- if (bundle1 != null) {
- try {
- label = bundle1.getString(bundleKey);
- } catch (MissingResourceException mre) {
- // Current key was not found, ignore this exception;
+ for(ResourceBundle bundle: bundles) {
+ if (bundle != null) {
+ try {
+ label = bundle.getString(bundleKey);
+ } catch (MissingResourceException mre) {
+ // Current key was not found, ignore this exception;
+ }
}
- }
-
- // Current key wasn't found in application bundle, use CALENDAR_BUNDLE,
- // if it is not null
- if((label == null) && (bundle2 != null)) {
- try {
- label = bundle2.getString(bundleKey);
- } catch (MissingResourceException mre) {
- // Current key was not found, ignore this exception;
+ if(label != null) {
+ break;
}
}
- utils.addToScriptHash(labels, name, label);
+ getUtils().addToScriptHash(labels, name, label);
}
- }
- return labels; */
- return null;
+ }
+ return labels;
}
public Object getSubmitFunction(FacesContext context, AbstractCalendar calendar) throws IOException {
@@ -380,34 +398,113 @@
return result;
}
+ private static String[] shiftDates(int minimum, int maximum, String[] labels) {
+ if (minimum == 0 && (maximum - minimum == labels.length - 1)) {
+ return labels;
+ }
+
+ String[] shiftedLabels = new String[maximum - minimum + 1];
+ System.arraycopy(labels, minimum, shiftedLabels, 0, maximum - minimum
+ + 1);
+
+ return shiftedLabels;
+ }
+
+ protected Map<String, Object> getLocaleOptions(FacesContext facesContext, AbstractCalendar calendarComponent) {
+ Map<String, Object> map = new HashMap<String, Object>();
+
+ Locale locale = calendarComponent.getAsLocale();
+ DateFormatSymbols dateFormat = new DateFormatSymbols(locale);
+
+ Calendar calendar = calendarComponent.getCalendar();
+ int maximum = calendar.getActualMaximum(Calendar.DAY_OF_WEEK);
+ int minimum = calendar.getActualMinimum(Calendar.DAY_OF_WEEK);
+
+ int monthMax = calendar.getActualMaximum(Calendar.MONTH);
+ int monthMin = calendar.getActualMinimum(Calendar.MONTH);
+
+ String [] weekDayLabels = ComponentUtil.asArray(calendarComponent.getWeekDayLabels());
+ if(weekDayLabels == null) {
+ weekDayLabels = dateFormat.getWeekdays();
+ weekDayLabels = shiftDates(minimum, maximum, weekDayLabels);
+ }
+ getUtils().addToScriptHash(map, WEEK_DAY_LABELS, weekDayLabels);
+
+ String [] weekDayLabelsShort = ComponentUtil.asArray(calendarComponent.getWeekDayLabelsShort());
+ if(weekDayLabelsShort == null) {
+ weekDayLabelsShort = dateFormat.getShortWeekdays();
+ weekDayLabelsShort = shiftDates(minimum, maximum, weekDayLabelsShort);
+ }
+ getUtils().addToScriptHash(map, WEEK_DAY_LABELS_SHORT, weekDayLabelsShort);
+
+ String [] monthLabels = ComponentUtil.asArray(calendarComponent.getMonthLabels());
+ if(monthLabels == null) {
+ monthLabels = dateFormat.getMonths();
+ monthLabels = shiftDates(monthMin, monthMax, monthLabels);
+ }
+ getUtils().addToScriptHash(map, MONTH_LABELS, monthLabels);
+
+
+ String [] monthLabelsShort = ComponentUtil.asArray(calendarComponent.getMonthLabelsShort());
+ if(monthLabelsShort == null) {
+ monthLabelsShort = dateFormat.getShortMonths();
+ monthLabelsShort = shiftDates(monthMin, monthMax, monthLabelsShort);
+ }
+ getUtils().addToScriptHash(map, MONTH_LABELS_SHORT, monthLabelsShort);
+
+ int minDaysInFirstWeek = calendarComponent.getMinDaysInFirstWeek();
+ if(minDaysInFirstWeek == Integer.MIN_VALUE) {
+ minDaysInFirstWeek = calendar.getMinimalDaysInFirstWeek();
+ }
+
+ if (0 <= minDaysInFirstWeek && minDaysInFirstWeek <= 7) {
+ getUtils().addToScriptHash(map, MIN_DAYS_IN_FIRST_WEEK, minDaysInFirstWeek);
+ }
+
+ int day = calendarComponent.getFirstWeekDay();
+ if(day == Integer.MIN_VALUE) {
+ day = calendar.getFirstDayOfWeek();
+ day = calendar.getFirstDayOfWeek() - calendar.getActualMinimum(Calendar.DAY_OF_WEEK);
+ }
+
+ if (0 <= day && day <= 6) {
+ getUtils().addToScriptHash(map, FIRST_DAY_WEEK, day);
+ } else if (day != Integer.MIN_VALUE) {
+ facesContext.getExternalContext().log(day + " value of firstWeekDay attribute is not a legal one for component: " + MessageUtil.getLabel(facesContext, calendarComponent) + ". Default value was applied.");
+ }
+
+ return map;
+ }
+
public ScriptOptions createCalendarScriptOption(FacesContext facesContext, UIComponent component) throws IOException {
AbstractCalendar calendar = (AbstractCalendar)component;
+
+ ScriptOptions scriptOptions = new ScriptOptions(component);
- ScriptOptions scriptOptions = new ScriptOptions(component);
scriptOptions.addOption(OPTION_ENABLE_MANUAL_INPUT);
scriptOptions.addOption("disabled");
scriptOptions.addOption("readonly");
- scriptOptions.addOption("resetTimeOnDateSelect"); //component
- scriptOptions.addOption("showApplyButton"); //component
- scriptOptions.addOption("styleClass"); //component
- scriptOptions.addOption("minDaysInFirstWeek"); //component
- scriptOptions.addOption("popup", true);
- scriptOptions.addOption("showInput", true);
- scriptOptions.addOption("showHeader", true);
- scriptOptions.addOption("showFooter", true);
- scriptOptions.addOption("showWeeksBar", true);
- scriptOptions.addOption("showWeekDaysBar", true);
- scriptOptions.addOption("todayControlMode", "select");
- scriptOptions.addOption("datePattern", "MMM d, YYYY");
- scriptOptions.addOption("jointPoint", "bottom-left");
- scriptOptions.addOption("direction", "bottom-right");
- scriptOptions.addOption("boundaryDatesMode", "inactive");
- scriptOptions.addOption("horizontalOffset", 0);
- scriptOptions.addOption("verticalOffset", 0);
+ scriptOptions.addOption("resetTimeOnDateSelect");
+ scriptOptions.addOption("showApplyButton");
+ scriptOptions.addOption("styleClass");
+ scriptOptions.addOption("popup");
+ scriptOptions.addOption("showInput");
+ scriptOptions.addOption("showHeader");
+ scriptOptions.addOption("showFooter");
+ scriptOptions.addOption("showWeeksBar");
+ scriptOptions.addOption("showWeekDaysBar");
+ scriptOptions.addOption("todayControlMode");
+ scriptOptions.addOption("datePattern");
+ scriptOptions.addOption("jointPoint");
+ scriptOptions.addOption("direction");
+ scriptOptions.addOption("boundaryDatesMode");
+ scriptOptions.addOption("horizontalOffset");
+ scriptOptions.addOption("verticalOffset");
+ scriptOptions.addOption("hidePopupOnScroll");
+
scriptOptions.addOption("currentDate", getCurrentDate(facesContext, calendar));
scriptOptions.addOption("selectedDate", getSelectedDate(facesContext, calendar));
- /*<cdk:scriptOption name="style" value="z-index: #{component.attributes['zindex']}; #{component.attributes['style']}" defaultValue="z-index: 3; "/>*/
- scriptOptions.addOption("style", 0);
+ scriptOptions.addOption("style", HtmlUtil.concatStyles("z-index: " + calendar.getZindex(), calendar.getStyle()));
scriptOptions.addOption("submitFunction", getSubmitFunction(facesContext, calendar));
scriptOptions.addOption("dayCellClass", getDayCellClass(facesContext, calendar));
scriptOptions.addOption("dayStyleClass", getDayStyleClass(facesContext, calendar));
@@ -421,14 +518,20 @@
return scriptOptions;
}
+ public void buildLocaleScript(ResponseWriter writer, FacesContext facesContext, UIComponent component) throws IOException {
+ AbstractCalendar calendar = (AbstractCalendar)component;
+ JSFunction function = new JSFunction("RichFaces.ui.Calendar.addLocale", calendar.getAsLocale(), getLocaleOptions(facesContext, calendar));
+ writer.write(function.toScript());
+ writer.write(";");
+ }
+
public void buildScript(ResponseWriter writer, FacesContext facesContext, UIComponent component) throws IOException {
AbstractCalendar calendar = (AbstractCalendar)component;
ScriptOptions scriptOptions = createCalendarScriptOption(facesContext, calendar);
- //new RichFaces.ui.Calendar(id, locale, options, markups);
- JSFunction function = new JSFunction("new RichFaces.ui.Calendar", calendar.getClientId(facesContext), "", scriptOptions, "");
+ JSFunction function = new JSFunction("new RichFaces.ui.Calendar", calendar.getClientId(facesContext), calendar.getAsLocale(), scriptOptions, "");
StringBuffer scriptBuffer = new StringBuffer();
- scriptBuffer.append(function.toScript()).append(".load()");
+ scriptBuffer.append(function.toScript()).append(".load();");
writer.write(scriptBuffer.toString());
}
@@ -454,7 +557,7 @@
if(converter instanceof DateTimeConverter) {
DateTimeConverter defaultConverter = (DateTimeConverter) converter;
defaultConverter.setPattern(calendar.getDatePattern());
- defaultConverter.setLocale(calendar.getAsLocale(calendar.getLocale()));
+ defaultConverter.setLocale(calendar.getAsLocale());
defaultConverter.setTimeZone(calendar.getTimeZone());
}
Modified: sandbox/trunk/ui/calendar/ui/src/main/templates/calendar.template.xml
===================================================================
--- sandbox/trunk/ui/calendar/ui/src/main/templates/calendar.template.xml 2010-10-22 14:28:02 UTC (rev 19652)
+++ sandbox/trunk/ui/calendar/ui/src/main/templates/calendar.template.xml 2010-10-22 15:02:07 UTC (rev 19653)
@@ -83,9 +83,9 @@
<div style="display: none;" id="#{clientId}"></div>
<script type="text/javascript">
+ <cdk:call expression="buildLocaleScript(responseWriter, facesContext, component);" />
<cdk:call expression="buildScript(responseWriter, facesContext, component);" />
</script>
-
</span>
</cc:implementation>
</cdk:root>
13 years, 11 months
JBoss Rich Faces SVN: r19652 - modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-22 10:28:02 -0400 (Fri, 22 Oct 2010)
New Revision: 19652
Modified:
modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java
Log:
https://jira.jboss.org/browse/RFPL-836
* added test for attribute header
Modified: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java 2010-10-22 14:17:10 UTC (rev 19651)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java 2010-10-22 14:28:02 UTC (rev 19652)
@@ -139,6 +139,19 @@
}
@Test
+ public void testHeader() {
+ selenium.type(pjq("input[type=text][id$=headerInput]"), "new header");
+ selenium.waitForPageToLoad();
+
+ assertEquals(selenium.getText(header), "new header", "Header of the panel did not change.");
+
+ selenium.type(pjq("input[type=text][id$=headerInput]"), "ľščťťžžôúňď ацущьмщфзщйцу");
+ selenium.waitForPageToLoad();
+
+ assertEquals(selenium.getText(header), "ľščťťžžôúňď ацущьмщфзщйцу", "Header of the panel did not change.");
+ }
+
+ @Test
public void testImmediate() {
JQueryLocator input = pjq("input[type=radio][name$=immediateInput][value=true]");
selenium.click(input);
13 years, 11 months
JBoss Rich Faces SVN: r19651 - in modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest: collapsiblePanel and 1 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-22 10:17:10 -0400 (Fri, 22 Oct 2010)
New Revision: 19651
Added:
modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/
modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestFacets.java
modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java
Removed:
modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java
Log:
https://jira.jboss.org/browse/RFPL-836
* TestRichCollapsiblePanel moved to new package
* added 5 new tests for collapsible panel (testing facets)
Deleted: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java 2010-10-22 14:07:22 UTC (rev 19650)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java 2010-10-22 14:17:10 UTC (rev 19651)
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- *******************************************************************************/
-package org.richfaces.tests.metamer.ftest.collapsiblePanel;
-
-import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardHttp;
-import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardNoRequest;
-import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardXhr;
-import static org.jboss.test.selenium.locator.LocatorFactory.jq;
-import static org.jboss.test.selenium.utils.URLUtils.buildUrl;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.assertNotSame;
-
-import java.net.URL;
-
-import javax.faces.event.PhaseId;
-
-import org.jboss.test.selenium.locator.JQueryLocator;
-import org.richfaces.tests.metamer.ftest.AbstractMetamerTest;
-import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
-import org.testng.annotations.Test;
-
-/**
- * Test case for page /faces/components/richCollapsiblePanel/simple.xhtml
- *
- * @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
- * @version $Revision$
- */
-public class TestRichCollapsiblePanel extends AbstractMetamerTest {
-
- private JQueryLocator panel = pjq("div[id$=collapsiblePanel]");
- private JQueryLocator header = pjq("div[id$=collapsiblePanel:header]");
- private JQueryLocator headerExp = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-exp");
- private JQueryLocator headerColps = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-colps");
- private JQueryLocator content = pjq("div[id$=collapsiblePanel:content]");
- private JQueryLocator time = jq("span[id$=requestTime]");
-
- @Override
- public URL getTestUrl() {
- return buildUrl(contextPath, "faces/components/richCollapsiblePanel/simple.xhtml");
- }
-
- @Test
- public void testInit() {
- boolean displayed = selenium.isDisplayed(panel);
- assertTrue(displayed, "Collapsible panel is not present on the page.");
-
- verifyBeforeClick();
- }
-
- @Test
- public void testSwitchTypeNull() {
- // click to collapse
- String timeValue = selenium.getText(time);
- guardXhr(selenium).click(header);
- waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
-
- verifyAfterClick();
-
- // click to expand
- timeValue = selenium.getText(time);
- guardXhr(selenium).click(header);
- waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
-
- verifyBeforeClick();
- }
-
- @Test
- public void testSwitchTypeAjax() {
- JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=ajax]");
- selenium.click(selectOption);
- selenium.waitForPageToLoad();
-
- testSwitchTypeNull();
- }
-
- @Test
- public void testSwitchTypeClient() {
- JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=client]");
- selenium.click(selectOption);
- selenium.waitForPageToLoad();
-
- // click to collapse
- guardNoRequest(selenium).click(header);
- verifyAfterClick();
-
- // click to expand
- guardNoRequest(selenium).click(header);
- verifyBeforeClick();
- }
-
- @Test
- public void testSwitchTypeServer() {
- JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=server]");
- selenium.click(selectOption);
- selenium.waitForPageToLoad();
-
- // click to collapse
- guardHttp(selenium).click(header);
- verifyAfterClick();
-
- // click to expand
- guardHttp(selenium).click(header);
- verifyBeforeClick();
- }
-
- @Test
- public void testBypassUpdates() {
- JQueryLocator input = pjq("input[type=radio][name$=bypassUpdatesInput][value=true]");
- selenium.click(input);
- selenium.waitForPageToLoad();
-
- String timeValue = selenium.getText(time);
- guardXhr(selenium).click(header);
- waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
-
- assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
- PhaseId.RENDER_RESPONSE);
- }
-
- @Test
- public void testImmediate() {
- JQueryLocator input = pjq("input[type=radio][name$=immediateInput][value=true]");
- selenium.click(input);
- selenium.waitForPageToLoad();
-
- String timeValue = selenium.getText(time);
- guardXhr(selenium).click(header);
- waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
-
- assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.RENDER_RESPONSE);
- }
-
- @Test
- @IssueTracking("https://jira.jboss.org/browse/RF-9535")
- public void testLimitToList() {
- JQueryLocator timeLoc = jq("span[id$=requestTime]");
-
- selenium.type(pjq("input[type=text][id$=renderInput]"), "@this");
- selenium.waitForPageToLoad();
-
- selenium.click(pjq("input[type=radio][name$=limitToListInput][value=true]"));
- selenium.waitForPageToLoad();
-
- String timeValue = selenium.getText(timeLoc);
-
- guardXhr(selenium).click(header);
- waitGui.failWith("Panel should be collapsed.").until(isDisplayed.locator(headerColps));
-
- String newTime = selenium.getText(timeLoc);
- assertNotSame(newTime, timeValue, "Panel with ajaxRendered=true should not be rerendered.");
- }
-
- @Test
- public void testRendered() {
- JQueryLocator input = pjq("input[type=radio][name$=renderedInput][value=false]");
- selenium.click(input);
- selenium.waitForPageToLoad();
-
- assertFalse(selenium.isElementPresent(panel), "Panel should not be rendered when rendered=false.");
- }
-
- private void verifyBeforeClick() {
- boolean displayed = selenium.isDisplayed(panel);
- assertTrue(displayed, "Collapsible panel is not present on the page.");
-
- displayed = selenium.isDisplayed(headerExp);
- assertTrue(displayed, "Expanded header should be visible.");
-
- displayed = selenium.isDisplayed(headerColps);
- assertFalse(displayed, "Collapsed header should not be visible.");
-
- displayed = selenium.isDisplayed(content);
- assertTrue(displayed, "Panel's content should be visible.");
-
- String text = selenium.getText(header);
- assertEquals(text, "collapsible panel header", "Header of the panel.");
-
- text = selenium.getText(content);
- assertTrue(text.startsWith("Lorem ipsum"), "Panel doesn't contain Lorem ipsum in its content.");
- }
-
- private void verifyAfterClick() {
- boolean displayed = selenium.isDisplayed(panel);
- assertTrue(displayed, "Collapsible panel is not present on the page.");
-
- displayed = selenium.isDisplayed(headerExp);
- assertFalse(displayed, "Expanded header should not be visible.");
-
- displayed = selenium.isDisplayed(headerColps);
- assertTrue(displayed, "Collapsed header should be visible.");
-
- if (selenium.isElementPresent(content)) {
- displayed = selenium.isDisplayed(content);
- assertFalse(displayed, "Panel's content should not be visible.");
- }
-
- String text = selenium.getText(header);
- assertEquals(text, "collapsible panel header", "Header of the panel.");
- }
-}
Added: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestFacets.java
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestFacets.java (rev 0)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestFacets.java 2010-10-22 14:17:10 UTC (rev 19651)
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *******************************************************************************/
+package org.richfaces.tests.metamer.ftest.richCollapsiblePanel;
+
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardHttp;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardNoRequest;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardXhr;
+import static org.jboss.test.selenium.locator.LocatorFactory.jq;
+import static org.jboss.test.selenium.utils.URLUtils.buildUrl;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNotSame;
+
+import java.net.URL;
+
+import javax.faces.event.PhaseId;
+
+import org.jboss.test.selenium.locator.JQueryLocator;
+import org.richfaces.tests.metamer.ftest.AbstractMetamerTest;
+import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
+import org.testng.annotations.Test;
+
+/**
+ * Test case for page /faces/components/richCollapsiblePanel/facets.xhtml
+ *
+ * @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
+ * @version $Revision$
+ */
+public class TestFacets extends AbstractMetamerTest {
+
+ private JQueryLocator panel = pjq("div[id$=collapsiblePanel]");
+ private JQueryLocator header = pjq("div[id$=collapsiblePanel:header]");
+ private JQueryLocator headerExp = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-exp");
+ private JQueryLocator headerColps = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-colps");
+ private JQueryLocator content = pjq("div[id$=collapsiblePanel:content]");
+ private JQueryLocator time = jq("span[id$=requestTime]");
+
+ @Override
+ public URL getTestUrl() {
+ return buildUrl(contextPath, "faces/components/richCollapsiblePanel/facets.xhtml");
+ }
+
+ @Test
+ public void testInit() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeNull() {
+ // click to collapse
+ String timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ verifyAfterClick();
+
+ // click to expand
+ timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeAjax() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=ajax]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ testSwitchTypeNull();
+ }
+
+ @Test
+ public void testSwitchTypeClient() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=client]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ // click to collapse
+ guardNoRequest(selenium).click(header);
+ verifyAfterClick();
+
+ // click to expand
+ guardNoRequest(selenium).click(header);
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeServer() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=server]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ // click to collapse
+ guardHttp(selenium).click(header);
+ verifyAfterClick();
+
+ // click to expand
+ guardHttp(selenium).click(header);
+ verifyBeforeClick();
+ }
+
+ private void verifyBeforeClick() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ displayed = selenium.isDisplayed(headerExp);
+ assertTrue(displayed, "Expanded header should be visible.");
+
+ displayed = selenium.isDisplayed(headerColps);
+ assertFalse(displayed, "Collapsed header should not be visible.");
+
+ displayed = selenium.isDisplayed(content);
+ assertTrue(displayed, "Panel's content should be visible.");
+
+ String text = selenium.getText(header);
+ assertEquals(text, "header expanded", "Header of the panel.");
+
+ text = selenium.getText(content);
+ assertTrue(text.startsWith("Lorem ipsum"), "Panel doesn't contain Lorem ipsum in its content.");
+ }
+
+ private void verifyAfterClick() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ displayed = selenium.isDisplayed(headerExp);
+ assertFalse(displayed, "Expanded header should not be visible.");
+
+ displayed = selenium.isDisplayed(headerColps);
+ assertTrue(displayed, "Collapsed header should be visible.");
+
+ if (selenium.isElementPresent(content)) {
+ displayed = selenium.isDisplayed(content);
+ assertFalse(displayed, "Panel's content should not be visible.");
+ }
+
+ String text = selenium.getText(header);
+ assertEquals(text, "header collapsed", "Header of the panel.");
+ }
+}
Property changes on: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestFacets.java
___________________________________________________________________
Name: svn:keywords
+ Revision
Copied: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java (from rev 19650, modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java)
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java (rev 0)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richCollapsiblePanel/TestRichCollapsiblePanel.java 2010-10-22 14:17:10 UTC (rev 19651)
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *******************************************************************************/
+package org.richfaces.tests.metamer.ftest.richCollapsiblePanel;
+
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardHttp;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardNoRequest;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardXhr;
+import static org.jboss.test.selenium.locator.LocatorFactory.jq;
+import static org.jboss.test.selenium.utils.URLUtils.buildUrl;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNotSame;
+
+import java.net.URL;
+
+import javax.faces.event.PhaseId;
+
+import org.jboss.test.selenium.locator.JQueryLocator;
+import org.richfaces.tests.metamer.ftest.AbstractMetamerTest;
+import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
+import org.testng.annotations.Test;
+
+/**
+ * Test case for page /faces/components/richCollapsiblePanel/simple.xhtml
+ *
+ * @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
+ * @version $Revision$
+ */
+public class TestRichCollapsiblePanel extends AbstractMetamerTest {
+
+ private JQueryLocator panel = pjq("div[id$=collapsiblePanel]");
+ private JQueryLocator header = pjq("div[id$=collapsiblePanel:header]");
+ private JQueryLocator headerExp = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-exp");
+ private JQueryLocator headerColps = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-colps");
+ private JQueryLocator content = pjq("div[id$=collapsiblePanel:content]");
+ private JQueryLocator time = jq("span[id$=requestTime]");
+
+ @Override
+ public URL getTestUrl() {
+ return buildUrl(contextPath, "faces/components/richCollapsiblePanel/simple.xhtml");
+ }
+
+ @Test
+ public void testInit() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeNull() {
+ // click to collapse
+ String timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ verifyAfterClick();
+
+ // click to expand
+ timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeAjax() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=ajax]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ testSwitchTypeNull();
+ }
+
+ @Test
+ public void testSwitchTypeClient() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=client]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ // click to collapse
+ guardNoRequest(selenium).click(header);
+ verifyAfterClick();
+
+ // click to expand
+ guardNoRequest(selenium).click(header);
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeServer() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=server]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ // click to collapse
+ guardHttp(selenium).click(header);
+ verifyAfterClick();
+
+ // click to expand
+ guardHttp(selenium).click(header);
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testBypassUpdates() {
+ JQueryLocator input = pjq("input[type=radio][name$=bypassUpdatesInput][value=true]");
+ selenium.click(input);
+ selenium.waitForPageToLoad();
+
+ String timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
+ PhaseId.RENDER_RESPONSE);
+ }
+
+ @Test
+ public void testImmediate() {
+ JQueryLocator input = pjq("input[type=radio][name$=immediateInput][value=true]");
+ selenium.click(input);
+ selenium.waitForPageToLoad();
+
+ String timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.RENDER_RESPONSE);
+ }
+
+ @Test
+ @IssueTracking("https://jira.jboss.org/browse/RF-9535")
+ public void testLimitToList() {
+ JQueryLocator timeLoc = jq("span[id$=requestTime]");
+
+ selenium.type(pjq("input[type=text][id$=renderInput]"), "@this");
+ selenium.waitForPageToLoad();
+
+ selenium.click(pjq("input[type=radio][name$=limitToListInput][value=true]"));
+ selenium.waitForPageToLoad();
+
+ String timeValue = selenium.getText(timeLoc);
+
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Panel should be collapsed.").until(isDisplayed.locator(headerColps));
+
+ String newTime = selenium.getText(timeLoc);
+ assertNotSame(newTime, timeValue, "Panel with ajaxRendered=true should not be rerendered.");
+ }
+
+ @Test
+ public void testRendered() {
+ JQueryLocator input = pjq("input[type=radio][name$=renderedInput][value=false]");
+ selenium.click(input);
+ selenium.waitForPageToLoad();
+
+ assertFalse(selenium.isElementPresent(panel), "Panel should not be rendered when rendered=false.");
+ }
+
+ private void verifyBeforeClick() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ displayed = selenium.isDisplayed(headerExp);
+ assertTrue(displayed, "Expanded header should be visible.");
+
+ displayed = selenium.isDisplayed(headerColps);
+ assertFalse(displayed, "Collapsed header should not be visible.");
+
+ displayed = selenium.isDisplayed(content);
+ assertTrue(displayed, "Panel's content should be visible.");
+
+ String text = selenium.getText(header);
+ assertEquals(text, "collapsible panel header", "Header of the panel.");
+
+ text = selenium.getText(content);
+ assertTrue(text.startsWith("Lorem ipsum"), "Panel doesn't contain Lorem ipsum in its content.");
+ }
+
+ private void verifyAfterClick() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ displayed = selenium.isDisplayed(headerExp);
+ assertFalse(displayed, "Expanded header should not be visible.");
+
+ displayed = selenium.isDisplayed(headerColps);
+ assertTrue(displayed, "Collapsed header should be visible.");
+
+ if (selenium.isElementPresent(content)) {
+ displayed = selenium.isDisplayed(content);
+ assertFalse(displayed, "Panel's content should not be visible.");
+ }
+
+ String text = selenium.getText(header);
+ assertEquals(text, "collapsible panel header", "Header of the panel.");
+ }
+}
13 years, 11 months
JBoss Rich Faces SVN: r19650 - in modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest: collapsiblePanel and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-22 10:07:22 -0400 (Fri, 22 Oct 2010)
New Revision: 19650
Added:
modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/
modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java
Log:
https://jira.jboss.org/browse/RFPL-836
* added 9 tests for rich:collapsiblePanel
Added: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java (rev 0)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java 2010-10-22 14:07:22 UTC (rev 19650)
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *******************************************************************************/
+package org.richfaces.tests.metamer.ftest.collapsiblePanel;
+
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardHttp;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardNoRequest;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardXhr;
+import static org.jboss.test.selenium.locator.LocatorFactory.jq;
+import static org.jboss.test.selenium.utils.URLUtils.buildUrl;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNotSame;
+
+import java.net.URL;
+
+import javax.faces.event.PhaseId;
+
+import org.jboss.test.selenium.locator.JQueryLocator;
+import org.richfaces.tests.metamer.ftest.AbstractMetamerTest;
+import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
+import org.testng.annotations.Test;
+
+/**
+ * Test case for page /faces/components/richCollapsiblePanel/simple.xhtml
+ *
+ * @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
+ * @version $Revision$
+ */
+public class TestRichCollapsiblePanel extends AbstractMetamerTest {
+
+ private JQueryLocator panel = pjq("div[id$=collapsiblePanel]");
+ private JQueryLocator header = pjq("div[id$=collapsiblePanel:header]");
+ private JQueryLocator headerExp = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-exp");
+ private JQueryLocator headerColps = pjq("div[id$=collapsiblePanel:header] div.rf-cp-hdr-colps");
+ private JQueryLocator content = pjq("div[id$=collapsiblePanel:content]");
+ private JQueryLocator time = jq("span[id$=requestTime]");
+
+ @Override
+ public URL getTestUrl() {
+ return buildUrl(contextPath, "faces/components/richCollapsiblePanel/simple.xhtml");
+ }
+
+ @Test
+ public void testInit() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeNull() {
+ // click to collapse
+ String timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ verifyAfterClick();
+
+ // click to expand
+ timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeAjax() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=ajax]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ testSwitchTypeNull();
+ }
+
+ @Test
+ public void testSwitchTypeClient() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=client]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ // click to collapse
+ guardNoRequest(selenium).click(header);
+ verifyAfterClick();
+
+ // click to expand
+ guardNoRequest(selenium).click(header);
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testSwitchTypeServer() {
+ JQueryLocator selectOption = pjq("input[name$=switchTypeInput][value=server]");
+ selenium.click(selectOption);
+ selenium.waitForPageToLoad();
+
+ // click to collapse
+ guardHttp(selenium).click(header);
+ verifyAfterClick();
+
+ // click to expand
+ guardHttp(selenium).click(header);
+ verifyBeforeClick();
+ }
+
+ @Test
+ public void testBypassUpdates() {
+ JQueryLocator input = pjq("input[type=radio][name$=bypassUpdatesInput][value=true]");
+ selenium.click(input);
+ selenium.waitForPageToLoad();
+
+ String timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
+ PhaseId.RENDER_RESPONSE);
+ }
+
+ @Test
+ public void testImmediate() {
+ JQueryLocator input = pjq("input[type=radio][name$=immediateInput][value=true]");
+ selenium.click(input);
+ selenium.waitForPageToLoad();
+
+ String timeValue = selenium.getText(time);
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Page was not updated").waitForChange(timeValue, retrieveText.locator(time));
+
+ assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.RENDER_RESPONSE);
+ }
+
+ @Test
+ @IssueTracking("https://jira.jboss.org/browse/RF-9535")
+ public void testLimitToList() {
+ JQueryLocator timeLoc = jq("span[id$=requestTime]");
+
+ selenium.type(pjq("input[type=text][id$=renderInput]"), "@this");
+ selenium.waitForPageToLoad();
+
+ selenium.click(pjq("input[type=radio][name$=limitToListInput][value=true]"));
+ selenium.waitForPageToLoad();
+
+ String timeValue = selenium.getText(timeLoc);
+
+ guardXhr(selenium).click(header);
+ waitGui.failWith("Panel should be collapsed.").until(isDisplayed.locator(headerColps));
+
+ String newTime = selenium.getText(timeLoc);
+ assertNotSame(newTime, timeValue, "Panel with ajaxRendered=true should not be rerendered.");
+ }
+
+ @Test
+ public void testRendered() {
+ JQueryLocator input = pjq("input[type=radio][name$=renderedInput][value=false]");
+ selenium.click(input);
+ selenium.waitForPageToLoad();
+
+ assertFalse(selenium.isElementPresent(panel), "Panel should not be rendered when rendered=false.");
+ }
+
+ private void verifyBeforeClick() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ displayed = selenium.isDisplayed(headerExp);
+ assertTrue(displayed, "Expanded header should be visible.");
+
+ displayed = selenium.isDisplayed(headerColps);
+ assertFalse(displayed, "Collapsed header should not be visible.");
+
+ displayed = selenium.isDisplayed(content);
+ assertTrue(displayed, "Panel's content should be visible.");
+
+ String text = selenium.getText(header);
+ assertEquals(text, "collapsible panel header", "Header of the panel.");
+
+ text = selenium.getText(content);
+ assertTrue(text.startsWith("Lorem ipsum"), "Panel doesn't contain Lorem ipsum in its content.");
+ }
+
+ private void verifyAfterClick() {
+ boolean displayed = selenium.isDisplayed(panel);
+ assertTrue(displayed, "Collapsible panel is not present on the page.");
+
+ displayed = selenium.isDisplayed(headerExp);
+ assertFalse(displayed, "Expanded header should not be visible.");
+
+ displayed = selenium.isDisplayed(headerColps);
+ assertTrue(displayed, "Collapsed header should be visible.");
+
+ if (selenium.isElementPresent(content)) {
+ displayed = selenium.isDisplayed(content);
+ assertFalse(displayed, "Panel's content should not be visible.");
+ }
+
+ String text = selenium.getText(header);
+ assertEquals(text, "collapsible panel header", "Header of the panel.");
+ }
+}
Property changes on: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/collapsiblePanel/TestRichCollapsiblePanel.java
___________________________________________________________________
Name: svn:keywords
+ Revision
13 years, 11 months
JBoss Rich Faces SVN: r19649 - modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-22 09:29:52 -0400 (Fri, 22 Oct 2010)
New Revision: 19649
Modified:
modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java
modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attributes.java
Log:
* class Attributes fixed to find more RichFaces components
* method Attribute.isHidden() fixed
Modified: modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java
===================================================================
--- modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java 2010-10-22 13:24:41 UTC (rev 19648)
+++ modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java 2010-10-22 13:29:52 UTC (rev 19649)
@@ -121,6 +121,9 @@
}
public boolean isHidden() {
+ if (extensions == null) {
+ return false;
+ }
return extensions.getHidden();
}
Modified: modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attributes.java
===================================================================
--- modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attributes.java 2010-10-22 13:24:41 UTC (rev 19648)
+++ modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attributes.java 2010-10-22 13:29:52 UTC (rev 19649)
@@ -600,43 +600,48 @@
private void loadRichFacesComponents() {
richfacesAttributes = new HashMap<Class<?>, List<Attribute>>();
- try {
- ClassLoader cl = UIStatus.class.getClassLoader();
- Enumeration<URL> fileUrls = cl.getResources("META-INF/faces-config.xml");
- URL configFile = null;
+ final String[] files = {"META-INF/faces-config.xml", "META-INF/pn.faces-config.xml"};
- while (fileUrls.hasMoreElements()) {
- URL url = fileUrls.nextElement();
- if (url.getPath().contains("richfaces-components-ui")) {
- configFile = url;
+ for (String file : files) {
+ try {
+ ClassLoader cl = UIStatus.class.getClassLoader();
+ Enumeration<URL> fileUrls = cl.getResources(file);
+ URL configFile = null;
+
+ while (fileUrls.hasMoreElements()) {
+ URL url = fileUrls.nextElement();
+ if (url.getPath().contains("richfaces-components-ui")) {
+ configFile = url;
+ }
}
- }
- JAXBContext context = JAXBContext.newInstance(FacesConfigHolder.class);
- FacesConfigHolder facesConfigHolder = (FacesConfigHolder) context.createUnmarshaller().unmarshal(configFile);
- List<Component> components = facesConfigHolder.getComponents();
+ JAXBContext context = JAXBContext.newInstance(FacesConfigHolder.class);
+ FacesConfigHolder facesConfigHolder = (FacesConfigHolder) context.createUnmarshaller().unmarshal(configFile);
+ List<Component> components = facesConfigHolder.getComponents();
- for (Component c : components) {
- if (c.getAttributes() == null) {
- continue;
- }
+ for (Component c : components) {
+ if (c.getAttributes() == null) {
+ continue;
+ }
- // remove hidden attributes
- Iterator<Attribute> i = c.getAttributes().iterator();
- while (i.hasNext()) {
- Attribute a = i.next();
- if (a.isHidden() || "id".equals(a.getName()) || "binding".equals(a.getName())) {
- i.remove();
+ // remove hidden attributes
+ Iterator<Attribute> i = c.getAttributes().iterator();
+ while (i.hasNext()) {
+ Attribute a = i.next();
+ if (a.isHidden() || "id".equals(a.getName()) || "binding".equals(a.getName())) {
+ i.remove();
+ }
}
+
+ richfacesAttributes.put(c.getComponentClass(), c.getAttributes());
+ logger.info("attributes for component " + c.getComponentClass().getName() + " loaded");
}
- richfacesAttributes.put(c.getComponentClass(), c.getAttributes());
+ } catch (IOException ex) {
+ logger.error("Input/output error.", ex);
+ } catch (JAXBException ex) {
+ logger.error("XML reading error.", ex);
}
-
- } catch (IOException ex) {
- logger.error("Input/output error.", ex);
- } catch (JAXBException ex) {
- logger.error("XML reading error.", ex);
}
}
13 years, 11 months
JBoss Rich Faces SVN: r19648 - in modules/tests/metamer/trunk/application/src/main: webapp/components/richCollapsiblePanel and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-22 09:24:41 -0400 (Fri, 22 Oct 2010)
New Revision: 19648
Modified:
modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichCollapsiblePanelBean.java
modules/tests/metamer/trunk/application/src/main/webapp/components/richCollapsiblePanel/simple.xhtml
Log:
https://jira.jboss.org/browse/RFPL-836
* page for rich:collapsiblePanel fixed
Modified: modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichCollapsiblePanelBean.java
===================================================================
--- modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichCollapsiblePanelBean.java 2010-10-21 21:25:54 UTC (rev 19647)
+++ modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichCollapsiblePanelBean.java 2010-10-22 13:24:41 UTC (rev 19648)
@@ -62,6 +62,7 @@
// TODO has to be tested in another way
attributes.remove("changeExpandListener");
attributes.remove("converter");
+ attributes.remove("itemChangeListener");
// hidden attributes
attributes.remove("changeExpandListeners");
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richCollapsiblePanel/simple.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richCollapsiblePanel/simple.xhtml 2010-10-21 21:25:54 UTC (rev 19647)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richCollapsiblePanel/simple.xhtml 2010-10-22 13:24:41 UTC (rev 19648)
@@ -37,6 +37,9 @@
</ui:define>
<ui:define name="outOfTemplateBefore">
+ <script type="text/javascript">
+ testedComponentId = "#{rich:clientId('collapsiblePanel')}";
+ </script>
</ui:define>
<ui:define name="component">
@@ -53,7 +56,6 @@
headerClass="#{richCollapsiblePanelBean.attributes['headerClass'].value}"
headerControlClass="#{richCollapsiblePanelBean.attributes['headerControlClass'].value}"
immediate="#{richCollapsiblePanelBean.attributes['immediate'].value}"
- itemChangeListener="#{richCollapsiblePanelBean.attributes['itemChangeListener'].value}"
lang="#{richCollapsiblePanelBean.attributes['lang'].value}"
limitToList="#{richCollapsiblePanelBean.attributes['limitToList'].value}"
onbeforedomupdate="#{richCollapsiblePanelBean.attributes['onbeforedomupdate'].value}"
13 years, 11 months
JBoss Rich Faces SVN: r19647 - in branches/RF-7817: push-redesign/src/main/java/org/richfaces/application/push/impl and 3 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2010-10-21 17:25:54 -0400 (Thu, 21 Oct 2010)
New Revision: 19647
Added:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/EventAbortedException.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionPreSubscriptionEvent.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionSubscriptionEvent.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicEvent.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicListener.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionUnsubscriptionEvent.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SubscriptionAbortedException.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicEvent.java
Modified:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Session.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java
branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java
branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java
branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java
Log:
https://jira.jboss.org/browse/RF-7817
- started adding listeners for connections to topics
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/EventAbortedException.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/EventAbortedException.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/EventAbortedException.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class EventAbortedException extends Exception {
+
+ private static final long serialVersionUID = -1546282468438542993L;
+
+ public EventAbortedException() {
+ super();
+ }
+
+ public EventAbortedException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public EventAbortedException(String message) {
+ super(message);
+ }
+
+ public EventAbortedException(Throwable cause) {
+ super(cause);
+ }
+
+}
Modified: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Session.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Session.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Session.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -35,7 +35,7 @@
public String getId();
- public void subscribe(TopicKey topic) throws Exception;
+ public void subscribe(TopicKey topic) throws Exception, SubscriptionAbortedException;
public void connect(Request request) throws Exception;
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionPreSubscriptionEvent.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionPreSubscriptionEvent.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionPreSubscriptionEvent.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class SessionPreSubscriptionEvent extends SessionTopicEvent {
+
+ private static final long serialVersionUID = 2741390800212036457L;
+
+ public SessionPreSubscriptionEvent(Topic topic, Session session) {
+ super(topic, session);
+ }
+
+ @Override
+ public void invokeListener(TopicListener listener) throws EventAbortedException {
+ ((SessionTopicListener) listener).processPreSubscriptionEvent(this);
+ }
+}
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionSubscriptionEvent.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionSubscriptionEvent.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionSubscriptionEvent.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class SessionSubscriptionEvent extends SessionTopicEvent {
+
+ private static final long serialVersionUID = -463481692840464586L;
+
+ public SessionSubscriptionEvent(Topic topic, Session session) {
+ super(topic, session);
+ }
+
+ @Override
+ public void invokeListener(TopicListener listener) throws EventAbortedException {
+ ((SessionTopicListener) listener).processSubscriptionEvent(this);
+ }
+}
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicEvent.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicEvent.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicEvent.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public abstract class SessionTopicEvent extends TopicEvent {
+
+ private static final long serialVersionUID = 6339351737472180503L;
+
+ private Session session;
+
+ public SessionTopicEvent(Topic topic, Session session) {
+ super(topic);
+ this.session = session;
+ }
+
+ public Session getSession() {
+ return session;
+ }
+
+ @Override
+ public boolean isAppropriateListener(TopicListener listener) {
+ return (listener instanceof SessionTopicListener);
+ }
+}
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicListener.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicListener.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionTopicListener.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface SessionTopicListener extends TopicListener {
+
+ public void processPreSubscriptionEvent(SessionPreSubscriptionEvent event) throws EventAbortedException;
+
+ public void processSubscriptionEvent(SessionSubscriptionEvent event) throws EventAbortedException;
+
+ public void processUnsubscriptionEvent(SessionUnsubscriptionEvent event) throws EventAbortedException;
+
+}
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionUnsubscriptionEvent.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionUnsubscriptionEvent.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionUnsubscriptionEvent.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class SessionUnsubscriptionEvent extends SessionTopicEvent {
+
+ private static final long serialVersionUID = -2286664647234464678L;
+
+ public SessionUnsubscriptionEvent(Topic topic, Session session) {
+ super(topic, session);
+ }
+
+ @Override
+ public void invokeListener(TopicListener listener) throws EventAbortedException {
+ ((SessionTopicListener) listener).processUnsubscriptionEvent(this);
+ }
+}
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SubscriptionAbortedException.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SubscriptionAbortedException.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SubscriptionAbortedException.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class SubscriptionAbortedException extends Exception {
+
+ private static final long serialVersionUID = -2070837902276133333L;
+
+ public SubscriptionAbortedException() {
+ super();
+ }
+
+ public SubscriptionAbortedException(String message) {
+ super(message);
+ }
+
+}
Modified: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -22,6 +22,7 @@
package org.richfaces.application.push;
+
/**
* @author Nick Belaevski
*
@@ -38,10 +39,8 @@
public void removeTopicListener(TopicListener topicListener);
- public void notifySubscription(Session session, TopicKey topicKey) throws AbortSubscriptionException;
-
- public void notifyUnsubscription(Session session, TopicKey topicKey);
-
+ public void publishEvent(TopicEvent event) throws EventAbortedException;
+
public void publish(Object messageData) throws MessageException;
}
\ No newline at end of file
Added: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicEvent.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicEvent.java (rev 0)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicEvent.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+import java.util.EventObject;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class TopicEvent extends EventObject {
+
+ private static final long serialVersionUID = 1986841627148973279L;
+
+ public TopicEvent(Topic topic) {
+ super(topic);
+ }
+
+ public Topic getTopic() {
+ return (Topic) source;
+ }
+
+ public boolean isAppropriateListener(TopicListener listener) {
+ return false;
+ }
+
+ public void invokeListener(TopicListener listener) throws EventAbortedException {
+ throw new IllegalArgumentException(listener.getClass().getName());
+ }
+}
Modified: branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java
===================================================================
--- branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -21,14 +21,12 @@
*/
package org.richfaces.application.push;
+import java.util.EventListener;
+
/**
* @author Nick Belaevski
*
*/
-public interface TopicListener {
+public interface TopicListener extends EventListener {
- public void onSessionSubscribed(Session session, TopicKey topicKey) throws AbortSubscriptionException;
-
- public void onSessionUnsubscribed(Session session, TopicKey topicKey);
-
}
Modified: branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java
===================================================================
--- branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -21,15 +21,15 @@
*/
package org.richfaces.application.push.impl;
+import java.text.MessageFormat;
import java.util.List;
-import java.util.ListIterator;
import java.util.concurrent.CopyOnWriteArrayList;
-import org.richfaces.application.push.AbortSubscriptionException;
+import org.richfaces.application.push.EventAbortedException;
import org.richfaces.application.push.MessageDataSerializer;
import org.richfaces.application.push.MessageException;
-import org.richfaces.application.push.Session;
import org.richfaces.application.push.Topic;
+import org.richfaces.application.push.TopicEvent;
import org.richfaces.application.push.TopicKey;
import org.richfaces.application.push.TopicListener;
import org.richfaces.log.Logger;
@@ -78,39 +78,20 @@
listeners.remove(topicListener);
}
-
- public void notifySubscription(Session session, TopicKey topicKey) throws AbortSubscriptionException {
- ListIterator<TopicListener> itr = listeners.listIterator();
- while (itr.hasNext()) {
- TopicListener listener = itr.next();
- try {
- listener.onSessionSubscribed(session, topicKey);
- } catch (AbortSubscriptionException e) {
- while (itr.hasPrevious()) {
- try {
- itr.previous().onSessionUnsubscribed(session, topicKey);
- } catch (Exception e1) {
- LOGGER.error(e1.getMessage(), e1);
- }
+ public void publishEvent(TopicEvent event) throws EventAbortedException {
+ for (TopicListener listener: listeners) {
+ if (event.isAppropriateListener(listener)) {
+ try {
+ event.invokeListener(listener);
+ } catch (EventAbortedException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error(MessageFormat.format("Exception invoking listener: {0}", e.getMessage()), e);
}
-
- throw e;
- } catch (Exception e) {
- LOGGER.error(e.getMessage(), e);
}
}
}
-
- public void notifyUnsubscription(Session session, TopicKey topicKey) {
- for (TopicListener listener : listeners) {
- try {
- listener.onSessionUnsubscribed(session, topicKey);
- } catch (Exception e) {
- LOGGER.error(e.getMessage(), e);
- }
- }
- }
-
+
public abstract void publish(Object messageData) throws MessageException;
}
Modified: branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java
===================================================================
--- branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -34,6 +34,7 @@
import org.richfaces.application.push.PushContext;
import org.richfaces.application.push.PushContextFactory;
import org.richfaces.application.push.Session;
+import org.richfaces.application.push.SubscriptionAbortedException;
import org.richfaces.application.push.TopicKey;
import org.richfaces.resource.DynamicResource;
import org.richfaces.resource.UserResource;
@@ -55,6 +56,7 @@
return null;
}
+ //TODO implement "session forget" param
public InputStream getInputStream() throws IOException {
FacesContext facesContext = FacesContext.getCurrentInstance();
PushContextFactory pushContextFactory = ServiceTracker.getService(PushContextFactory.class);
@@ -73,6 +75,9 @@
try {
session.subscribe(topicKey);
+ } catch (SubscriptionAbortedException e) {
+ System.out.println("Aborted: '" + e.getMessage() + "'");
+ // TODO: handle exception
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Modified: branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java
===================================================================
--- branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -33,9 +33,14 @@
import javax.jms.Topic;
import javax.jms.TopicSubscriber;
-import org.richfaces.application.push.AbortSubscriptionException;
+import org.richfaces.application.push.EventAbortedException;
+import org.richfaces.application.push.MessageDataSerializer;
import org.richfaces.application.push.Request;
import org.richfaces.application.push.RequestLifecycleListener;
+import org.richfaces.application.push.SessionPreSubscriptionEvent;
+import org.richfaces.application.push.SessionSubscriptionEvent;
+import org.richfaces.application.push.SessionUnsubscriptionEvent;
+import org.richfaces.application.push.SubscriptionAbortedException;
import org.richfaces.application.push.TopicKey;
import org.richfaces.application.push.TopicsContext;
import org.richfaces.application.push.impl.AbstractSession;
@@ -77,15 +82,22 @@
org.richfaces.application.push.Topic topic = topicsContext.getTopic(topicKey);
try {
- topic.notifySubscription(this, topicKey);
+ SessionPreSubscriptionEvent preSubscriptionEvent = new SessionPreSubscriptionEvent(topic, this);
+ topic.publishEvent(preSubscriptionEvent);
+ } catch (EventAbortedException e) {
+ throw new SubscriptionAbortedException(e.getMessage());
+ }
+
+ session.createDurableSubscriber(messagingContext.lookup(topicKey), getSubscriptionClientId(topicKey));
+ subscribedTopics.add(topicKey);
+
+ try {
+ SessionSubscriptionEvent subscriptionEvent = new SessionSubscriptionEvent(topic, this);
+ topic.publishEvent(subscriptionEvent);
- //TODO send event to check subscription permissions
- session.createDurableSubscriber(messagingContext.lookup(topicKey), getSubscriptionClientId(topicKey));
- subscribedTopics.add(topicKey);
- } catch (AbortSubscriptionException e) {
+ } catch (EventAbortedException e) {
// TODO: handle exception
}
-
} finally {
if (session != null) {
try {
@@ -101,7 +113,12 @@
public void destroy() {
for (TopicKey topicKey : subscribedTopics) {
org.richfaces.application.push.Topic topic = topicsContext.getTopic(topicKey);
- topic.notifyUnsubscription(this, topicKey);
+
+ try {
+ topic.publishEvent(new SessionUnsubscriptionEvent(topic, this));
+ } catch (EventAbortedException e) {
+ // TODO: handle exception
+ }
}
// TODO Auto-generated method stub
@@ -181,13 +198,47 @@
e.printStackTrace();
}
}
+
+ private String serializeMessage(org.richfaces.application.push.Topic topic, Message message) {
+ String serializedMessageData = null;
+ Object messageData = null;
+
+ try {
+ if (message instanceof ObjectMessage) {
+ messageData = ((ObjectMessage) message).getObject();
+ } else if (message instanceof TextMessage) {
+ TextMessage textMessage = (TextMessage) message;
+
+ if (message.getBooleanProperty(TopicImpl.SERIALIZED_DATA_INDICATOR)) {
+ serializedMessageData = textMessage.getText();
+ } else {
+ messageData = textMessage.getText();
+ }
+ }
+ } catch (JMSException e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+
+ if (serializedMessageData != null) {
+ return serializedMessageData;
+ }
+
+ if (messageData != null) {
+ MessageDataSerializer messageDataSerializer = topic.getMessageDataSerializer();
+ try {
+ return messageDataSerializer.serialize(messageData);
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+ }
+
+ return null;
+ }
/* (non-Javadoc)
* @see javax.jms.MessageListener#onMessage(javax.jms.Message)
*/
public void onMessage(Message message) {
- String messageData = null;
-
try {
String topicName = ((Topic) message.getJMSDestination()).getTopicName();
@@ -197,23 +248,13 @@
return;
}
- if (message.getBooleanProperty(TopicImpl.SERIALIZED_DATA_INDICATOR)) {
- messageData = ((TextMessage) message).getText();
- } else if (message instanceof ObjectMessage) {
- ObjectMessage objectMessage = (ObjectMessage) message;
- messageData = topic.getMessageDataSerializer().serialize(objectMessage.getObject());
- } else if (message instanceof TextMessage) {
- TextMessage textMessage = (TextMessage) message;
- messageData = topic.getMessageDataSerializer().serialize(textMessage.getText());
- }
-
-
- if (messageData == null) {
+ String serializedMessageData = serializeMessage(topic, message);
+ if (serializedMessageData == null) {
//TODO log
return;
}
- getRequest().postMessage(new TopicKey(topicName), messageData);
+ getRequest().postMessage(new TopicKey(topicName), serializedMessageData);
message.acknowledge();
} catch (JMSException e) {
Modified: branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java
===================================================================
--- branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -79,4 +79,5 @@
}
}
}
+
}
Modified: branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -27,7 +27,7 @@
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
-import javax.faces.bean.ViewScoped;
+import javax.faces.bean.SessionScoped;
import org.richfaces.application.push.MessageException;
import org.richfaces.application.push.TopicKey;
@@ -40,7 +40,7 @@
*
*/
@ManagedBean
-@ViewScoped
+@SessionScoped
public class ChatBean implements Serializable {
private static final long serialVersionUID = -6377543444437645751L;
Modified: branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java 2010-10-21 21:25:54 UTC (rev 19647)
@@ -23,16 +23,21 @@
import java.text.MessageFormat;
+import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.SystemEvent;
import javax.faces.event.SystemEventListener;
import javax.servlet.http.HttpServletRequest;
+import org.richfaces.application.push.EventAbortedException;
import org.richfaces.application.push.Session;
+import org.richfaces.application.push.SessionPreSubscriptionEvent;
+import org.richfaces.application.push.SessionSubscriptionEvent;
+import org.richfaces.application.push.SessionTopicListener;
+import org.richfaces.application.push.SessionUnsubscriptionEvent;
import org.richfaces.application.push.Topic;
import org.richfaces.application.push.TopicKey;
-import org.richfaces.application.push.TopicListener;
import org.richfaces.application.push.TopicsContext;
import org.richfaces.application.push.impl.DefaultMessageDataSerializer;
@@ -50,21 +55,35 @@
topic.setMessageDataSerializer(DefaultMessageDataSerializer.instance());
- topic.addTopicListener(new TopicListener() {
+ topic.addTopicListener(new SessionTopicListener() {
@Override
- public void onSessionUnsubscribed(Session session, TopicKey topicKey) {
+ public void processUnsubscriptionEvent(SessionUnsubscriptionEvent event) throws EventAbortedException {
+ TopicKey topicKey = event.getTopic().getKey();
+ Session session = event.getSession();
System.out.println(MessageFormat.format("Session {0} disconnected from {1}", session.getId(), topicKey.getTopicName()));
}
@Override
- public void onSessionSubscribed(Session session, TopicKey topicKey) {
+ public void processSubscriptionEvent(SessionSubscriptionEvent event) throws EventAbortedException {
+ TopicKey topicKey = event.getTopic().getKey();
+ Session session = event.getSession();
+
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletRequest hsr = (HttpServletRequest) facesContext.getExternalContext().getRequest();
System.out.println(MessageFormat.format("Session {0} connected to {1} from {2}", session.getId(),
topicKey.getTopicName(), hsr.getRemoteAddr()));
}
+
+ @Override
+ public void processPreSubscriptionEvent(SessionPreSubscriptionEvent event) throws EventAbortedException {
+ ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
+ ChatBean chatBean = (ChatBean) externalContext.getSessionMap().get("chatBean");
+ if (chatBean == null || "badname".equals(chatBean.getUserName())) {
+ throw new EventAbortedException("User name has not passed validation");
+ }
+ }
});
}
Modified: branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml 2010-10-21 17:44:09 UTC (rev 19646)
+++ branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml 2010-10-21 21:25:54 UTC (rev 19647)
@@ -14,6 +14,9 @@
Enter username: <h:inputText value="#{username}" required="true" />
<h:commandLink action="chat" value="Enter chat" />
</h:form>
+ <h:link value="Test with bad user name" outcome="chat">
+ <f:param name="username" value="badname" />
+ </h:link>
</h:body>
</f:view>
</html>
\ No newline at end of file
13 years, 11 months