You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by cr...@apache.org on 2005/07/10 06:55:24 UTC

svn commit: r209993 - in /struts/shale/trunk/use-cases/src: java/org/apache/shale/usecases/rolodex/ test/org/apache/shale/usecases/rolodex/ web/WEB-INF/ web/rolodex/

Author: craigmcc
Date: Sat Jul  9 21:55:23 2005
New Revision: 209993

URL: http://svn.apache.org/viewcvs?rev=209993&view=rev
Log:
Commit updates to the Rolodex example for Clay, so that it now illustrates
all of the possible mechanisms.

PR:  Bugzilla #35639
Submitted by: Gary VanMatre <gvanmatre AT comcast.net>

Added:
    struts/shale/trunk/use-cases/src/test/org/apache/shale/usecases/rolodex/
    struts/shale/trunk/use-cases/src/test/org/apache/shale/usecases/rolodex/RolodexTestCase.java
    struts/shale/trunk/use-cases/src/web/rolodex/address.html
Modified:
    struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Address.java
    struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Contact.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/rolodex/RolodexDao.java
    struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml
    struts/shale/trunk/use-cases/src/web/rolodex/rolodex.jsp

Modified: struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Address.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Address.java?rev=209993&r1=209992&r2=209993&view=diff
==============================================================================
--- struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Address.java (original)
+++ struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Address.java Sat Jul  9 21:55:23 2005
@@ -131,8 +131,6 @@
      * <p>
      * Gets the Zip Code.
      * </p>
-     * 
-     * @return
      */
     public int getZip() {
         return zip;
@@ -145,6 +143,27 @@
      */
     public void setZip(int zip) {
         this.zip = zip;
+    }
+
+    
+    /**
+     * <p>
+     * Gets the Zip Code.
+     * </p>
+     */
+    public String getZipAsString() {
+        return String.valueOf(zip);
+    }
+
+    /**
+     * <p>
+     * Sets the Zip Code.
+     * </p>
+     */
+    public void setZipAsString(String zip) {
+        try {
+            this.zip = Integer.parseInt(zip);
+        } catch (NumberFormatException e) {}
     }
 
 }

Modified: struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Contact.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Contact.java?rev=209993&r1=209992&r2=209993&view=diff
==============================================================================
--- struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Contact.java (original)
+++ struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Contact.java Sat Jul  9 21:55:23 2005
@@ -1,5 +1,8 @@
 package org.apache.shale.usecases.rolodex;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
 /**
  * <p>
  * Represents an entity in the rolodex.
@@ -143,7 +146,6 @@
 
     /**
      * <p>Returns the <code>name</code> in upper case.</p>
-     * @return
      */
     public String getSortName() {
        if (name != null)
@@ -151,5 +153,20 @@
        
        return null;
     }
+    
+    /**
+     * <p>Returns the <code>name</code> encoded.</p>
+     */
+    public String getEncodedName() {
+        String encName = null;
+
+        if (name != null) {
+          try {
+            encName =  URLEncoder.encode(name, "UTF-8");
+          } catch (UnsupportedEncodingException e) {}          
+       }
+       return encName;
+    }
+    
     
 }

Modified: struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Rolodex.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/Rolodex.java?rev=209993&r1=209992&r2=209993&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 Sat Jul  9 21:55:23 2005
@@ -1,5 +1,7 @@
 package org.apache.shale.usecases.rolodex;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
 import java.util.List;
 import java.util.Map;
 
@@ -12,7 +14,6 @@
 import org.apache.shale.clay.config.beans.AttributeBean;
 import org.apache.shale.clay.config.beans.ComponentBean;
 import org.apache.shale.clay.config.beans.ElementBean;
