Author: gvanmatre Date: Thu Jun 1 14:01:43 2006 New Revision: 410950 URL: http://svn.apache.org/viewvc?rev=410950&view=rev Log: Added a fifth rolodex usecase example showing JSF/JSP facelets like namespace support.
Added: struts/shale/trunk/use-cases/src/web/rolodex/jrolodex.html (with props) Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/builder/JsfDefaultBuilder.java struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/HeaderSorterRenderer.java struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Rolodex.java struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/view/Bundle.properties struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml struts/shale/trunk/use-cases/src/web/WEB-INF/clay-symbols-config.xml struts/shale/trunk/use-cases/src/web/WEB-INF/faces-config.xml struts/shale/trunk/use-cases/src/web/usecases.jsp Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/builder/JsfDefaultBuilder.java URL: http://svn.apache.org/viewvc/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/builder/JsfDefaultBuilder.java?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/builder/JsfDefaultBuilder.java (original) +++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/builder/JsfDefaultBuilder.java Thu Jun 1 14:01:43 2006 @@ -72,7 +72,7 @@ } // resolve inheritance and attribute overrides - if (node.getAttributes().containsKey("extends") && !jsfid.equals("converter")) { + if (node.getAttributes().containsKey("extends") || !jsfid.equals("converter")) { realizeComponent(node, targetConverter); } Modified: struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/HeaderSorterRenderer.java URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/HeaderSorterRenderer.java?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/HeaderSorterRenderer.java (original) +++ struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/HeaderSorterRenderer.java Thu Jun 1 14:01:43 2006 @@ -56,6 +56,15 @@ */ private static final String SORTED_COLUMN = "s"; + + /** + * <p>Constant used to create the query parameter that + * identifies the sorted column's next sort direction.</p> + */ + private static final String SORTED_SEQUENCE = "a"; + + + /** * <p>Finds the parent IUData component.</p> */ @@ -114,8 +123,16 @@ wasSelected = value.equals(column.getId()); column.getAttributes().put("defaultSort", value); + + String sortAcending = (String) params.get(SORTED_SEQUENCE); + boolean isSortedAcending = true; + try { + isSortedAcending = Boolean.valueOf(sortAcending).booleanValue(); + } catch (Exception e) { + } + // toggle the sort order flag - column.setSortAscending(!column.isSortAscending()); + column.setSortAscending(isSortedAcending); value = null; } else if (column.wasSelected()) { @@ -171,7 +188,9 @@ StringBuffer url = new StringBuffer(getActionStr(context)); url.append('?').append(getSortedTag(context, data)).append("=").append( - URLEncoder.encode(component.getId(), "UTF-8")); + URLEncoder.encode(component.getId(), "UTF-8")) + .append("&").append(SORTED_SEQUENCE).append("=") + .append(!((HeaderSorter) component).isSortAscending()); writer.startElement("a", component); writer.writeAttribute("href", context.getExternalContext().encodeActionURL(url.toString()), "href"); writer.writeText((String) ((HeaderSorter) component).getValue(), "value"); Modified: struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Rolodex.java URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Rolodex.java?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Rolodex.java (original) +++ struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Rolodex.java Thu Jun 1 14:01:43 2006 @@ -21,11 +21,11 @@ import java.util.List; import javax.faces.context.FacesContext; +import javax.faces.event.ActionEvent; import javax.faces.model.SelectItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.shale.clay.component.Clay; import org.apache.shale.clay.config.beans.AttributeBean; import org.apache.shale.clay.config.beans.ComponentBean; import org.apache.shale.clay.config.beans.ElementBean; @@ -270,8 +270,6 @@ public String changeTab() { if (log.isInfoEnabled()) log.info("changeTab()"); - - FacesContext context = FacesContext.getCurrentInstance(); QueryParam paramObj = (QueryParam) getBean("queryParam"); String tabIndex = paramObj.getTabIndex(); @@ -361,6 +359,7 @@ return contacts; } + /** * <p> * This is an action event fired from clicking on a contact in the data @@ -371,8 +370,6 @@ public String selectContact() { if (log.isInfoEnabled()) log.info("selectContact()"); - - FacesContext context = FacesContext.getCurrentInstance(); // look for the commandLink query parameter QueryParam paramObj = (QueryParam) getBean("queryParam"); Modified: struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/view/Bundle.properties URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/view/Bundle.properties?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/view/Bundle.properties (original) +++ struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/view/Bundle.properties Thu Jun 1 14:01:43 2006 @@ -151,6 +151,8 @@ usecases.rolodex3.title=This example demonstrates using full HTML view templating without custom XML configuration. usecases.rolodex4=Rolodex Example (Full XML View) usecases.rolodex4.title=This example demonstrates using full XML views for maximum reuse. +usecases.rolodex5=Rolodex Example (Full XHTML View with Namespaces) +usecases.rolodex5.title=This example demonstrates using full XHTML views with namespaces. usecases.rolodex.viewsource=View Source usecases.symbols=Symbols usecases.symbols.title=This example demonstrates how symbols are a very powerful reuse feature in Clay. Modified: struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml (original) +++ struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml Thu Jun 1 14:01:43 2006 @@ -494,7 +494,6 @@ <component jsfid="tabs" extends="clay" id="tabs" allowBody="false"> <attributes> <set name="clayJsfid" value="RUNTIME"/> - <set name="managedBeanName" value="rolodex$hrolodex"/> <set name="shapeValidator" value="[EMAIL PROTECTED]"/> </attributes> </component> Modified: struts/shale/trunk/use-cases/src/web/WEB-INF/clay-symbols-config.xml URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/web/WEB-INF/clay-symbols-config.xml?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/use-cases/src/web/WEB-INF/clay-symbols-config.xml (original) +++ struts/shale/trunk/use-cases/src/web/WEB-INF/clay-symbols-config.xml Thu Jun 1 14:01:43 2006 @@ -21,13 +21,6 @@ </symbols> </component> - <!-- base lable color --> - <component jsfid="baseLabel" extends="outputLabel" allowBody="false"> - <attributes> - <set name="style" value="color:blue"/> - </attributes> - </component> - <!-- base error message --> <component jsfid="baseMessage" extends="message" allowBody="false"> <attributes> Modified: struts/shale/trunk/use-cases/src/web/WEB-INF/faces-config.xml URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/web/WEB-INF/faces-config.xml?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/use-cases/src/web/WEB-INF/faces-config.xml (original) +++ struts/shale/trunk/use-cases/src/web/WEB-INF/faces-config.xml Thu Jun 1 14:01:43 2006 @@ -232,6 +232,13 @@ <to-view-id>/rolodex/rolodex.xml</to-view-id> </navigation-case> + <!-- Full XHTML Namespace View --> + <navigation-case> + <from-outcome>rolodex$test5</from-outcome> + <to-view-id>/rolodex/jrolodex.html</to-view-id> + </navigation-case> + + <!-- Full HTML View --> <navigation-case> <from-outcome>rolodex$viewsource</from-outcome> @@ -401,6 +408,47 @@ </navigation-rule> + + <navigation-rule> + <!-- Full XHTML Namespace View --> + <from-view-id>/rolodex/jrolodex.html</from-view-id> + + <navigation-case> + <from-action>#{rolodex$jrolodex.selectContact}</from-action> + <from-outcome>rolodex$test</from-outcome> + <to-view-id>/rolodex/jrolodex.html</to-view-id> + </navigation-case> + <navigation-case> + <from-action>#{rolodex$jrolodex.saveContact}</from-action> + <from-outcome>rolodex$test</from-outcome> + <to-view-id>/rolodex/jrolodex.html</to-view-id> + </navigation-case> + <navigation-case> + <from-action>#{rolodex$jrolodex.deleteContact}</from-action> + <from-outcome>rolodex$test</from-outcome> + <to-view-id>/rolodex/jrolodex.html</to-view-id> + </navigation-case> + <navigation-case> + <from-action>#{rolodex$jrolodex.newContact}</from-action> + <from-outcome>rolodex$test</from-outcome> + <to-view-id>/rolodex/jrolodex.html</to-view-id> + </navigation-case> + <navigation-case> + <from-action>#{rolodex$jrolodex.changeTab}</from-action> + <from-outcome>rolodex$test</from-outcome> + <to-view-id>/rolodex/jrolodex.html</to-view-id> + </navigation-case> + <navigation-case> + <from-action>home</from-action> + <from-outcome>home</from-outcome> + <to-view-id>/usecases.faces</to-view-id> + <redirect/> + </navigation-case> + + </navigation-rule> + + + <navigation-rule> <from-view-id>*</from-view-id> <navigation-case> @@ -671,6 +719,18 @@ View controller for the Extreme HTML view rolodex usecase </description> <managed-bean-name>rolodex$xhrolodex</managed-bean-name> + <managed-bean-class> + org.apache.shale.usecases.rolodex.Rolodex + </managed-bean-class> + <managed-bean-scope>session</managed-bean-scope> + </managed-bean> + + + <managed-bean> + <description> + View controller for the XHTML namespace view rolodex usecase + </description> + <managed-bean-name>rolodex$jrolodex</managed-bean-name> <managed-bean-class> org.apache.shale.usecases.rolodex.Rolodex </managed-bean-class> Added: struts/shale/trunk/use-cases/src/web/rolodex/jrolodex.html URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/web/rolodex/jrolodex.html?rev=410950&view=auto ============================================================================== --- struts/shale/trunk/use-cases/src/web/rolodex/jrolodex.html (added) +++ struts/shale/trunk/use-cases/src/web/rolodex/jrolodex.html Thu Jun 1 14:01:43 2006 @@ -0,0 +1,349 @@ +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:clay="http://struts.apache.org/shale/clay-plugin"> +<head> +<clay:loadBundle basename="org.apache.shale.usecases.view.Bundle" + var="messages" /> +<title>#{messages['usecases.rolodex5']}</title> + +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +<style type="text/css" media="screen"> + +.linkPrev { + text-align: left; + color: black; + font-family: arial; font-size: 8pt +} +.linkNext { + text-align: right; + color: black; + font-family: arial; font-size: 8pt +} +.links { + text-align: center; + color: black; + font-family: arial; font-size: 8pt +} +.caption { + text-align: center; + color: #99CC66; + font-family: arial; font-size: 8pt +} +body { + margin : 10px; + font: Verdana, Helvetica, Arial; + padding: 0px; + background: #fff; +} + +#menu { + border-bottom : 1px solid #ccc; + margin : 0; + padding-bottom : 19px; + padding-left : 10px; +} + +#menu ul, #menu li { + display : inline; + list-style-type : none; + margin : 0; + padding : 0; +} + + +#menu a:link, #menu a:visited { + background : #E8EBF0; + border : 1px solid #ccc; + color : #666; + float : left; + font-size : small; + font-weight : normal; + line-height : 14px; + margin-right : 8px; + padding : 2px 10px 2px 10px; + text-decoration : none; +} + +#menu a:link.active, #menu a:visited.active { + background : #fff; + border-bottom : 1px solid #fff; + color : #000; +} + +#menu a:hover { + color : #f00; +} + +.contacts { + border: 1px solid #fff; +} + +.contactsHeader { + text-align: center; + color: #99CC66; + background: #E5F2D9; +} + +.contactsRow2 { + text-align: left; + color: #99CC66; + background: #D9EEF2; +} + +.contactsRow1 { + text-align: left; + color: #99CC66; + background: #F1F7D4; +} + +body.section-1 #menu li#nav-sel a { + background : #fff; + border-bottom : 1px solid #fff; + color : #000; +} + +li#nav { + background : #red; + border-bottom : 1px solid #000; + color : #000; +} + +#menu ul a:hover { + color : #f00 !important; +} + +#contents { + background : #fff; + border : 1px solid #ccc; + border-top : none; + clear : both; + margin : 0px; + padding : 15px; +} + +input.button { + width: 1.2in; + text-align: center; + color: #99CC66; + font-size: 12px; + font-style: normal; + font-weight: bold +} +</style> +</head> +<body class="section-1"> +<form><h:commandLink action="home" allowBody="true" + immediate="true" value="Back" /><br /> +<br /> +<clay:clay shapeValidator="[EMAIL PROTECTED]" /> +<div id="contents"> +<table border="0"> + <tr> + <td rowspan="3"><h:dataTable + value="[EMAIL PROTECTED]" var="e" rows="5" + first="0" styleClass="contacts" headerClass="contactsHeader" + rowClasses="contactsRow1, contactsRow2"> + <f:facet name="header"> + <clay:webPager /> + </f:facet> + <h:column name="id"> + <f:facet name="header"> + <clay:headerSorter + value="#{messages['rolodex.contactTable.nameColumn.title']}" + sortBy="name" /> + </f:facet> + <h:commandLink value="#{e.name}" + action="[EMAIL PROTECTED]" immediate="true"> + <f:param name="selectedName" value="#{e.encodedName}" /> + </h:commandLink> + </h:column> + </h:dataTable></td> + </tr> + <tr> + <td> + <table border="0"> + <tr> + <td><h:outputLabel for="contactName" + value="#{messages['rolodex.name']}" extends="baseLabel" /></td> + <td><h:inputText id="contactName" + value="[EMAIL PROTECTED]" size="40" + maxlength="50" required="true" /></td> + <td><h:message for="contactName" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel for="contactEmail" + value="#{messages['rolodex.email']}" extends="baseLabel" /></td> + <td><h:inputText id="contactEmail" + value="[EMAIL PROTECTED]" + required="false" size="30" maxlength="50" /></td> + <td><h:message for="contactEmail" extends="baseMessage" /></td> + </tr> + </table> + </td> + <td><h:commandButton + rendered="#{!empty @managed-bean-name.selectedContact}" + value="#{messages['rolodex.button.save']}" + action="[EMAIL PROTECTED]" extends="baseCommand" /><br /> + <h:commandButton + rendered="#{!empty @managed-bean-name.selectedContact}" + value="#{messages['rolodex.button.delete']}" + action="[EMAIL PROTECTED]" extends="baseCommand" /><br /> + <h:commandButton value="#{messages['rolodex.button.new']}" + action="[EMAIL PROTECTED]" immediate="true" + extends="baseCommand" /><br /> + </td> + </tr> + <tr> + <td> + <table border="0"> + <tr class="contactsHeader"> + <td colspan="3"><h:outputText + value="#{messages['rolodex.address.residentialAddress']}" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.street1']}" + for="residentialStreet1" extends="baseLabel" /></td> + <td><h:inputText id="residentialStreet1" + value="[EMAIL PROTECTED]" + required="false" size="35" maxlength="50" /></td> + <td><h:message for="residentialStreet1" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.street2']}" + for="residentialStreet2" extends="baseLabel" /></td> + <td><h:inputText id="residentialStreet2" + value="[EMAIL PROTECTED]" + required="false" size="35" maxlength="50" /></td> + <td><h:message for="residentialStreet2" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.city']}" + for="residentialCity" extends="baseLabel" /></td> + <td><h:inputText id="residentialCity" + value="[EMAIL PROTECTED]" + required="true" size="20" maxlength="30" /></td> + <td><h:message for="residentialCity" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.state']}" + for="residentialState" extends="baseLabel" /></td> + <td><h:selectOneMenu id="residentialState" + value="[EMAIL PROTECTED]" + required="true"> + <f:selectItems value="#{rolodexDao.states}" /> + </h:selectOneMenu></td> + <td><h:message for="residentialState" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.zip']}" + for="residentialZip" extends="baseLabel" /></td> + <td><h:inputText id="residentialZip" + value="[EMAIL PROTECTED]" + size="5" maxlength="9"> + <f:convertInteger /> + </h:inputText></td> + <td><h:message for="residentialZip" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.phone']}" + for="contactResidentialPhone" extends="baseLabel" /></td> + <td><h:inputText id="contactResidentialPhone" + value="[EMAIL PROTECTED]" + size="20" maxlength="50" /></td> + <td><h:message for="contactResidentialPhone" extends="baseMessage" /></td> + </tr> + <tr> + <td colspan="2"> </td> + </tr> + <tr> + <td colspan="2"> </td> + </tr> + </table> + </td> + <td> + <table border="0"> + <tr class="contactsHeader"> + <td colspan="3"><h:outputText + value="#{messages['rolodex.address.businessAddress']}" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.street1']}" + for="businessStreet1" extends="baseLabel" /></td> + <td><h:inputText id="businessStreet1" + value="[EMAIL PROTECTED]" + required="false" size="35" maxlength="50" /></td> + <td><h:message for="businessStreet1" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.street2']}" + for="businessStreet2" extends="baseLabel" /></td> + <td><h:inputText id="businessStreet2" + value="[EMAIL PROTECTED]" + required="false" size="35" maxlength="50" /></td> + <td><h:message for="businessStreet2" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.city']}" + for="businessCity" extends="baseLabel" /></td> + <td><h:inputText id="businessCity" + value="[EMAIL PROTECTED]" + required="true" size="20" maxlength="30" /></td> + <td><h:message for="businessCity" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.state']}" + for="businessState" extends="baseLabel" /></td> + <td><h:selectOneMenu id="businessState" + value="[EMAIL PROTECTED]" + required="true"> + <f:selectItems value="#{rolodexDao.states}" /> + </h:selectOneMenu></td> + <td><h:message for="businessState" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.province']}" + for="businessProvince" extends="baseLabel" /></td> + <td><h:inputText id="businessProvince" + value="[EMAIL PROTECTED]" + required="false" size="20" maxlength="30" /></td> + <td><h:message for="businessProvince" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.zip']}" + for="businessZip" extends="baseLabel" /></td> + <td><h:inputText id="businessZip" + value="[EMAIL PROTECTED]" + size="5" maxlength="9"> + <f:convertInteger /> + </h:inputText></td> + <td><h:message for="businessZip" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.country']}" + for="businessCountry" extends="baseLabel" /></td> + <td><h:selectOneMenu id="businessCountry" + value="[EMAIL PROTECTED]" + required="true"> + <f:selectItems value="#{rolodexDao.countries}" /> + </h:selectOneMenu></td> + <td><h:message for="businessCountry" extends="baseMessage" /></td> + </tr> + <tr> + <td><h:outputLabel value="#{messages['rolodex.address.phone']}" + for="contactBusinessPhone" extends="baseLabel" /></td> + <td><h:inputText id="contactBusinessPhone" + value="[EMAIL PROTECTED]" + required="false" size="20" maxlength="50" /></td> + <td><h:message for="contactBusinessPhone" extends="baseMessage" /></td> + </tr> + </table> + </td> + </tr> + <tr> + </tr> +</table> +</div> +</form> +</body> +</html> Propchange: struts/shale/trunk/use-cases/src/web/rolodex/jrolodex.html ------------------------------------------------------------------------------ svn:eol-style = native Modified: struts/shale/trunk/use-cases/src/web/usecases.jsp URL: http://svn.apache.org/viewvc/struts/shale/trunk/use-cases/src/web/usecases.jsp?rev=410950&r1=410949&r2=410950&view=diff ============================================================================== --- struts/shale/trunk/use-cases/src/web/usecases.jsp (original) +++ struts/shale/trunk/use-cases/src/web/usecases.jsp Thu Jun 1 14:01:43 2006 @@ -242,6 +242,15 @@ <h:outputText value="#{messages['usecases.rolodex.viewsource']}"/> </h:commandLink> + <h:commandLink id="rolodex5" + action="rolodex$test5" title="#{messages['usecases.rolodex5.title']}"> + <h:outputText value="#{messages['usecases.rolodex5']}"/> + </h:commandLink> + <h:commandLink action="rolodex$viewsource" title="#{messages['usecases.rolodex5.title']}"> + <f:param name="url" value="/rolodex/jrolodex.html"/> + <h:outputText value="#{messages['usecases.rolodex.viewsource']}"/> + </h:commandLink> + </h:panelGrid>