source: trunk/www/include/menu.jsp @ 7158

Last change on this file since 7158 was 7158, checked in by Nicklas Nordborg, 6 years ago

References #2011: Check that session id and client id match every time a new page is requested

This has now been implemented in the BASE Core API by adding a new Application.getSessionControl() method with 3 string arguments. The older 2-argument version will behave as if net.sf.basedb.clients.web is used.

This is change may break existing clients that are not built on top of the current web client. The only such client we currently know of is the FTP server extension but this is not affected since it doesn't use the Application.getSessionControl() method.

Fixing existing code that is affected should be relatively easy by replacing the old method call with a call to the new method and using the same client id as when the session was created.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 47.4 KB
Line 
1<%-- $Id: menu.jsp 7158 2016-05-25 13:25:41Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg, Gregory Vincic
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson, Gregory Vincic
5  Copyright (C) 2007 Nicklas Nordborg
6
7  This file is part of BASE - BioArray Software Environment.
8  Available at http://base.thep.lu.se/
9
10  BASE is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License
12  as published by the Free Software Foundation; either version 3
13  of the License, or (at your option) any later version.
14
15  BASE is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with BASE. If not, see <http://www.gnu.org/licenses/>.
22  ------------------------------------------------------------------
23
24  This page is included from the <base:page> taglib to display the
25  meny.
26
27  @param name
28    The name of the menu to display:
29    - standard: The standard menu for a logged in user
30    - login: The menu used on pages where no user is logged in
31    - exception: Used on error pages, does not display a menu at all
32    - auto: Will display either the "standard" or "login" menu
33
34  @author Nicklas
35  @version 2.0
36--%>
37<%@ page pageEncoding="UTF-8" session="false"
38  import="net.sf.basedb.core.Application"
39  import="net.sf.basedb.core.SessionControl"
40  import="net.sf.basedb.core.DbControl"
41  import="net.sf.basedb.core.BasicItem"
42  import="net.sf.basedb.core.Nameable"
43  import="net.sf.basedb.core.Permission"
44  import="net.sf.basedb.core.Item"
45  import="net.sf.basedb.core.ItemContext"
46  import="net.sf.basedb.core.User"
47  import="net.sf.basedb.core.Project"
48  import="net.sf.basedb.core.BioAssaySet"
49  import="net.sf.basedb.core.Client"
50  import="net.sf.basedb.core.StringUtil"
51  import="net.sf.basedb.core.ItemQuery"
52  import="net.sf.basedb.core.Include"
53  import="net.sf.basedb.core.ItemResultList"
54  import="net.sf.basedb.core.Type"
55  import="net.sf.basedb.core.query.Orders"
56  import="net.sf.basedb.core.query.Order"
57  import="net.sf.basedb.core.query.Hql"
58  import="net.sf.basedb.core.query.Restrictions"
59  import="net.sf.basedb.core.query.Expressions"
60  import="net.sf.basedb.clients.web.Base"
61  import="net.sf.basedb.clients.web.util.HTML"
62  import="net.sf.basedb.clients.web.resources.Bundle"
63  import="net.sf.basedb.util.Values"
64  import="net.sf.basedb.util.resources.ResourceBundleWrapper"
65  import="net.sf.basedb.util.resources.ResourceBundleFactory"
66  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
67  import="net.sf.basedb.clients.web.extensions.JspContext"
68  import="net.sf.basedb.clients.web.extensions.menu.MenuItemAction"
69  import="net.sf.basedb.util.extensions.Extension"
70  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
71  import="net.sf.basedb.util.extensions.ActionIterator"
72  import="net.sf.basedb.clients.web.extensions.DynamicActionAttributes"
73  import="net.sf.basedb.clients.web.extensions.DynamicActionAttribute"
74  import="java.util.HashMap"
75  import="java.util.Map"
76  import="java.util.ArrayList"
77  import="java.util.LinkedList"
78  import="java.util.List"
79  import="java.util.Arrays"
80  import="java.util.Iterator"
81  import="java.util.Set"
82  import="java.util.HashSet"
83%>
84<%@ taglib prefix="m" uri="/WEB-INF/menu.tld" %>
85<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
86<%
87SessionControl sc = null;
88try
89{
90  sc = Application.isRunning() ? Base.getSessionControl(pageContext, false) : null;
91}
92catch (RuntimeException ex)
93{}
94final String ID = sc == null ? "" : sc.getId();
95String name = Values.getString(request.getParameter("name"), "login");
96final String root = request.getContextPath()+"/";
97if ("exception".equals(name) && sc != null && sc.isLoggedIn()) name = "standard";
98
99final ResourceBundleWrapper common = ResourceBundleFactory.getResourceBundle(Bundle.COMMON, sc);
100final ResourceBundleWrapper menu = ResourceBundleFactory.getResourceBundle(Bundle.MENU, sc);
101
102if ("login".equals(name))
103{
104}
105else if ("projects".equals(name) && sc != null && sc.isLoggedIn())
106{
107  // Projects menu
108  int activeProjectId = sc.getActiveProjectId();
109  %>
110  <m:menu 
111    id="menu.projects"
112    style="display: none"
113    >
114    <%
115    final DbControl dc = sc.newDbControl();
116    boolean menuSeparatorBeforeDeactivate = true;
117    try
118    {
119      List<Project> projects = new ArrayList<Project>();
120      int lastRecentActiveIndex = 0;
121      // 1. Load the most recently active projects
122      String tmp = sc.getUserClientSetting("projects.recentActive");
123      Set<Integer> recentProjects = new HashSet<Integer>();
124      if (tmp != null)
125      {
126        for (String id : tmp.split(":"))
127        {
128          try
129          {
130            Project p = Project.getById(dc, Values.getInt(id));
131            if (!p.isRemoved())
132            {
133              recentProjects.add(p.getId());
134              projects.add(p);
135              lastRecentActiveIndex++;
136            }
137          }
138          catch (RuntimeException ex)
139          {}
140        }
141      }
142     
143      // 2. Load more projects
144      final ItemContext projectCC = sc.getCurrentContext(Item.PROJECT);
145      final ItemQuery<Project> projectQuery = Project.getQuery();
146      projectQuery.include(Include.MINE, Include.SHARED);
147      projectQuery.restrict(Restrictions.not(Restrictions.in(Hql.property("id"), Expressions.parameter("projects"))));
148      projectQuery.setParameter("projects", recentProjects, Type.INT);
149      Order projectSortOrder = projectCC.getSortOrder();
150      if (projectSortOrder != null) projectQuery.order(projectSortOrder);
151      projectQuery.order(Orders.asc(Hql.property("name")));
152      projectQuery.setCacheResult(true);
153      projects.addAll(projectQuery.list(dc));
154      boolean breakAt15 = projects.size() > 16;
155      int index = 0;
156      String thisIsTheActiveProject = menu.getString("activeproject.tooltip");
157      String thisIsNotTheActiveProject = menu.getString("inactiveproject.tooltip");
158      if (lastRecentActiveIndex > 0)
159      {
160        %>
161        <m:menuitem 
162          title="<%=menu.getString("recentprojects.title")%>" 
163          subclass="menusection"
164          enabled="false" 
165        />
166        <m:menuseparator />
167        <%
168      }
169      Set<Integer> shownProjects = new HashSet<Integer>();
170      for (Project p : projects)
171      {
172        if (index == 15 && breakAt15) break;
173        index++;
174        int projectId = p.getId();
175        boolean active = activeProjectId == projectId;
176        String prefix = index <= lastRecentActiveIndex ? index + ". " : "";
177        shownProjects.add(p.getId());
178        String url = active ? 
179          root+"my_base/projects/index.jsp?ID="+ID+"&amp;cmd=ViewItem&amp;item_id=" + projectId : 
180          root+"my_base/projects/set_active.jsp?ID="+ID+"&amp;project_id="+p.getId();
181        %>
182        <m:menuitem
183          title="<%=prefix + HTML.encodeTags(p.getName())%>"
184          subclass="active"
185          url="<%=url%>"
186          data-popup="<%=active ? "" : "ActivateProject, 300, 200"%>"
187          icon="<%=active ? "checkedmenu.png" : null%>"
188          tooltip="<%=active ? thisIsTheActiveProject : thisIsNotTheActiveProject%>"
189        />
190        <%
191        if (index == lastRecentActiveIndex)
192        {
193          %>
194          <m:menuseparator />
195          <%
196          menuSeparatorBeforeDeactivate = false;
197        }
198        else
199        {
200          menuSeparatorBeforeDeactivate = true;
201        }
202      }
203      if (breakAt15)
204      {
205        int more = projects.size() - 15;
206        %>
207        <m:menuitem 
208          title="<%="…" + menu.getString("moreprojects.title", Integer.toString(more))%>"
209          url="<%=root+"my_base/projects/index.jsp?ID="+ID+"&amp;cmd=UpdateContext&amp;tmpfilter:INT:id=<>"+Values.getString(shownProjects, "|", true)%>"
210          tooltip="<%=menu.getString("moreprojects.tooltip")%>"
211        />
212        <%
213      }
214    }
215    catch (Throwable t)
216    {
217      t.printStackTrace();
218      menuSeparatorBeforeDeactivate = false;
219      %>
220      <m:menuseparator />
221      <m:menuitem 
222        title="<%=menu.getString("projects.error.title")%>" 
223        tooltip="<%=menu.getString("projects.error.tooltip", t.getMessage())%>"
224        enabled="false"
225        icon="error.png"
226      />
227      <%
228    }
229    finally
230    {
231      if (dc != null) dc.close();
232    }
233    if (menuSeparatorBeforeDeactivate)
234    {
235      %>
236      <m:menuseparator />
237      <%
238    }
239    %>
240    <m:menuitem
241      title="<%="<i>- " + menu.getString("noactiveproject.title") + " -</i>"%>"
242      url="<%=root+"my_base/projects/set_active.jsp?ID="+ID%>"
243      data-popup="ActivateProject, 300, 200"
244      icon="<%=activeProjectId == 0 ? "checkedmenu.png" : null%>"
245      enabled="<%=activeProjectId != 0%>"
246      tooltip="<%=menu.getString("noactiveproject.tooltip", activeProjectId == 0)%>"
247    />
248  </m:menu>
249  <%
250}
251else if ("recentItems".equals(name) && sc != null && sc.isLoggedIn())
252{
253  // Recently used items menu
254  String stickyItems = Values.getString(sc.getUserClientSetting("menu.mostRecent"), 
255    "EXPERIMENT:BIOASSAYSET:TRANSFORMATION");
256  boolean loadNames = Values.getBoolean(sc.getUserClientSetting("menu.mostRecent.loadNames"), 
257    true);
258  String recentItems = sc.getUserClientSetting("menu.mostRecent.viewed");
259  DbControl dc = loadNames ? sc.newDbControl() : null;
260  try
261  {
262    %>
263    <m:menu
264      id="menu.mostRecent"
265      style="display: none;"
266      >
267      <%
268      int numItems = 0;
269      // Recently viewed items
270      List<String> recentlyViewed = recentItems == null ? 
271        new ArrayList<String>() : Arrays.asList(recentItems.split(":"));
272      if (recentlyViewed.size() > 0)
273      {
274        %>
275        <m:menuitem 
276          title="<%=menu.getString("recentitems.title")%>" 
277          subclass="menusection"
278          enabled="false" 
279        />
280        <m:menuseparator />
281        <%
282        for (String recent : recentlyViewed)
283        {
284          try
285          {
286            String[] tmp = recent.split("=");
287            Item itemType = Item.valueOf(tmp[0]);
288            String itemTextKey = "item." + itemType.name().toLowerCase();
289            String itemText = common.getString(itemTextKey);
290            if (itemText == itemTextKey) itemText = itemType.toString();
291            int itemId = Values.getInt(tmp[1], 0);
292            if (itemId != 0)
293            {
294              String shortName = "";
295              String fullName = "";
296              int noEdit = 1;
297              if (loadNames)
298              {
299                try
300                {
301                  BasicItem item = itemType.getById(dc, itemId);
302                  fullName = ((Nameable)item).getName();
303                  shortName = HTML.encodeTags(StringUtil.trimString(fullName, 35));
304                  noEdit = item.hasPermission(Permission.WRITE) ? 0 : 1;
305                }
306                catch (Throwable t)
307                {
308                  continue;
309                }
310              }
311              else
312              {
313                fullName = itemText + "; id=" + itemId;
314                shortName = itemText + " (id=" + itemId + ")";
315              }
316              numItems++;
317              %>
318              <m:menuitem
319                title="<%=numItems + ". " + shortName%>"
320                subclass="auto-init"
321                data-auto-init="item-link"
322                data-item-type="<%=itemType.name() %>"
323                data-item-id="<%=itemId %>"
324                data-no-edit="<%=noEdit %>"
325                tooltip="<%=menu.getString("gotorecentitem.tooltip", fullName, itemText)%>"
326              />
327              <%
328            }
329          }
330          catch (Throwable t)
331          {}
332        }
333      }
334      if (stickyItems != null && stickyItems.length() > 0)
335      {
336        int numSticky = 0;
337        if (numItems > 0)
338        {
339          %>
340          <m:menuseparator />
341          <%
342        }
343        %>
344        <m:menuitem 
345          title="<%=menu.getString("stickyitems.title")%>" 
346          subclass="menusection"
347          enabled="false" 
348        />
349        <m:menuseparator />
350        <%
351        // Sticky items
352        for (String recentItem : stickyItems.split(":"))
353        {
354          try
355          {
356            BasicItem item = null;
357            Item itemType = Item.valueOf(recentItem);
358            ItemContext cc = sc.getCurrentContext(itemType);
359            String itemTextKey = "item." + itemType.name().toLowerCase();
360            String itemText = common.getString(itemTextKey);
361            if (itemText == itemTextKey) itemText = itemType.toString();
362            if (cc.getId() != 0)
363            {
364              String shortName = "";
365              String fullName = "";
366              int noEdit = 1;
367              if (loadNames)
368              {
369                try
370                {
371                  item = itemType.getById(dc, cc.getId());
372                  fullName = ((Nameable)item).getName();
373                  shortName = ": " + HTML.encodeTags(StringUtil.trimString(fullName, 30));
374                  noEdit = item.hasPermission(Permission.WRITE) ? 0 : 1;
375                }
376                catch (Throwable t)
377                {
378                  continue;
379                }
380              }
381              else
382              {
383                fullName = itemText + "; id=" + cc.getId();
384                shortName = " (id=" + cc.getId() + ")";
385              }
386              numItems++;
387              numSticky++;
388              %>
389              <m:menuitem
390                title="<%=itemText + shortName%>"
391                subclass="auto-init"
392                data-auto-init="item-link"
393                data-item-type="<%=itemType.name() %>"
394                data-item-id="<%=cc.getId() %>"
395                data-no-edit="<%=noEdit %>"
396                tooltip="<%=menu.getString("gotorecentitem.tooltip", fullName, itemText)%>"
397              />
398              <%
399              if (itemType == Item.BIOASSAYSET)
400              {
401                // Add menu for Experiment explorer as well
402                %>
403                <m:menuitem
404                  title="<%=menu.getString("experimentexplorer.title", shortName)%>"
405                  url="<%=root+"views/experiments/explorer/view/index.jsp?ID=" + ID + "&amp;bioassayset_id="+cc.getId()%>"
406                  tooltip="<%=menu.getString("experimentexplorer.tooltip")%>"
407                  visible="<%=item == null || ((BioAssaySet)item).getNumSpots() > 0 %>"
408                />
409                <%
410              }
411            }
412          }
413          catch (Throwable t)
414          {}
415        }
416        if (numSticky == 0)
417        {
418          %>
419          <m:menuitem 
420            title="<%="<i>- " + menu.getString("nostickyitems.title") + " -</i>"%>"
421            enabled="false"
422          />
423          <%
424        }
425      }
426      %>
427      <m:menuseparator />
428      <m:menuitem 
429        title="<%=menu.getString("recentoptions.title") + "…"%>" 
430        url="<%=root+"my_base/user/preferences.jsp?ID="+ID+"&amp;page=mostRecent"%>"
431        data-popup="Preferences, 600, 400"
432        tooltip="<%=menu.getString("recentoptions.tooltip")%>" 
433      />
434    </m:menu>
435    <%
436  }
437  finally
438  {
439    if (dc != null) dc.close();
440  }
441}
442else if ("standard".equals(name))
443{
444  final DbControl dc = sc.newDbControl();
445  StringBuilder fillText = new StringBuilder();
446  try
447  {
448    Project activeProject = sc.getActiveProjectId() == 0 ? null : Project.getById(dc, sc.getActiveProjectId());
449    if (activeProject == null)
450    {
451      fillText.append("<img src=\""+root+"images/no_active_project.png\" alt=\"\">&nbsp;");
452      fillText.append("<span style=\"color:#FF0000;\" title=\"" + menu.getString("menu.projects.tooltip.0") + "\"");
453    }
454    else
455    {
456      fillText.append("<img src=\""+root+"images/project.png\" alt=\"\">&nbsp;");
457      fillText.append("<span title=\"" + menu.getString("menu.projects.tooltip.1") + "\"");
458    }
459   
460    fillText.append(" class=\"link auto-init\" data-auto-init=\"menu-anchor\" data-menu-id=\"menu.projects\" data-align-right=\"1\">");
461    fillText.append(activeProject == null ? "<i>" + menu.getString("noactiveproject.title") + "</i>" : HTML.encodeTags(activeProject.getName()));
462    fillText.append("<img src=\""+root+"images/sort_asc.png\" alt=\"▼\"></span><span class=\"menuseparator\"></span>");
463   
464    fillText.append("<span id=\"page-reload\" class=\"link\" title=\"" + menu.getString("menu.refresh.tooltip") + "\">");
465    fillText.append("<img src=\""+root+"images/refresh.png\" alt=\"Reload\"></span>");
466    fillText.append("<span class=\"menuseparator\"></span>");
467   
468    fillText.append("<span class=\"link auto-init\" title=\"").append(menu.getString("menu.recentitems.tooltip")).append("\"");
469    fillText.append(" data-auto-init=\"menu-anchor\" data-menu-id=\"menu.mostRecent\" data-align-right=\"1\">");
470    fillText.append("<img src=\""+root+"images/recent.png\" alt=\"Recent\"><img src=\""+root+"images/sort_asc.png\" alt=\"▼\"></span>");
471    fillText.append("<span class=\"menuseparator\"></span>");
472   
473    User user = User.getById(dc, sc.getLoggedInUserId());
474    fillText.append("<img src=\""+root+"images/take_ownership.png\" alt=\"\">&nbsp;");
475    fillText.append("<span class=\"link auto-init\" title=\"").append(menu.getString("menu.user.tooltip")).append("\"");
476    fillText.append(" data-auto-init=\"menu-anchor\" data-menu-id=\"menu.switchuser\" data-align-right=\"1\">");
477    fillText.append(HTML.encodeTags(user.getLogin()));
478    fillText.append(" (").append(user.getName()).append(")<img src=\""+root+"images/sort_asc.png\" alt=\"▼\"></span>");
479
480    // Permission settings
481    final boolean hasItemLists          = !sc.hasPermission(Permission.DENIED, Item.ITEMLIST);
482    final boolean hasFiles              = !sc.hasPermission(Permission.DENIED, Item.FILE);
483    final boolean createFiles           =  sc.hasPermission(Permission.CREATE, Item.FILE);
484    final boolean hasFileServers        = !sc.hasPermission(Permission.DENIED, Item.FILESERVER);
485
486    final boolean hasProjects           = !sc.hasPermission(Permission.DENIED, Item.PROJECT); 
487    final boolean createProjects        =  sc.hasPermission(Permission.CREATE, Item.PROJECT); 
488    final boolean hasPermissionTemplates = !sc.hasPermission(Permission.DENIED, Item.PERMISSIONTEMPLATE); 
489
490    final boolean hasMessages           = !sc.hasPermission(Permission.DENIED, Item.MESSAGE); 
491    final boolean createMessages        =  sc.hasPermission(Permission.CREATE, Item.MESSAGE); 
492
493    final boolean hasPhysicalBioAssays  = !sc.hasPermission(Permission.DENIED, Item.PHYSICALBIOASSAY); 
494    final boolean hasDerivedBioAssays   = !sc.hasPermission(Permission.DENIED, Item.DERIVEDBIOASSAY); 
495
496    final boolean hasRawBioAssays       = !sc.hasPermission(Permission.DENIED, Item.RAWBIOASSAY); 
497    final boolean createRawBioAssays    =  sc.hasPermission(Permission.CREATE, Item.RAWBIOASSAY); 
498    final boolean hasExperiments        = !sc.hasPermission(Permission.DENIED, Item.EXPERIMENT); 
499    final boolean createExperiments     =  sc.hasPermission(Permission.CREATE, Item.EXPERIMENT); 
500    final boolean hasFormulas           = !sc.hasPermission(Permission.DENIED, Item.FORMULA); 
501    final boolean createFormulas        =  sc.hasPermission(Permission.CREATE, Item.FORMULA); 
502   
503    final boolean hasReporters          = !sc.hasPermission(Permission.DENIED, Item.REPORTER); 
504    final boolean hasReporterLists      = !sc.hasPermission(Permission.DENIED, Item.REPORTERLIST); 
505    final boolean createReporters       =  sc.hasPermission(Permission.CREATE, Item.REPORTER); 
506    final boolean hasJobs               = !sc.hasPermission(Permission.DENIED, Item.JOB); 
507    final boolean hasSessions           = !sc.hasPermission(Permission.DENIED, Item.SESSION); 
508    %>
509    <m:menu
510      id="menu.view"
511      style="display: none"
512      >
513      <m:menuitem
514        title="<%=menu.getString("home.title")%>"
515        tooltip="<%=menu.getString("home.tooltip")%>" 
516        url="<%=root+"my_base/index.jsp?ID="+ID%>"
517      />
518      <m:menuitem
519        title="<%=menu.getString("allitems.title")%>"
520        tooltip="<%=menu.getString("allitems.tooltip")%>"
521        url="<%=root+"views/items/index.jsp?ID="+ID%>"
522      />
523      <m:menuitem
524        title="<%=menu.getString("itemlists.title")%>"
525        tooltip="<%=menu.getString("itemlists.tooltip", hasItemLists)%>"
526        url="<%=root+"views/itemlists/index.jsp?ID="+ID%>"
527        enabled="<%=hasItemLists%>"
528      />
529      <m:menuitem
530        title="<%=menu.getString("trashcan.title")%>"
531        tooltip="<%=menu.getString("trashcan.tooltip")%>"
532        url="<%=root+"views/trashcan/index.jsp?ID="+ID%>"
533      />
534      <m:menuseparator />
535      <m:menuitem 
536        title="<%=common.getString("item.file+")%>" 
537        url="<%=root+"filemanager/index.jsp?ID="+ID%>"
538        tooltip="<%=menu.getString("files.tooltip", hasFiles)%>" 
539        enabled="<%=hasFiles%>"
540      />
541      <m:menuitem 
542        title="<%=common.getString("item.fileserver+")%>" 
543        url="<%=root+"filemanager/fileservers/index.jsp?ID="+ID%>"
544        tooltip="<%=menu.getString("fileservers.tooltip", hasFileServers)%>" 
545        enabled="<%=hasFileServers%>"
546      />
547      <m:menuitem
548        title="<%=common.getString("item.project+")%>"
549        url="<%=root+"my_base/projects/index.jsp?ID="+ID%>"
550        tooltip="<%=menu.getString("projects.tooltip", hasProjects)%>"
551        enabled="<%=hasProjects%>"
552      />
553      <m:menuitem
554        title="<%=common.getString("item.permissiontemplate+")%>"
555        url="<%=root+"views/permissiontemplates/index.jsp?ID="+ID%>"
556        tooltip="<%=menu.getString("permissiontemplates.tooltip", hasPermissionTemplates)%>"
557        enabled="<%=hasPermissionTemplates%>"
558      />
559      <m:menuitem 
560        title="<%=common.getString("item.message+")%>" 
561        url="<%=root+"my_base/messages/index.jsp?ID="+ID%>"
562        tooltip="<%=menu.getString("messages.tooltip", hasMessages)%>"
563        enabled="<%=hasMessages%>"
564      />
565      <m:menuitem 
566        title="<%=common.getString("item.job+")%>" 
567        url="<%=root+"views/jobs/index.jsp?ID="+ID%>"
568        tooltip="<%=menu.getString("jobs.tooltip", hasJobs)%>"
569        enabled="<%=hasJobs%>"
570      />
571      <m:menuitem 
572        title="<%=common.getString("item.session+")%>" 
573        url="<%=root+"views/sessions/index.jsp?ID="+ID%>"
574        tooltip="<%=menu.getString("sessions.tooltip", hasSessions)%>"
575        enabled="<%=hasSessions%>"
576      />
577      <m:menuseparator />
578      <m:menuitem
579        title="<%=common.getString("item.physicalbioassay+")%>"
580        url="<%=root+"views/physicalbioassays/index.jsp?ID="+ID%>"
581        tooltip="<%=menu.getString("physicalbioassays.tooltip", hasPhysicalBioAssays)%>"
582        enabled="<%=hasPhysicalBioAssays%>"
583      />
584      <m:menuitem
585        title="<%=common.getString("item.derivedbioassay+")%>"
586        url="<%=root+"views/derivedbioassays/index.jsp?ID="+ID%>"
587        tooltip="<%=menu.getString("derivedbioassays.tooltip", hasDerivedBioAssays)%>"
588        enabled="<%=hasDerivedBioAssays%>"
589      />
590      <m:menuitem
591        title="<%=common.getString("item.rawbioassay+")%>"
592        url="<%=root+"views/rawbioassays/index.jsp?ID="+ID%>"
593        tooltip="<%=menu.getString("rawbioassays.tooltip", hasRawBioAssays)%>"
594        enabled="<%=hasRawBioAssays%>"
595      />
596      <m:menuitem
597        title="<%=common.getString("item.experiment+")%>"
598        url="<%=root+"views/experiments/index.jsp?ID="+ID%>"
599        tooltip="<%=menu.getString("experiments.tooltip", hasExperiments)%>"
600        enabled="<%=hasExperiments%>"
601      />
602      <m:menuitem
603        title="<%=common.getString("item.formula+")%>"
604        url="<%=root+"views/formulas/index.jsp?ID="+ID%>"
605        tooltip="<%=menu.getString("formulas.tooltip", hasFormulas)%>"
606        enabled="<%=hasFormulas%>"
607      />
608      <m:menuseparator />
609      <m:menuitem
610        title="<%=common.getString("item.reporter+")%>"
611        url="<%=root+"views/reporters/index.jsp?ID="+ID%>"
612        tooltip="<%=menu.getString("reporters.tooltip", hasReporters)%>"
613        enabled="<%=hasReporters%>"
614      />
615      <m:menuitem
616        title="<%=common.getString("item.reporterlist+")%>"
617        url="<%=root+"views/reporterlists/index.jsp?ID="+ID%>"
618        tooltip="<%=menu.getString("reporterlists.tooltip", hasReporterLists)%>"
619        enabled="<%=hasReporterLists%>"
620      />
621    </m:menu>
622
623    <m:menu 
624      id="menu.base" 
625      style="display: none"
626      >
627      <m:submenu 
628        subid="menu.projects" 
629        title="<%=menu.getString("menu.projects")%>"
630        tooltip="<%=menu.getString("menu.projects.tooltip", activeProject != null)%>"
631        enabled="<%=hasProjects%>"
632      />
633      <m:menuseparator />
634      <m:menuitem 
635        title="<%=menu.getString("contactinfo.title") + "…"%>" 
636        url="<%=root+"my_base/user/settings.jsp?ID="+ID+"&amp;page=contact"%>" 
637        data-popup="Settings, 600, 400" 
638        tooltip="<%=menu.getString("contactinfo.tooltip")%>" 
639      />
640      <m:menuitem 
641        title="<%=menu.getString("password.title") + "…"%>" 
642        url="<%=root+"my_base/user/settings.jsp?ID="+ID+"&amp;page=password"%>" 
643        data-popup="Settings, 600, 400" 
644        tooltip="<%=menu.getString("password.tooltip")%>" 
645      />
646      <m:menuitem 
647        title="<%=menu.getString("other.title") + "…"%>" 
648        url="<%=root+"my_base/user/settings.jsp?ID="+ID+"&amp;page=other"%>"
649        data-popup="Settings, 600, 400" 
650        tooltip="<%=menu.getString("other.tooltip")%>" 
651      />
652      <m:menuseparator />
653      <m:menuitem 
654        title="<%=menu.getString("preferences.title") + "…"%>" 
655        url="<%=root+"my_base/user/preferences.jsp?ID="+ID%>"
656        data-popup="Preferences, 600, 400" 
657        tooltip="<%=menu.getString("preferences.tooltip")%>" 
658      />
659      <m:menuitem 
660        title="<%=menu.getString("reloadpermissions.title") + "…"%>" 
661        url="<%=root+"my_base/user/submit_user.jsp?ID="+ID+"&amp;cmd=ReloadPermissions"%>"
662        data-popup="ReloadPermissions, 300, 200" 
663        tooltip="<%=menu.getString("reloadpermissions.tooltip")%>" 
664      />
665      <m:menuitem 
666        title="<%=menu.getString("resetlistsettings.title") + "…"%>" 
667        url="<%=root+"my_base/user/reset_filters.jsp?ID="+ID%>"
668        data-popup="ResetFilter, 450, 300" 
669        tooltip="<%=menu.getString("resetlistsettings.tooltip")%>" 
670      />
671      <m:menuseparator />
672      <m:menuitem 
673        title="<%=menu.getString("logout.title") + "…"%>" 
674        url="<%=root+"logout.jsp?ID="+ID%>"
675        data-popup="Logout, 300, 200"
676        tooltip="<%=menu.getString("logout.tooltip")%>" 
677      />
678    </m:menu>
679    <%
680    // BioLIMS - menu
681    final boolean hasTags             = !sc.hasPermission(Permission.DENIED, Item.TAG); 
682    final boolean createTags          =  sc.hasPermission(Permission.CREATE, Item.TAG); 
683
684    final boolean hasBioSources         = !sc.hasPermission(Permission.DENIED, Item.BIOSOURCE); 
685    final boolean createBioSources      =  sc.hasPermission(Permission.CREATE, Item.BIOSOURCE); 
686
687    final boolean hasSamples            = !sc.hasPermission(Permission.DENIED, Item.SAMPLE); 
688    final boolean createSamples         =  sc.hasPermission(Permission.CREATE, Item.SAMPLE);
689
690    final boolean hasExtracts           = !sc.hasPermission(Permission.DENIED, Item.EXTRACT); 
691    final boolean createExtracts        =  sc.hasPermission(Permission.CREATE, Item.EXTRACT); 
692   
693    final boolean hasBioPlates      = !sc.hasPermission(Permission.DENIED, Item.BIOPLATE);
694    final boolean createBioPlates   =  sc.hasPermission(Permission.CREATE, Item.BIOPLATE);
695    final boolean hasBioPlateTypes  = !sc.hasPermission(Permission.DENIED, Item.BIOPLATETYPE);
696    final boolean hasBioPlateEventTypes = !sc.hasPermission(Permission.DENIED, Item.BIOPLATEEVENTTYPE);
697   
698    final boolean hasKits = !sc.hasPermission(Permission.DENIED, Item.KIT);
699
700    final boolean hasBioLims      =  hasTags || hasBioSources || hasSamples || hasExtracts || 
701                      hasBioPlates || hasBioPlateTypes || hasBioPlateEventTypes ||
702                      hasKits;
703   
704    if (hasBioLims)
705    {
706    %>
707      <m:menu 
708        id="menu.biolims"
709        style="display: none"
710        >
711        <m:menuitem
712          title="<%=common.getString("item.biosource+")%>"
713          url="<%=root+"biomaterials/biosources/index.jsp?ID="+ID%>"
714          tooltip="<%=menu.getString("biosources.tooltip", hasBioSources)%>"
715          enabled="<%=hasBioSources%>"
716        />
717        <m:menuitem
718          title="<%=common.getString("item.sample+")%>"
719          url="<%=root+"biomaterials/samples/index.jsp?ID="+ID%>"
720          tooltip="<%=menu.getString("samples.tooltip", hasSamples)%>"
721          enabled="<%=hasSamples%>"
722        />
723        <m:menuitem
724          title="<%=common.getString("item.extract+")%>"
725          url="<%=root+"biomaterials/extracts/index.jsp?ID="+ID%>"
726          tooltip="<%=menu.getString("extracts.tooltip", hasExtracts)%>"
727          enabled="<%=hasExtracts%>"
728        />
729        <m:menuseparator />
730        <m:menuitem
731          title="<%=common.getString("item.tag+")%>"
732          url="<%=root+"biomaterials/tags/index.jsp?ID="+ID%>"
733          tooltip="<%=menu.getString("tags.tooltip", hasTags)%>"
734          enabled="<%=hasTags%>"
735        />
736        <m:menuitem
737          title="<%=common.getString("item.kit+")%>"
738          url="<%=root+"biomaterials/kits/index.jsp?ID="+ID%>"
739          tooltip="<%=menu.getString("kits.tooltip", hasKits)%>"
740          enabled="<%=hasKits%>"
741        />
742        <m:menuseparator />
743        <m:menuitem
744          title="<%=common.getString("item.bioplate+")%>"
745          url="<%=root+"biomaterials/bioplates/index.jsp?ID="+ID%>"
746          tooltip="<%=menu.getString("bioplates.tooltip", hasBioPlates)%>"
747          enabled="<%=hasBioPlates%>"
748        />
749        <m:menuitem
750          title="<%=common.getString("item.bioplatetype+")%>"
751          url="<%=root+"biomaterials/bioplatetypes/index.jsp?ID="+ID%>"
752          tooltip="<%=menu.getString("bioplatetypes.tooltip", hasBioPlateTypes)%>"
753          enabled="<%=hasBioPlateTypes%>"
754        />
755        <m:menuitem
756          title="<%=common.getString("item.bioplateeventtype+")%>"
757          url="<%=root+"biomaterials/bioplateeventtypes/index.jsp?ID="+ID%>"
758          tooltip="<%=menu.getString("bioplateeventtypes.tooltip", hasBioPlateEventTypes)%>"
759          enabled="<%=hasBioPlateEventTypes%>"
760        />
761      </m:menu>
762    <%
763    }
764   
765    // Array LIMS - menu
766    final boolean hasPlateGeometries = sc.hasPermission(Permission.READ, Item.PLATEGEOMETRY);
767    final boolean hasPlateTypes = !sc.hasPermission(Permission.DENIED, Item.PLATETYPE);
768    final boolean hasPlates = !sc.hasPermission(Permission.DENIED, Item.PLATE);
769    final boolean hasPlateMappings = !sc.hasPermission(Permission.DENIED, Item.PLATEMAPPING);
770    final boolean hasArraySlides = !sc.hasPermission(Permission.DENIED, Item.ARRAYSLIDE);
771    final boolean hasArrayBatches = !sc.hasPermission(Permission.DENIED, Item.ARRAYBATCH);
772    final boolean hasArrayDesigns = !sc.hasPermission(Permission.DENIED, Item.ARRAYDESIGN);
773    final boolean hasLims = hasPlateGeometries || hasPlateTypes || hasPlates || hasPlateMappings || 
774      hasArraySlides || hasArrayBatches || hasArrayDesigns;
775    if (hasLims)
776    {
777      %>
778      <m:menu 
779        id="menu.lims" 
780        style="display: none"
781        >
782        <m:menuitem 
783          title="<%=common.getString("item.plategeometry+")%>" 
784          url="<%=root+"lims/geometries/index.jsp?ID="+ID%>" 
785          tooltip="<%=menu.getString("plategeometries.tooltip", hasPlateGeometries)%>" 
786          enabled="<%=hasPlateGeometries%>"
787        />
788        <m:menuitem 
789          title="<%=common.getString("item.platetype+")%>" 
790          url="<%=root+"lims/platetypes/index.jsp?ID="+ID%>" 
791          tooltip="<%=menu.getString("platetypes.tooltip", hasPlateTypes)%>" 
792          enabled="<%=hasPlateTypes%>"
793        />
794        <m:menuitem 
795          title="<%=common.getString("item.plate+")%>" 
796          url="<%=root+"lims/plates/index.jsp?ID="+ID%>" 
797          tooltip="<%=menu.getString("plates.tooltip", hasPlates)%>" 
798          enabled="<%=hasPlates%>"
799        />
800        <m:menuitem 
801          title="<%=common.getString("item.platemapping+")%>" 
802          url="<%=root+"lims/platemappings/index.jsp?ID="+ID%>" 
803          tooltip="<%=menu.getString("platetypes.tooltip", hasPlateTypes)%>" 
804          enabled="<%=hasPlateTypes%>"
805        />
806        <m:menuseparator />
807        <m:menuitem 
808          title="<%=common.getString("item.arraydesign+")%>" 
809          url="<%=root+"lims/arraydesigns/index.jsp?ID="+ID%>" 
810          tooltip="<%=menu.getString("arraydesigns.tooltip", hasArrayDesigns)%>" 
811          enabled="<%=hasArrayDesigns%>"
812        />
813        <m:menuitem 
814          title="<%=common.getString("item.arraybatch+")%>" 
815          url="<%=root+"lims/arraybatches/index.jsp?ID="+ID%>" 
816          tooltip="<%=menu.getString("arraybatches.tooltip", hasArrayBatches)%>" 
817          enabled="<%=hasArrayBatches%>"
818        />
819        <m:menuitem 
820          title="<%=common.getString("item.arrayslide+")%>" 
821          url="<%=root+"lims/arrayslides/index.jsp?ID="+ID%>" 
822          tooltip="<%=menu.getString("arrayslides.tooltip", hasArraySlides)%>" 
823          enabled="<%=hasArraySlides%>"
824        />
825      </m:menu>
826      <%
827    }
828    // Administrate -> Types menu
829    final boolean hasQuotaTypes = sc.hasPermission(Permission.READ, Item.QUOTATYPE);
830    final boolean hasMimeTypes = sc.hasPermission(Permission.READ, Item.MIMETYPE);
831    final boolean hasAnnotationTypeCategories = !sc.hasPermission(Permission.DENIED, Item.ANNOTATIONTYPECATEGORY);   
832    final boolean hasAnnotationTypes = !sc.hasPermission(Permission.DENIED, Item.ANNOTATIONTYPE);
833    final boolean hasReporterTypes = !sc.hasPermission(Permission.DENIED, Item.REPORTERTYPE);
834    final boolean hasExtraValueTypes = !sc.hasPermission(Permission.DENIED, Item.EXTRAVALUETYPE);
835    final boolean hasQuantities = !sc.hasPermission(Permission.DENIED, Item.QUANTITY);
836    final boolean hasItemSubtypes = sc.hasPermission(Permission.READ, Item.ITEMSUBTYPE);
837    final boolean hasTypes = hasMimeTypes || hasQuotaTypes || 
838      hasAnnotationTypeCategories || hasAnnotationTypes || 
839      hasReporterTypes || hasExtraValueTypes || hasQuantities || hasItemSubtypes;
840    if (hasTypes)
841    {
842      %>
843      <m:menu 
844        id="menu.types" 
845        style="display: none"
846        >
847        <m:menuitem 
848          title="<%=common.getString("item.itemsubtype+")%>" 
849          url="<%=root+"admin/itemsubtypes/index.jsp?ID="+ID%>" 
850          tooltip="<%=menu.getString("itemsubtypes.tooltip", hasItemSubtypes)%>" 
851          enabled="<%=hasItemSubtypes%>"
852        />
853        <m:menuseparator />
854        <m:menuitem 
855          title="<%=common.getString("item.annotationtype+")%>" 
856          url="<%=root+"admin/annotationtypes/index.jsp?ID="+ID%>" 
857          tooltip="<%=menu.getString("annotationtypes.tooltip", hasAnnotationTypes)%>" 
858          enabled="<%=hasAnnotationTypes%>"
859        />
860        <m:menuitem 
861          title="<%=common.getString("item.annotationtypecategory+")%>" 
862          url="<%=root+"admin/annotationtypecategories/index.jsp?ID="+ID%>" 
863          tooltip="<%=menu.getString("annotationtypecategories.tooltip", hasAnnotationTypeCategories)%>" 
864          enabled="<%=hasAnnotationTypeCategories%>"
865        />
866        <m:menuseparator />
867        <m:menuitem 
868          title="<%=common.getString("item.mimetype+")%>" 
869          url="<%=root+"admin/mimetypes/index.jsp?ID="+ID%>" 
870          tooltip="<%=menu.getString("mimetypes.tooltip", hasMimeTypes)%>" 
871          enabled="<%=hasMimeTypes%>"
872        />
873        <m:menuitem 
874          title="<%=common.getString("item.quotatype+")%>" 
875          url="<%=root+"admin/quotatypes/index.jsp?ID="+ID%>" 
876          tooltip="<%=menu.getString("quotatypes.tooltip", hasQuotaTypes)%>" 
877          enabled="<%=hasQuotaTypes%>"
878        />
879        <m:menuitem 
880          title="<%=common.getString("item.reportertype+")%>" 
881          url="<%=root+"admin/reportertypes/index.jsp?ID="+ID%>" 
882          tooltip="<%=menu.getString("reportertypes.tooltip", hasReporterTypes)%>" 
883          enabled="<%=hasReporterTypes%>"
884        />
885        <m:menuitem 
886          title="<%=common.getString("item.extravaluetype+")%>" 
887          url="<%=root+"admin/extravaluetypes/index.jsp?ID="+ID%>" 
888          tooltip="<%=menu.getString("extravaluetypes.tooltip", hasExtraValueTypes)%>" 
889          enabled="<%=hasExtraValueTypes%>"
890        />
891        <m:menuseparator />
892        <m:menuitem 
893          title="<%=menu.getString("units+quantities.title")%>" 
894          url="<%=root+"admin/quantities/index.jsp?ID="+ID%>" 
895          tooltip="<%=menu.getString("units+quantities.tooltip", hasQuantities)%>" 
896          enabled="<%=hasQuantities%>"
897        />
898      </m:menu>
899      <%
900    }
901    // Administrate -> Platforms menu
902    final boolean hasPlatforms = sc.hasPermission(Permission.READ, Item.PLATFORM);
903    final boolean hasFileSetMemberTypes = sc.hasPermission(Permission.READ, Item.DATAFILETYPE);
904    final boolean hasTopPlatforms = hasPlatforms || hasFileSetMemberTypes;
905    if (hasTopPlatforms)
906    {
907      %>
908      <m:menu 
909        id="menu.platforms"
910        style="display: none"
911        >
912        <m:menuitem 
913          title="<%=common.getString("item.platform+")%>"
914          url="<%=root+"admin/platforms/index.jsp?ID="+ID%>" 
915          tooltip="<%=menu.getString("platforms.tooltip", hasPlatforms)%>"
916          enabled="<%=hasPlatforms%>"
917        />
918        <m:menuitem 
919          title="<%=common.getString("item.datafiletype+")%>"
920          url="<%=root+"admin/datafiletypes/index.jsp?ID="+ID%>" 
921          tooltip="<%=menu.getString("datafiletypes.tooltip", hasFileSetMemberTypes)%>"
922          enabled="<%=hasFileSetMemberTypes%>"
923        />
924      </m:menu>
925      <%
926    }
927    // Plugins menu
928    final boolean hasPluginTypes = !sc.hasPermission(Permission.DENIED, Item.PLUGINTYPE);
929    final boolean hasPluginDefinitions = !sc.hasPermission(Permission.DENIED, Item.PLUGINDEFINITION);
930    final boolean hasPluginConfigurations = !sc.hasPermission(Permission.DENIED, Item.PLUGINCONFIGURATION);
931    final boolean hasJobAgents = sc.hasPermission(Permission.READ, Item.JOBAGENT);
932    final boolean hasPlugins = hasPluginTypes || hasPluginDefinitions || 
933      hasPluginConfigurations || hasJobAgents;
934   
935    if (hasPlugins)
936    {
937      %>
938      <m:menu 
939        id="menu.plugins" 
940        style="display: none"
941        >
942        <m:menuitem
943          title="<%=menu.getString("installedextensions.title")%>"
944          url="<%=root+"admin/extensions/index.jsp?ID="+ID%>"
945          tooltip="<%=menu.getString("installedextensions.tooltip")%>"
946        />
947        <m:menuseparator />
948        <m:menuitem 
949          title="<%=menu.getString("plugintypes.title")%>" 
950          url="<%=root+"admin/plugintypes/index.jsp?ID="+ID%>" 
951          tooltip="<%=menu.getString("plugintypes.tooltip", hasPluginTypes)%>"
952          enabled="<%=hasPluginTypes%>"
953        />
954        <m:menuitem 
955          title="<%=menu.getString("plugindefinitions.title")%>" 
956          url="<%=root+"admin/plugindefinitions/index.jsp?ID="+ID%>" 
957          tooltip="<%=menu.getString("plugindefinitions.tooltip", hasPluginDefinitions)%>"
958          enabled="<%=hasPluginDefinitions%>"
959        />
960        <m:menuitem 
961          title="<%=menu.getString("pluginconfigurations.title")%>" 
962          url="<%=root+"admin/pluginconfigurations/index.jsp?ID="+ID%>" 
963          tooltip="<%=menu.getString("pluginconfigurations.tooltip", hasPluginConfigurations)%>"
964          enabled="<%=hasPluginConfigurations%>"
965        />
966        <m:menuseparator />
967        <m:menuitem 
968          title="<%=common.getString("item.jobagent+")%>" 
969          url="<%=root+"admin/jobagents/index.jsp?ID="+ID%>" 
970          tooltip="<%=menu.getString("jobagents.tooltip", hasJobAgents)%>"
971          enabled="<%=hasJobAgents%>"
972        />
973      </m:menu>
974      <%
975    }
976    // Administrate menu
977    final boolean hasUsers = !sc.hasPermission(Permission.DENIED, Item.USER);
978    final boolean hasGroups = !sc.hasPermission(Permission.DENIED, Item.GROUP);
979    final boolean hasRoles = sc.hasPermission(Permission.READ, Item.ROLE);
980    final boolean hasQuota = sc.hasPermission(Permission.READ, Item.QUOTA);
981    final boolean hasSoftware = !sc.hasPermission(Permission.DENIED, Item.SOFTWARE);
982    final boolean hasHardware = !sc.hasPermission(Permission.DENIED, Item.HARDWARE);
983    final boolean hasProtocols = !sc.hasPermission(Permission.DENIED, Item.PROTOCOL);
984    final boolean hasClients = sc.hasPermission(Permission.READ, Item.CLIENT);
985    final boolean hasNews = sc.hasPermission(Permission.READ, Item.NEWS);
986    final boolean hasReporterCloneTemplates = !sc.hasPermission(Permission.DENIED, Item.REPORTERCLONETEMPLATE);
987    final boolean hasDiskUsage = sc.hasPermission(Permission.READ, Item.DISKUSAGE);
988    final Client currentClient = Client.getById(dc, sc.getClientId());
989    final boolean hasServer = currentClient.hasPermission(Permission.WRITE);
990
991    final boolean hasAdministrate = 
992      hasUsers || hasGroups || hasRoles || hasQuota || hasTypes || hasPlugins ||
993      hasSoftware || hasHardware || hasProtocols || hasClients || hasNews || hasReporterCloneTemplates || 
994      hasDiskUsage || hasServer || hasTopPlatforms;
995
996    if (hasAdministrate)
997    {
998      %>
999      <m:menu 
1000        id="menu.administrate" 
1001        style="display: none"
1002        >
1003        <m:menuitem 
1004          title="<%=common.getString("item.user+")%>" 
1005          url="<%=root+"admin/users/index.jsp?ID="+ID%>" 
1006          tooltip="<%=menu.getString("users.tooltip", hasUsers)%>"
1007          enabled="<%=hasUsers%>"
1008        />
1009        <m:menuitem 
1010          title="<%=common.getString("item.group+")%>" 
1011          url="<%=root+"admin/groups/index.jsp?ID="+ID%>" 
1012          tooltip="<%=menu.getString("groups.tooltip", hasGroups)%>" 
1013          enabled="<%=hasGroups%>"
1014        />
1015        <m:menuitem 
1016          title="<%=common.getString("item.role+")%>" 
1017          url="<%=root+"admin/roles/index.jsp?ID="+ID%>" 
1018          tooltip="<%=menu.getString("roles.tooltip", hasRoles)%>" 
1019          enabled="<%=hasRoles%>"
1020        />
1021        <m:menuseparator />
1022        <m:submenu 
1023          subid="menu.plugins" 
1024          title="<%=menu.getString("menu.plugins")%>"
1025          tooltip="<%=menu.getString("menu.plugins.tooltip")%>"
1026          enabled="<%=hasPlugins%>"
1027        />
1028        <m:menuseparator />
1029        <m:menuitem 
1030          title="<%=common.getString("item.quota+")%>" 
1031          url="<%=root+"admin/quota/index.jsp?ID="+ID%>" 
1032          tooltip="<%=menu.getString("quota.tooltip", hasQuota)%>" 
1033          enabled="<%=hasQuota%>"
1034        />
1035        <m:menuitem 
1036          title="<%=common.getString("item.software+")%>" 
1037          url="<%=root+"admin/software/index.jsp?ID="+ID%>" 
1038          tooltip="<%=menu.getString("software.tooltip", hasSoftware)%>" 
1039          enabled="<%=hasSoftware%>"
1040        />
1041        <m:menuitem 
1042          title="<%=common.getString("item.hardware+")%>" 
1043          url="<%=root+"admin/hardware/index.jsp?ID="+ID%>" 
1044          tooltip="<%=menu.getString("hardware.tooltip", hasHardware)%>" 
1045          enabled="<%=hasHardware%>"
1046        />
1047        <m:menuitem 
1048          title="<%=common.getString("item.protocol+")%>" 
1049          url="<%=root+"admin/protocols/index.jsp?ID="+ID%>" 
1050          tooltip="<%=menu.getString("protocols.tooltip", hasProtocols)%>" 
1051          enabled="<%=hasProtocols%>"
1052        />
1053        <m:menuitem 
1054          title="<%=common.getString("item.client+")%>" 
1055          url="<%=root+"admin/clients/index.jsp?ID="+ID%>" 
1056          tooltip="<%=menu.getString("clients.tooltip", hasClients)%>" 
1057          enabled="<%=hasClients%>"
1058        />
1059        <m:menuitem 
1060          title="<%=common.getString("item.news+")%>" 
1061          url="<%=root+"admin/news/index.jsp?ID="+ID%>" 
1062          tooltip="<%=menu.getString("news.tooltip", hasNews)%>" 
1063          enabled="<%=hasNews%>"
1064        />
1065        <m:menuitem 
1066          title="<%=common.getString("item.reporterclonetemplate+")%>" 
1067          url="<%=root+"admin/reporterclonetemplates/index.jsp?ID="+ID%>" 
1068          tooltip="<%=menu.getString("reporterclonetemplates.tooltip", hasReporterCloneTemplates)%>" 
1069          enabled="<%=hasReporterCloneTemplates%>"
1070        />
1071        <m:menuseparator />
1072        <m:submenu 
1073          subid="menu.platforms" 
1074          title="<%=menu.getString("menu.platforms")%>"
1075          tooltip="<%=menu.getString("menu.platforms.tooltip")%>"
1076          enabled="<%=hasTopPlatforms%>"
1077        />
1078        <m:submenu 
1079          subid="menu.types" 
1080          title="<%=menu.getString("menu.types")%>"
1081          tooltip="<%=menu.getString("menu.types.tooltip")%>"
1082          enabled="<%=hasTypes%>"
1083        />
1084        <m:menuseparator />
1085        <m:menuitem 
1086          title="<%=common.getString("item.diskusage+")%>" 
1087          url="<%=root+"admin/diskusage/index.jsp?ID="+ID%>" 
1088          tooltip="<%=menu.getString("diskusage.tooltip", hasDiskUsage)%>" 
1089          enabled="<%=hasDiskUsage%>"
1090        />
1091        <m:menuitem 
1092          title="<%=menu.getString("serversettings.title")+"…"%>"
1093          url="<%=root+"admin/server/configure.jsp?ID="+ID%>"
1094          data-popup="ServerSettings, 600, 400"
1095          tooltip="<%=menu.getString("serversettings.tooltip", hasServer)%>"
1096          enabled="<%=hasServer%>"
1097        />
1098        <m:menuitem 
1099          title="<%=menu.getString("broadcast.title")+"…"%>"
1100          url="<%=root+"admin/server/broadcast.jsp?ID="+ID%>"
1101          data-popup="BroadcastMessage, 600, 400"
1102          tooltip="<%=menu.getString("broadcast.tooltip", hasServer)%>"
1103          enabled="<%=hasServer%>"
1104        />
1105        <m:menuitem
1106          title="<%=menu.getString("services.title")%>"
1107          tooltip="<%=menu.getString("services.tooltip", hasServer)%>"
1108          url="<%=root+"admin/services/index.jsp?ID="+ID%>"
1109          enabled="<%=hasServer%>"
1110        />
1111      </m:menu>
1112      <%
1113    }
1114    // Help menu
1115    final String helplink = Values.getStringOrNull(sc.getClientDefaultSetting("server.links.help"));
1116    final String faqlink = Values.getStringOrNull(sc.getClientDefaultSetting("server.links.faq"));
1117    final String reportbuglink = Values.getStringOrNull(sc.getClientDefaultSetting("server.links.reportbug"));
1118    %>
1119    <m:menu id="menu.help" style="display: none">
1120      <m:menuitem
1121        visible="<%=HTML.isValidUrl(helplink)%>"
1122        title="<%=menu.getString("menu.help") + "…"%>"
1123        url="<%=helplink%>"
1124        data-target="Help"
1125      />
1126      <m:menuitem
1127        visible="<%=HTML.isValidUrl(faqlink)%>"
1128        title="<%=menu.getString("faq.title") + "…"%>"
1129        url="<%=faqlink%>"
1130        data-target="FAQ"
1131        tooltip="<%=menu.getString("faq.tooltip") %>"
1132      />
1133      <m:menuseparator />
1134
1135      <m:menuitem
1136        title="<%=menu.getString("about.title") + "…"%>"
1137        url="<%=root+"info/about.jsp?ID="+ID+"&amp;page=about"%>"
1138        data-popup="About, 600, 400"
1139      />
1140      <m:menuitem
1141        title="<%=menu.getString("license.title") + "…"%>"
1142        url="<%=root+"info/about.jsp?ID="+ID+"&amp;page=license"%>"
1143        data-popup="About, 600, 400"
1144      />
1145      <m:menuitem
1146        visible="<%=HTML.isValidUrl(reportbuglink)%>"
1147        title="<%=menu.getString("bugreport.title") + "…"%>"
1148        url="<%=reportbuglink%>"
1149        data-target="ReportBug"
1150        tooltip="<%=menu.getString("bugreport.tooltip")%>"
1151      />
1152      <m:menuseparator />
1153      <m:menuitem
1154        title="<%=menu.getString("basesite.title") + "…"%>" 
1155        url="http://base.thep.lu.se"
1156        data-target="basesite"
1157        tooltip="<%=menu.getString("basesite.tooltip")%>"
1158      />
1159    </m:menu>
1160    <%
1161    //Switch user/logout menu
1162    final boolean hasImpersonate = 
1163      !sc.isImpersonated() && sc.hasSystemPermission(Permission.ACT_AS_ANOTHER_USER);
1164    %>
1165    <m:menu
1166      id="menu.switchuser"
1167      style="display: none;"
1168      >
1169      <m:menuitem 
1170        title="<%=menu.getString("switchuser.title") + "…"%>" 
1171        url="<%=root+"switch.jsp?ID="+ID%>"
1172        data-popup="Switch, 480, 320"
1173        tooltip="<%=menu.getString("switchuser.tooltip")%>" 
1174      />
1175      <m:menuitem 
1176        title="<%=menu.getString("impersonate.title") + "…"%>" 
1177        url="<%=root+"impersonate.jsp?ID="+ID%>"
1178        data-popup="Impersonate, 480, 320"
1179        tooltip="<%=menu.getString("impersonate.tooltip")%>" 
1180        visible="<%=hasImpersonate%>"
1181      />
1182      <m:menuitem 
1183        title="<%=menu.getString("logout.title") + "…"%>" 
1184        url="<%=root+"logout.jsp?ID="+ID%>"
1185        data-popup="Logout, 360, 240"
1186        tooltip="<%=menu.getString("logout.tooltip")%>" 
1187      />
1188    </m:menu>
1189    <%
1190    // Extensions menu
1191    JspContext jspContext = ExtensionsControl.createContext(dc, pageContext);
1192    ExtensionsInvoker<MenuItemAction> invoker = 
1193      (ExtensionsInvoker<MenuItemAction>)ExtensionsControl.useExtensions(jspContext, 
1194        "net.sf.basedb.clients.web.menu.extensions");
1195    ExtensionsControl ec = ExtensionsControl.get(dc);
1196    ActionIterator<MenuItemAction> it = invoker.iterate();
1197    Map<String, List<MenuItemAction>> menus = new HashMap<String, List<MenuItemAction>>();
1198    menus.put("extensions", new LinkedList<MenuItemAction>());
1199    int numExtensionMenues = 0;
1200    while (it.hasNext())
1201    {
1202      MenuItemAction action = it.next();
1203      String menuId = action.getMenuId();
1204      menuId = menuId == null ? "extensions" : "extensions." + menuId;
1205      List<MenuItemAction> actions = menus.get(menuId);
1206      if (actions == null)
1207      {
1208        actions = new LinkedList<MenuItemAction>();
1209        menus.put(menuId, actions);
1210      }
1211      actions.add(action);
1212    }
1213    for (Map.Entry<String, List<MenuItemAction>> entry : menus.entrySet())
1214    {
1215      String menuId = entry.getKey();
1216      List<MenuItemAction> actions = entry.getValue();
1217      if (actions.size() == 0) continue;
1218      %>
1219      <m:menu id="<%="menu."+menuId%>" style="display: none;">
1220      <%
1221      for (MenuItemAction action : actions)
1222      {
1223        numExtensionMenues++;
1224        Iterator<DynamicActionAttribute> dynamicAttributes = 
1225          action instanceof DynamicActionAttributes ?
1226            ((DynamicActionAttributes)action).getDynamicActionAttributes() : null;
1227        if (action.getType() == MenuItemAction.MenuType.SEPARATOR)
1228        {
1229          %>
1230          <m:menuseparator 
1231            id="<%=action.getId() %>"
1232            subclass="<%=action.getClazz() %>"
1233            style="<%=action.getStyle()%>" 
1234            visible="<%=action.isVisible()%>" 
1235            dynamic="<%=dynamicAttributes%>"
1236          />
1237          <%
1238        }
1239        else if (action.getType() == MenuItemAction.MenuType.MENUITEM)
1240        {
1241          %>
1242          <m:menuitem 
1243            id="<%=action.getId() %>"
1244            subclass="<%=action.getClazz() %>"
1245            style="<%=action.getStyle()%>"
1246            title="<%=action.getTitle()%>"
1247            icon="<%=action.getIcon()%>"
1248            tooltip="<%=action.getTooltip()%>"
1249            enabled="<%=action.isEnabled()%>"
1250            visible="<%=action.isVisible()%>"
1251            dynamic="<%=dynamicAttributes%>"
1252          />
1253          <%
1254        }
1255        else if (action.getType() == MenuItemAction.MenuType.SUBMENU)
1256        {
1257          %>
1258          <m:submenu 
1259            id="<%=action.getId() %>"
1260            subclass="<%=action.getClazz() %>"
1261            subid="<%="menu.extensions." + action.getSubmenuId()%>"
1262            style="<%=action.getStyle()%>"
1263            title="<%=action.getTitle()%>"
1264            icon="<%=action.getIcon()%>"
1265            tooltip="<%=action.getTooltip()%>"
1266            enabled="<%=action.isEnabled()%>"
1267            visible="<%=action.isVisible()%>"
1268            dynamic="<%=dynamicAttributes%>"
1269          />
1270          <%
1271        }
1272      }
1273      %>
1274      </m:menu>
1275      <%
1276    }
1277    // Main menu
1278    %>
1279    <ext:scripts context="<%=jspContext%>" />
1280    <ext:stylesheets context="<%=jspContext%>" />
1281    <m:menu
1282      type="horizontal"
1283      id="menubar"
1284      style="top: 0px; left: 0px; right: 0px;"
1285      open="click"
1286      filltext="<%=fillText.toString()%>"
1287      >
1288      <m:submenu
1289        subid="menu.base"
1290        title="<%=menu.getString("menu.base")%>"
1291      />
1292      <m:submenu
1293        subid="menu.view"
1294        title="<%=menu.getString("menu.view")%>"
1295      />
1296      <m:submenu 
1297        subid="menu.biolims"
1298        title="<%=menu.getString("menu.biolims")%>"
1299      />
1300      <m:submenu
1301        subid="menu.lims"
1302        title="<%=menu.getString("menu.arraylims")%>"
1303      />
1304      <m:submenu
1305        subid="menu.administrate"
1306        title="<%=menu.getString("menu.administrate")%>"
1307        visible="<%=hasAdministrate%>"
1308      />
1309      <m:submenu
1310        subid="menu.extensions"
1311        title="<%=menu.getString("menu.extensions")%>"
1312        visible="<%=numExtensionMenues > 0 %>"
1313      />
1314      <m:submenu
1315        subid="menu.help"
1316        title="<%=menu.getString("menu.help")%>"
1317      />
1318    </m:menu>
1319    <%
1320  }
1321  finally
1322  {
1323    if (dc != null) dc.close();
1324  }
1325
1326}
1327%>
1328
1329
Note: See TracBrowser for help on using the repository browser.