-import org.apache.shale.clay.parser.builder.Builder;
 import org.apache.shale.usecases.view.BaseViewController;
 
 /**
@@ -349,6 +350,11 @@
             // find the dao cached in application scope
             RolodexDao dao = (RolodexDao) getBean("rolodexDao");
 
+            //decode value 
+            try {
+                name = URLDecoder.decode(name, "UTF-8");
+            } catch (UnsupportedEncodingException e) {}
+            
             // finds the selected contact by name
             setSelectedContact(dao.findContact(name));
         }

Modified: struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/RolodexDao.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/RolodexDao.java?rev=209993&r1=209992&r2=209993&view=diff
==============================================================================
--- struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/RolodexDao.java (original)
+++ struts/shale/trunk/use-cases/src/java/org/apache/shale/usecases/rolodex/RolodexDao.java Sat Jul  9 21:55:23 2005
@@ -175,7 +175,16 @@
 
         Object config = new Object() {
             public void addState(State state) {
-                SelectItem item = new SelectItem();
+                SelectItem item = null;
+                // add a blank option
+                if (stateDataStore.size() == 0) {
+                    item = new SelectItem();
+                    item.setLabel("");
+                    item.setValue("");
+                    stateDataStore.add(item);
+                }
+                
+                item = new SelectItem();
                 item.setLabel(state.getState());
                 item.setValue(state.getAbbrState());
                 stateDataStore.add(item);
@@ -213,8 +222,8 @@
                 "setCity", 0);
         digester.addCallMethod("dex/contacts/contact/residentialAddress/state",
                 "setState", 0);
-        //digester.addCallMethod("dex/contacts/contact/residentialAddress/zip",
-        //        "setZip", 0);
+        digester.addCallMethod("dex/contacts/contact/residentialAddress/zip",
+                "setZipAsString", 0);
         digester.addCallMethod(
                 "dex/contacts/contact/residentialAddress/province",
                 "setProvince", 0);
@@ -235,8 +244,8 @@
                 "setCity", 0);
         digester.addCallMethod("dex/contacts/contact/businessAddress/state",
                 "setState", 0);
-        //digester.addCallMethod("dex/contacts/contact/businessAddress/zip",
-        //        "setZip", 0);
+        digester.addCallMethod("dex/contacts/contact/businessAddress/zip",
+                "setZipAsString", 0);
         digester.addCallMethod("dex/contacts/contact/businessAddress/province",
                 "setProvince", 0);
         digester.addCallMethod("dex/contacts/contact/businessAddress/country",

Added: struts/shale/trunk/use-cases/src/test/org/apache/shale/usecases/rolodex/RolodexTestCase.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/test/org/apache/shale/usecases/rolodex/RolodexTestCase.java?rev=209993&view=auto
==============================================================================
--- struts/shale/trunk/use-cases/src/test/org/apache/shale/usecases/rolodex/RolodexTestCase.java (added)
+++ struts/shale/trunk/use-cases/src/test/org/apache/shale/usecases/rolodex/RolodexTestCase.java Sat Jul  9 21:55:23 2005
@@ -0,0 +1,252 @@
+package org.apache.shale.usecases.rolodex;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import javax.faces.el.ValueBinding;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.shale.clay.component.Clay;
+import org.apache.shale.clay.config.beans.ComponentBean;
+import org.apache.shale.test.base.AbstractViewControllerTestCase;
+import org.apache.shale.test.mock.MockExternalContext;
+
+public class RolodexTestCase extends AbstractViewControllerTestCase {
+
+    // Construct a new instance of this test case.
+    public RolodexTestCase(String name) {
+        super(name);
+    }
+
+    // Return the tests included in this test case.
+    public static Test suite() {
+
+        return (new TestSuite(RolodexTestCase.class));
+
+    }
+
+    private Rolodex viewController = null;
+
+    // setup the test case
+    public void setUp() {
+        super.setUp();
+
+        // add some more mock support
+        externalContext = new MockExternalContext(servletContext, request,
+                response) {
+            public Map getRequestParameterMap() {
+                Map targetMap = new TreeMap();
+                Map params = request.getParameterMap();
+                Iterator pi = params.entrySet().iterator();
+                while (pi.hasNext()) {
+                    Map.Entry e = (Map.Entry) pi.next();
+                    // holds multiple params with the same name
+                    String[] values = (String[]) e.getValue();
+                    // Simulates clearing the HTTP request. This test
+                    // will only require single parameters but I don't
+                    // want to create a new request each itteration
+                    targetMap.put(e.getKey(), values[values.length - 1]);
+                }
+
+                return targetMap;
+            }
+
+        };
+        // hookup an new reference
+        facesContext.setExternalContext(externalContext);
+
+        // create the target view controller to test
+        viewController = new Rolodex();
+
+        // simulate a managed bean
+        ValueBinding vb = application.createValueBinding("rolodex");
+        vb.setValue(facesContext, viewController);
+
+        // simulate a managed bean
+        vb = application.createValueBinding("rolodexDao");
+        vb.setValue(facesContext, new RolodexDao());
+
+    }
+
+    // tear down test case
+    public void tearDown() {
+        super.tearDown();
+
+        viewController = null;
+    }
+
+    // test the runtime method from creating a clay subtree
+    public void testCreateTabs() {
+
+        // simulate a method binding event being invoked from the
+        // "shapeValidator" event fired on the Clay component
+        //
+        // <clay:clay id="tabs" jsfid="RUNTIME"
+        // shapeValidator="#{rolodex.createTabs}" managedBeanName="rolodex" />
+
+        // create a fake clay root display element bean
+        ComponentBean displayElementRoot = new ComponentBean();
+
+        // create a mock component for the validator style/signature
+        // of method binding
+        Clay component = new Clay();
+        component.setId("RUNTIME");
+        component.setManagedBeanName("rolodex");
+        component.setShapeValidator("#{rolodex.createTabs}");
+
+        // make the last tab active
+        viewController.setSelectedTab(RolodexDao.TAB_INDEX.length - 1);
+
+        // simulate the the "shapeValidator" event is fired from the
+        // beginEncode method of the Clay component on the view controller.
+        viewController.createTabs(facesContext, component, displayElementRoot);
+
+        // Check the number of children. Each tab has 6 nodes multiplied times
+        // the
+        // number of tabs plus two for the unordered list tags.
+        int n = (RolodexDao.TAB_INDEX.length * 6) + 2;
+
+        assertEquals("#Children", n, displayElementRoot.getChildren().size());
+
+    }
+
+    // simulate clicking a tab
+    public void testChangeTab() {
+
+        for (int t = 0; t < RolodexDao.TAB_INDEX.length; t++) {
+
+            // tab links add a param of the tab index
+            request.addParameter("tabIndex", String.valueOf(t));
+
+            // add a dummy contact
+            viewController.setSelectedContact(new Contact());
+
+            // simulate a action method binding event fired from a commandLink
+            // component
+            String forward = viewController.changeTab();
+            assertEquals("forward", "rolodex$test", forward);
+
+            // selected contact should be null after changing tabs
+            assertNull("selectedContact", viewController.getSelectedContact());
+
+            // make sure the tab is selected
+            assertEquals("selectedTab", t, viewController.getSelectedTab());
+
+        }
+
+    }
+
+    // test populating contacts for each tab index
+    public void testContactsForTab() {
+
+        // number of contacts per page
+        int[] knownGoodState = { 4, 1, 0, 0, 0, 0, 0, 0, 0 };
+
+        for (int i = 0; i < RolodexDao.TAB_INDEX.length; i++) {
+            viewController.setSelectedTab(i);
+            List contacts = viewController.getContactsForTab();
+            assertEquals("contacts on page", contacts.size(), knownGoodState[i]);
+        }
+
+    }
+
+    // simulates selecting a contact for edit on the page
+    public void testSelectContact() {
+        // force selection of the first tab
+        viewController.setSelectedTab(0);
+        // return the contacts on the first page
+        List contacts = viewController.getContactsForTab();
+
+        Iterator ci = contacts.iterator();
+        while (ci.hasNext()) {
+            Contact contact = (Contact) ci.next();
+            String nameParam = null;
+            // simulate encoded commandLink parameter
+            try {
+                nameParam = URLEncoder.encode(contact.getName(), "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+            }
+            // clear out the selected contact
+            viewController.setSelectedContact(null);
+
+            request.addParameter("selectedName", nameParam);
+
+            // invoke the method on the view controller as if it was fired
+            // via an action method binding event on the name collumn in the
+            // data table
+            String forward = viewController.selectContact();
+            assertEquals("forward", "rolodex$test", forward);
+
+            // make sure something was selected
+            assertNotNull("selectedContact", viewController
+                    .getSelectedContact());
+
+            // compare the source name with the target name
+            assertEquals("contact.name", contact.getName(), viewController
+                    .getSelectedContact().getName());
+
+        }
+    }
+
+    // simulates an new/add/delete operation
+    public void testNewAddDelete() {
+
+        // initializes a new contact for binding with the form
+        viewController.setSelectedContact(null);
+        viewController.newContact();
+        assertNotNull("newContact", viewController.getSelectedContact());
+
+        // name is the only PK
+        viewController.getSelectedContact().setName("VanMatre, Gary M.");
+        viewController.saveContact();
+
+        // should be on the last tab after the save
+        assertTrue(
+                "last tab",
+                viewController.getSelectedTab() == RolodexDao.TAB_INDEX.length - 1);
+
+        List contacts = viewController.getContactsForTab();
+        assertNotNull(contacts);
+
+        // should be 1 contact on this tab
+        assertTrue("#contacts", contacts.size() == 1);
+        Contact contact = (Contact) contacts.get(0);
+        String nameParam = null;
+        try {
+            nameParam = URLEncoder.encode(contact.getName(), "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+        }
+
+        request.addParameter("selectedName", nameParam);
+
+        // invoke the method on the view controller as if it was fired
+        // via an action method binding event on the name collumn in the
+        // data table
+        String forward = viewController.selectContact();
+        assertEquals("forward", "rolodex$test", forward);
+
+        // make sure something was selected
+        assertNotNull("selectedContact", viewController.getSelectedContact());
+
+        // compare the source name with the target name
+        assertEquals("contact.name", contact.getName(), viewController
+                .getSelectedContact().getName());
+
+        // delete the selectedContact
+        viewController.deleteContact();
+
+        // get the contacts on the page after the delete
+        contacts = viewController.getContactsForTab();
+
+        // should be 0 contact on this tab
+        assertTrue("#contacts", contacts.size() == 0);
+
+    }
+
+}

Modified: struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/web/WEB-INF/clay-config.xml?rev=209993&r1=209992&r2=209993&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 Sat Jul  9 21:55:23 2005
@@ -18,7 +18,7 @@
       <element renderId="1" jsfid="param">
          <attributes>
              <set name="name" value="selectedName"/>
-             <set name="value" useValueLateBinding="true" value="#{e.name}"/>
+             <set name="value" useValueLateBinding="true" value="#{e.encodedName}"/>
          </attributes>    
       </element>
 
@@ -100,7 +100,7 @@
 			  <set name="for"   value="state" />
 		   </attributes>
 	</component>				
-	<component jsfid="state" extends="selectOneMenu" id="state"> 
+	<component jsfid="state" extends="selectOneMenu" id="state" allowBody="false"> 
        <attributes>
 	      <set name="value" useValueLateBinding="true" value="#{managed-bean-name.state}" />
 		  <set name="required" value="true" />	      

Added: struts/shale/trunk/use-cases/src/web/rolodex/address.html
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/web/rolodex/address.html?rev=209993&view=auto
==============================================================================
--- struts/shale/trunk/use-cases/src/web/rolodex/address.html (added)
+++ struts/shale/trunk/use-cases/src/web/rolodex/address.html Sat Jul  9 21:55:23 2005
@@ -0,0 +1,34 @@
+<table border=0>
+   <tr class="contactsHeader">
+      <td rowspan="6">H<br>T<br>M<br>L<BR></td>
+   </tr>
+   <tr>
+        <td><label jsfid=street1Label>Mock Address 1:</label></td>
+        <td><input jsfid="street1" type=text></td>
+        <td><span jsfid="street1Message">Mock Error Address 1</span></td>
+   </tr>
+   <tr>
+        <td><label jsfid=street2Label>Mock Address 2:</label></td>
+        <td><input jsfid="street2" type=text></td>
+        <td><span jsfid="street2Message">Mock Error Address 2</span></td>
+   </tr>
+   <tr>
+        <td><label jsfid="cityLabel">Mock City:</label></td>
+        <td><input jsfid="city" type=text></td>
+        <td><span jsfid="cityMessage">Mock Error City</span></td>
+   </tr>
+   <tr>
+        <td><label jsfid="stateLabel">Mock State:</label></td>
+        <td><select jsfid="state">
+               <option>Mock State 1
+               <option>Mock State 2
+            </select>
+        </td>
+        <td><span jsfid="stateMessage">Mock Error State</span></td>
+   </tr>
+   <tr>
+        <td><label jsfid="zipLabel">Mock Zip:</label></td>
+        <td><input jsfid="zip" type=text/></td>
+        <td><span jsfid="zipMessage">Mock Error Zip</span></td>
+   </tr>
+</table>

Modified: struts/shale/trunk/use-cases/src/web/rolodex/rolodex.jsp
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/use-cases/src/web/rolodex/rolodex.jsp?rev=209993&r1=209992&r2=209993&view=diff
==============================================================================
--- struts/shale/trunk/use-cases/src/web/rolodex/rolodex.jsp (original)
+++ struts/shale/trunk/use-cases/src/web/rolodex/rolodex.jsp Sat Jul  9 21:55:23 2005
@@ -140,7 +140,9 @@
 					managedBeanName="rolodex" />
 				<h:outputText value="Residential Address:" style="color:#66B9CC"/>
 				<h:outputText value="Business Address:" style="color:#66B9CC"/>
-				<clay:clay id="address1" jsfid="addressPanel"
+				<!-- clay:clay id="address1" jsfid="addressPanel"
+					managedBeanName="rolodex.selectedContact.residentialAddress" / -->
+				<clay:clay id="address1" jsfid="rolodex/address.html"
 					managedBeanName="rolodex.selectedContact.residentialAddress" />
 				<clay:clay id="address2" jsfid="foreignAddressPanel"
 					managedBeanName="rolodex.selectedContact.businessAddress" />



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org