Issue Details (XML | Word | Printable)

Key: SM-27
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Matt Raible
Reporter: Matt Raible
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Struts Menu

db driven menu loses sort order

Created: 09/May/06 01:46 AM   Updated: 09/May/06 10:25 PM   Resolved: 09/May/06 10:25 PM
Component/s: Menu Core
Affects Version/s: 2.3
Fix Version/s: 2.4


 Description  « Hide
Moved from SF http://sourceforge.net/tracker/index.php?func=detail&aid=1051553&group_id=48726&atid=453974:

Using dynamic menu example, the order in which the
menus are drawn is not related to the ORDER BY clause
in the SELECT statement. I've verified this using MySQL
and a simple case:

<%@include file="include/jspheader.jsp"%>

<sql:query var="parents" dataSource="${db}">
SELECT * FROM test WHERE parentId IS NULL ORDER BY id
</sql:query>

<%
Result result = (Result)
pageContext.getAttribute("parents");
Map[] rows = result.getRows();
MenuRepository repository = new MenuRepository();
MenuRepository defaultRepository = (MenuRepository)

application.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
repository.setDisplayers(defaultRepository.getDisplayers());
for (int i=0; i < rows.length; i++) {
MenuComponent mc = new MenuComponent();
Map row = rows[i];
Integer requestId = (Integer) row.get("id");
Integer parentId = (Integer) row.get("parentId");
System.out.println("id: " + requestId.toString());
String rcValue = (String) row.get("name");
mc.setName(requestId.toString());
mc.setTitle(requestId.toString() + "&nbsp;-&nbsp;" +
(String) row.get("name"));
mc.setLocation("request-account-id.jsp");
repository.addMenu(mc);
}
pageContext.setAttribute("repository", repository);
%>
<html>
<%@include file="include/htmlheader.jsp"%>
<head><title>JSP Page</title></head>
<body>
<div>
Using TagLib &lt;menu:userMenuDisplayer&gt;

<menu:useMenuDisplayer name="ListMenu"
repository="repository">
<c:forEach var="menu"
items="${repository.topMenus}">
<menu:displayMenu name="${menu.name}"/>
</c:forEach>
</menu:useMenuDisplayer>
</div>

<div>
<pre>
mysql> select * from test where parentId is null order
by id;
+----+----------+--------------+
| id | parentId | name |
+----+----------+--------------+
| 1 | NULL | TAXCONDITION |
| 4 | NULL | TAXCONDITION |
| 8 | NULL | TAXCONDITION |
+----+----------+--------------+
3 rows in set (0.00 sec)
</pre>
</div>

</body>
</html>

Comments

Date: 2004-10-21 19:04
Sender: sd159Accepting Donations
Logged In: YES
user_id=47470

This very tiny patch solves the problem.

--- MenuRepository.java.orig 2004-10-22
09:00:08.169532939 +0800
+++ MenuRepository.java 2004-10-22 08:51:14.456181565 +0800
@@ -37,7 +37,7 @@
     protected String config = null;
     protected String name = null;
     protected ServletContext servletContext = null;
- protected FastHashMap menus = new FastHashMap();
+ protected LinkedHashMap menus = new LinkedHashMap();
     protected FastHashMap displayers = new FastHashMap();
     protected FastHashMap templates = new FastHashMap();

@@ -213,7 +213,7 @@
             input =
getServletContext().getResourceAsStream(config);
             digester.parse(input);

- menus.setFast(true);
+ //menus.setFast(true);
         } catch (Exception e) {
             e.printStackTrace();
             throw new LoadableResourceException("Error
parsing resource file: " +
@@ -226,7 +226,7 @@
     }

     public void reload() throws LoadableResourceException {
- menus.setFast(false);
+ //menus.setFast(false);
         menus.clear();
         displayers.setFast(false);
         displayers.clear();




Matt Raible made changes - 09/May/06 10:25 PM
Field Original Value New Value
Resolution Fixed [ 1 ]
Status Open [ 1 ] Resolved [ 5 ]
Matt Raible made changes - 09/May/06 10:25 PM
Affects Version/s 2.3 [ 10050 ]