You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by mf...@apache.org on 2012/08/27 17:10:30 UTC

svn commit: r1377707 - in /rave/branches/model-split: rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/ rave-components/rave-web/src/main/resources/META-INF/ rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/ ra...

Author: mfranklin
Date: Mon Aug 27 15:10:30 2012
New Revision: 1377707

URL: http://svn.apache.org/viewvc?rev=1377707&view=rev
Log:
Added tag to support querying people by Id at render time (RAVE-729)

Added:
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/PersonTag.java
    rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/PersonTagTest.java
      - copied, changed from r1377675, rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/JavaScriptDebugModeTagTest.java
Modified:
    rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/categories.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/page.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/personProfile.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/widget.jsp

Added: rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/PersonTag.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/PersonTag.java?rev=1377707&view=auto
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/PersonTag.java (added)
+++ rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/PersonTag.java Mon Aug 27 15:10:30 2012
@@ -0,0 +1,89 @@
+package org.apache.rave.portal.web.tag;
+
+import org.apache.rave.portal.model.Person;
+import org.apache.rave.portal.repository.PersonRepository;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
+
+/**
+ * Adds the requested person to the requested scope for access via JSPs
+ */
+public class PersonTag extends AbstractContextAwareSingletonBeanDependentTag<PersonRepository> {
+
+    private String var;
+
+    private String id;
+    private int scope;
+    private boolean scopeSpecified;
+
+    public PersonTag() {
+        super(PersonRepository.class);
+        this.init();
+    }
+
+    @Override
+    public int doStartTag() throws JspException {
+        return super.doStartTag();
+    }
+
+    @Override
+    public int doEndTag() throws JspException {
+        this.updateContext(this.getBean().get(id));
+        this.init();
+        return EVAL_PAGE;
+    }
+
+    public String getVar() {
+        return var;
+    }
+
+    public void setVar(String var) {
+        this.var = var;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public int getScope() {
+        return scope;
+    }
+
+    public void setScope(int scope) {
+        this.scope = scope;
+        scopeSpecified = true;
+    }
+
+    private void init() {
+        this.var = null;
+        this.id = null;
+        this.scope = PageContext.PAGE_SCOPE;
+    }
+
+    private void updateContext(Person result) throws JspException {
+        if (var != null) {
+            /*
+             * Store the result, letting an IllegalArgumentException
+             * propagate back if the scope is invalid (e.g., if an attempt
+             * is made to store something in the session without any
+             * HttpSession existing).
+             */
+            if (result != null) {
+                pageContext.setAttribute(var, result, scope);
+            } else {
+                if (scopeSpecified) {
+                    pageContext.removeAttribute(var, scope);
+                } else {
+                    pageContext.removeAttribute(var);
+                }
+            }
+        } else {
+            writeString(result.getUsername());
+        }
+    }
+}

Modified: rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld?rev=1377707&r1=1377706&r2=1377707&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld Mon Aug 27 15:10:30 2012
@@ -26,6 +26,30 @@
     <uri>http://www.apache.org/rave/tags</uri>
 
     <tag>
+        <description>Allows access to a org.apache.rave.model.Person object via the configured variable</description>
+        <name>person</name>
+        <tag-class>org.apache.rave.portal.web.tag.PersonTag</tag-class>
+        <body-content>JSP</body-content>
+        <attribute>
+            <description>The ID of the person to load</description>
+            <name>id</name>
+            <required>true</required>
+            <rtexprvalue>true</rtexprvalue>
+        </attribute>
+        <attribute>
+            <description>The variable to assign the resulting person to</description>
+            <name>var</name>
+            <required>true</required>
+            <rtexprvalue>true</rtexprvalue>
+        </attribute>
+        <attribute>
+            <description>The scope under which the assignment is valid</description>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+        </attribute>
+    </tag>
+    <tag>
         <description>Renders a given RegionWidget in the page</description>
         <name>render-widget</name>
         <tag-class>org.apache.rave.portal.web.tag.RegionWidgetTag</tag-class>

Copied: rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/PersonTagTest.java (from r1377675, rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/JavaScriptDebugModeTagTest.java)
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/PersonTagTest.java?p2=rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/PersonTagTest.java&p1=rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/JavaScriptDebugModeTagTest.java&r1=1377675&r2=1377707&rev=1377707&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/JavaScriptDebugModeTagTest.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/PersonTagTest.java Mon Aug 27 15:10:30 2012
@@ -18,10 +18,9 @@
  */
 package org.apache.rave.portal.web.tag;
 
-import org.apache.rave.portal.model.PortalPreference;
-import org.apache.rave.portal.model.impl.PortalPreferenceImpl;
-import org.apache.rave.portal.service.PortalPreferenceService;
-import org.apache.rave.portal.web.util.PortalPreferenceKeys;
+import org.apache.rave.portal.model.Person;
+import org.apache.rave.portal.model.impl.PersonImpl;
+import org.apache.rave.portal.repository.PersonRepository;
 import org.junit.Before;
 import org.junit.Test;
 import org.springframework.web.context.WebApplicationContext;
@@ -30,117 +29,135 @@ import javax.servlet.ServletContext;
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspWriter;
 import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.Tag;
 import java.io.IOException;
 
 import static org.easymock.EasyMock.*;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
-public class JavaScriptDebugModeTagTest {
-    private PortalPreferenceService service;
-    private JavaScriptDebugModeTag tag;
+public class PersonTagTest {
+    public static final String VALID_ID = "1234";
+    public static final String VAR = "VAR";
+    private PersonRepository repository;
     private WebApplicationContext wContext;
     private PageContext pageContext;
     private ServletContext servletContext;
     private JspWriter writer;
-
-    final String DEBUG_ON = "1";
-    final String DEBUG_OFF = "0";
+    private PersonTag tag;
 
     @Before
     public void setup() throws JspException {
-        service = createMock(PortalPreferenceService.class);
+        repository = createMock(PersonRepository.class);
         wContext = createNiceMock(WebApplicationContext.class);
         pageContext = createNiceMock(PageContext.class);
         servletContext = createNiceMock(ServletContext.class);
         writer = createNiceMock(JspWriter.class);
 
-        tag = new JavaScriptDebugModeTag();
+        tag = new PersonTag();
         tag.setPageContext(pageContext);
     }
 
     @Test
-    public void doStartTag_debugOn() throws IOException, JspException {
-        PortalPreference portalPreference = new PortalPreferenceImpl(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE, DEBUG_ON);
+    public void doStartTag_allSet() throws IOException, JspException {
+        Person p = new PersonImpl();
 
-        expect(service.getPreference(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE)).andReturn(portalPreference);
+        expect(repository.get(VALID_ID)).andReturn(p);
         expect(pageContext.getServletContext()).andReturn(servletContext).anyTimes();
         expect(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(wContext).anyTimes();
-        expect(wContext.getBean(PortalPreferenceService.class)).andReturn(service).anyTimes();
-        expect(pageContext.getOut()).andReturn(writer);
-        replay(service, pageContext, servletContext, wContext, writer);
+        expect(wContext.getBean(PersonRepository.class)).andReturn(repository).anyTimes();
+        pageContext.setAttribute(VAR, p, PageContext.REQUEST_SCOPE);
+        expectLastCall();
+        replay(repository, pageContext, servletContext, wContext, writer);
+
 
-        int result = tag.doStartTag();
+        tag.setId(VALID_ID);
+        tag.setScope(PageContext.REQUEST_SCOPE);
+        tag.setVar(VAR);
+        int result = tag.doEndTag();
 
-        assertThat(result, is(javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE));
-        verify(service, pageContext, servletContext, wContext, writer);
+        assertThat(result, is(Tag.EVAL_PAGE));
+        verify(repository, pageContext, servletContext, wContext, writer);
     }
 
     @Test
-    public void doStartTag_debugOff() throws IOException, JspException {
-        PortalPreference portalPreference = new PortalPreferenceImpl(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE, DEBUG_OFF);
+    public void doStartTag_varSet() throws IOException, JspException {
+        Person p = new PersonImpl();
 
-        expect(service.getPreference(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE)).andReturn(portalPreference);
+        expect(repository.get(VALID_ID)).andReturn(p);
         expect(pageContext.getServletContext()).andReturn(servletContext).anyTimes();
         expect(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(wContext).anyTimes();
-        expect(wContext.getBean(PortalPreferenceService.class)).andReturn(service).anyTimes();
-        expect(pageContext.getOut()).andReturn(writer);
-        replay(service, pageContext, servletContext, wContext, writer);
+        expect(wContext.getBean(PersonRepository.class)).andReturn(repository).anyTimes();
+        pageContext.setAttribute(VAR, p, PageContext.PAGE_SCOPE);
+        expectLastCall();
+        replay(repository, pageContext, servletContext, wContext, writer);
 
-        int result = tag.doStartTag();
 
-        assertThat(result, is(javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE));
-        verify(service, pageContext, servletContext, wContext, writer);
+        tag.setId(VALID_ID);
+        tag.setVar(VAR);
+        int result = tag.doEndTag();
+
+        assertThat(result, is(Tag.EVAL_PAGE));
+        verify(repository, pageContext, servletContext, wContext, writer);
     }
 
     @Test
-    public void doStartTag_exception() throws IOException, JspException {
-        PortalPreference portalPreference = new PortalPreferenceImpl(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE, DEBUG_OFF);
+    public void doStartTag_novar() throws IOException, JspException {
+        Person p = new PersonImpl();
+        p.setUsername("FOO");
 
-        expect(service.getPreference(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE)).andThrow(new RuntimeException("error"));
+        expect(repository.get(VALID_ID)).andReturn(p);
         expect(pageContext.getServletContext()).andReturn(servletContext).anyTimes();
         expect(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(wContext).anyTimes();
-        expect(wContext.getBean(PortalPreferenceService.class)).andReturn(service).anyTimes();
-        expect(pageContext.getOut()).andReturn(writer);
-        replay(service, pageContext, servletContext, wContext, writer);
+        expect(wContext.getBean(PersonRepository.class)).andReturn(repository).anyTimes();
+        expect(pageContext.getOut()).andReturn(writer).anyTimes();
+        writer.print(p.getUsername());
+        expectLastCall();
+        replay(repository, pageContext, servletContext, wContext, writer);
 
-        int result = tag.doStartTag();
+        tag.setId(VALID_ID);
+        int result = tag.doEndTag();
 
-        assertThat(result, is(javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE));
-        verify(service, pageContext, servletContext, wContext, writer);
+        assertThat(result, is(Tag.EVAL_PAGE));
+        verify(repository, pageContext, servletContext, wContext, writer);
     }
 
     @Test
-    public void doStartTag_nullPreference() throws IOException, JspException {
-        PortalPreference portalPreference = null;
+    public void doStartTag_noResult() throws IOException, JspException {
+        Person p = new PersonImpl();
 
-        expect(service.getPreference(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE)).andReturn(portalPreference);
+        expect(repository.get(null)).andReturn(null);
         expect(pageContext.getServletContext()).andReturn(servletContext).anyTimes();
         expect(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(wContext).anyTimes();
-        expect(wContext.getBean(PortalPreferenceService.class)).andReturn(service).anyTimes();
-        expect(pageContext.getOut()).andReturn(writer);
-        replay(service, pageContext, servletContext, wContext, writer);
+        expect(wContext.getBean(PersonRepository.class)).andReturn(repository).anyTimes();
+        pageContext.removeAttribute(VAR);
+        expectLastCall();
+        replay(repository, pageContext, servletContext, wContext, writer);
 
-        int result = tag.doStartTag();
+        tag.setVar(VAR);
+        int result = tag.doEndTag();
 
-        assertThat(result, is(javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE));
-        verify(service, pageContext, servletContext, wContext, writer);
+        assertThat(result, is(Tag.EVAL_PAGE));
+        verify(repository, pageContext, servletContext, wContext, writer);
     }
 
     @Test
-    public void doStartTag_emptyPreference() throws IOException, JspException {
-        PortalPreference portalPreference = new PortalPreferenceImpl(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE, "");
+    public void doStartTag_noResult_ScopeSet() throws IOException, JspException {
+        Person p = new PersonImpl();
 
-        expect(service.getPreference(PortalPreferenceKeys.JAVASCRIPT_DEBUG_MODE)).andReturn(portalPreference);
+        expect(repository.get(null)).andReturn(null);
         expect(pageContext.getServletContext()).andReturn(servletContext).anyTimes();
         expect(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(wContext).anyTimes();
-        expect(wContext.getBean(PortalPreferenceService.class)).andReturn(service).anyTimes();
-        expect(pageContext.getOut()).andReturn(writer);
-        replay(service, pageContext, servletContext, wContext, writer);
-
-        int result = tag.doStartTag();
+        expect(wContext.getBean(PersonRepository.class)).andReturn(repository).anyTimes();
+        pageContext.removeAttribute(VAR, PageContext.REQUEST_SCOPE);
+        expectLastCall();
+        replay(repository, pageContext, servletContext, wContext, writer);
+
+        tag.setVar(VAR);
+        tag.setScope(PageContext.REQUEST_SCOPE);
+        int result = tag.doEndTag();
 
-        assertThat(result, is(javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE));
-        verify(service, pageContext, servletContext, wContext, writer);
+        assertThat(result, is(Tag.EVAL_PAGE));
+        verify(repository, pageContext, servletContext, wContext, writer);
     }
 }

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/categories.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/categories.jsp?rev=1377707&r1=1377706&r2=1377707&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/categories.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/categories.jsp Mon Aug 27 15:10:30 2012
@@ -53,21 +53,21 @@
 	                <tbody>
 	                <c:forEach items="${categories}" var="category">
 	                    <spring:url value="/app/admin/category/edit?id=${category.id}" var="detaillink"/>
-	
+                        <portal:person id="${category.createdUserId}" var="createdUser" />
+                        <portal:person id="${category.lastModifiedUserId}" var="modifiedUser" />
+
 	                    <tr data-detaillink="${detaillink}">
 	                        <td>
 	                            <a href="${detaillink}"><c:out value="${category.text}"/></a>
 	                        </td>
 	                        <td>
-                                <!--TODO: GET USER NAME-->
-	                            <c:out value="${category.createdUserId}"/>
+	                            <c:out value="${createdUser.username}"/>
 	                        </td>
 	                        <td>
 	                            <c:out value="${category.createdDate}"/>
 	                        </td>
 	                        <td>
-                                <!--TODO: GET USER NAME-->
-	                            <c:out value="${category.lastModifiedUserId}"/>
+	                            <c:out value="${modifiedUser.username}"/>
 	                        </td>
 	                        <td>
 	                            <c:out value="${category.lastModifiedDate}"/>

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/page.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/page.jsp?rev=1377707&r1=1377706&r2=1377707&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/page.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/page.jsp Mon Aug 27 15:10:30 2012
@@ -70,9 +70,9 @@
                         <c:otherwise>false</c:otherwise>
                     </c:choose>
                 </c:set>
+                <portal:person id="${userPage.ownerId}" var="userPageOwner" />
                 <fmt:message key="sharing.page.tab.icon.tip.from" var="iconShareToolTipFrom">
-                    <%--TODO:FIX BEFORE RAVE-729 is COMPLETE --%>
-                    <fmt:param value="${userPage.ownerId}"/>
+                    <fmt:param value="${userPageOwner.username}"/>
                 </fmt:message>
                 <fmt:message key="sharing.page.tab.icon.tip.to" var="iconShareToolTipTo"/>
                 <c:choose>
@@ -287,9 +287,9 @@
         </div>
         <div class="modal-body">
             <div id="confirmSharePageDialogLegend">
+                <portal:person id="${page.ownerId}" var="owner" />
                 <fmt:message key="sharing.dialog.confirm.message">
-                    <%--TODO: This MUST change before RAVE-729 is complete --%>
-                    <fmt:param value="${page.ownerId}"/>
+                    <fmt:param value="${owner.username}"/>
                 </fmt:message>
             </div>
         </div>
@@ -312,7 +312,7 @@
         });
     </script>
     <c:forEach var="members" items="${page.members}">
-        <%--TODO: This MUST change before RAVE-729 is complete --%>
-        <script>rave.layout.searchHandler.addExistingMember("${members.userId}",${members.editor});</script>
+        <portal:person id="${members.userId}" var="member" />
+        <script>rave.layout.searchHandler.addExistingMember("${member.username}",${members.editor});</script>
     </c:forEach>
 </portal:register-init-script>

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/personProfile.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/personProfile.jsp?rev=1377707&r1=1377706&r2=1377707&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/personProfile.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/personProfile.jsp Mon Aug 27 15:10:30 2012
@@ -165,8 +165,8 @@
             </div>
         </div>
         <div class="span3">
-            <%--TODO: This MUST change before RAVE-729 is complete --%>
-        	<button type="button" id="addRemoveFriend" value="${page.ownerId}" class="btn btn-primary profile-info-visible">Add/Remove Friends</button>
+            <portal:person id="${page.ownerId}" var="${owner}" />
+        	<button type="button" id="addRemoveFriend" value="${owner.username}" class="btn btn-primary profile-info-visible">Add/Remove Friends</button>
         </div>
         <div class="span3">
             <div>

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/widget.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/widget.jsp?rev=1377707&r1=1377706&r2=1377707&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/widget.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/widget.jsp Mon Aug 27 15:10:30 2012
@@ -193,14 +193,14 @@
                     <c:if test="${not empty widget.comments}">
                         <ul class="comments">
                             <c:forEach var="comment" items="${widget.comments}">
+                                <portal:person id="${comment.userId}" var="commenter" />
                                 <li class="comment">
                                     <fmt:formatDate value="${comment.createdDate}" type="both" var="commentDate"/>
                                     <p class="comment-heading">
                                         <span class="commenter">
-                                            <%-- TODO:Find way to get person before completion of RAVE-729--%>
                                             <c:choose>
-                                                <c:when test="${not empty comment.userId}">
-                                                    <c:out value="${comment.userId}"/>
+                                                <c:when test="${not empty commenter.username}">
+                                                    <c:out value="${commenter.username}"/>
                                                 </c:when>
                                                 <c:otherwise><c:out value="${comment.userId}"/></c:otherwise>
                                             </c:choose>