source: trunk/www/admin/jobagents/list_agents.jsp @ 3552

Last change on this file since 3552 was 3552, checked in by Martin Svensson, 16 years ago

References #375. Only wants to do a commit before the weekend.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 18.1 KB
Line 
1<%-- $Id: list_agents.jsp 3552 2007-07-06 14:53:14Z martin $
2  ------------------------------------------------------------------
3  Copyright (C) Authors contributing to this file.
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 2
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330,
21  Boston, MA  02111-1307, USA.
22  ------------------------------------------------------------------
23
24  @author Nicklas
25  @version 2.0
26--%>
27<%@ page session="false"
28  import="net.sf.basedb.core.SessionControl"
29  import="net.sf.basedb.core.DbControl"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.JobAgent"
32  import="net.sf.basedb.core.ItemQuery"
33  import="net.sf.basedb.core.Include"
34  import="net.sf.basedb.core.ItemResultIterator"
35  import="net.sf.basedb.core.ItemResultList"
36  import="net.sf.basedb.core.ItemContext"
37  import="net.sf.basedb.core.Nameable"
38  import="net.sf.basedb.core.Permission"
39  import="net.sf.basedb.core.PluginDefinition"
40  import="net.sf.basedb.core.Job"
41  import="net.sf.basedb.core.Type"
42  import="net.sf.basedb.core.query.Expressions"
43  import="net.sf.basedb.core.query.Restrictions"
44  import="net.sf.basedb.core.query.Orders"
45  import="net.sf.basedb.core.query.Hql"
46  import="net.sf.basedb.core.plugin.GuiContext"
47  import="net.sf.basedb.core.plugin.Plugin"
48  import="net.sf.basedb.util.Enumeration"
49  import="net.sf.basedb.util.ShareableUtil"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.PermissionUtil"
52  import="net.sf.basedb.clients.web.ModeInfo"
53  import="net.sf.basedb.clients.web.util.HTML"
54  import="net.sf.basedb.util.Values"
55  import="java.util.Iterator"
56  import="java.util.List"
57  import="java.util.Map"
58  import="java.util.Set"
59%>
60<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
61<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
62<%!
63  private static final Item itemType = Item.JOBAGENT;
64  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
65%>
66<%
67final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
68final String ID = sc.getId();
69final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
70final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
71
72final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
73final String callback = request.getParameter("callback");
74final String title = mode.generateTitle("job agent", "job agents");
75final DbControl dc = sc.newDbControl();
76ItemResultIterator<JobAgent> agents = null;
77try
78{
79  final ItemQuery<PluginDefinition> pluginQuery = PluginDefinition.getQuery();
80  pluginQuery.include(cc.getInclude());
81  pluginQuery.join(Hql.innerJoin("jobAgentSettings", Item.JOBAGENTSETTINGS.getAlias()));
82  pluginQuery.restrict(Restrictions.eq(Hql.property(Item.JOBAGENTSETTINGS.getAlias(), "jobAgent"), Expressions.parameter("agent")));
83  pluginQuery.order(Orders.asc(Hql.property("name")));
84 
85  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
86  try
87  {
88    final ItemQuery<JobAgent> query = Base.getConfiguredQuery(cc, true, JobAgent.getQuery(), mode);
89    agents = query.iterate(dc);
90  }
91  catch (Throwable t)
92  {
93    cc.setMessage(t.getMessage());
94  }
95  int numListed = 0;
96  %>
97  <base:page title="<%=title==null ? "Job agents" : title%>" type="<%=mode.getPageType()%>">
98  <base:head scripts="menu.js,table.js" styles="menu.css,table.css">
99    <script language="JavaScript">
100    var submitPage = 'index.jsp';
101    var formId = 'agents';
102    function newItem()
103    {
104      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', 0, true);
105    }
106    function editItem(itemId)
107    {
108      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
109    }
110    function viewItem(itemId)
111    {
112      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
113    }
114    function itemOnClick(evt, itemId)
115    {
116      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
117    }
118    function deleteItems()
119    {
120      var frm = document.forms[formId];
121      if (Forms.numChecked(frm) == 0)
122      {
123        alert('Please select at least one item in the list');
124        return;
125      }
126      frm.action = submitPage;
127      frm.cmd.value = 'DeleteItems';
128      frm.submit();
129    }
130    function restoreItems()
131    {
132      var frm = document.forms[formId];
133      if (Forms.numChecked(frm) == 0)
134      {
135        alert('Please select at least one item in the list');
136        return;
137      }
138      frm.action = submitPage;
139      frm.cmd.value = 'RestoreItems';
140      frm.submit();
141    }
142    function takeOwnership()
143    {
144      var frm = document.forms[formId];
145      if (Forms.numChecked(frm) == 0)
146      {
147        alert('Please select at least one item in the list');
148        return;
149      }
150      if (confirm('Are you sure that you want to take ownership of the selected items? It can\'t be undone.'))
151      {
152        frm.action = submitPage;
153        frm.cmd.value = 'TakeOwnershipOfItems';
154        frm.submit();
155      }
156    }
157    function shareItem(itemId)
158    {
159      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id='+itemId, 'ShareAgents', 500, 400);
160    }
161    function shareItems()
162    {
163      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems');
164    }
165    function configureColumns()
166    {
167      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
168    }
169    function runPlugin(cmd)
170    {
171      Table.submitToPopup(formId, cmd, 740, 540);
172    }
173    function returnSelected()
174    {
175      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
176      window.close();
177    }
178    function presetOnChange()
179    {
180      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
181    }
182    function controlJobAgents(cmd)
183    {
184      var frm = document.forms[formId];
185      if (Forms.numChecked(frm) == 0)
186      {
187        alert('Please select at least one item in the list');
188        return;
189      }
190      frm.action = submitPage;
191      frm.cmd.value = cmd;
192      frm.submit();
193    }
194    </script>
195  </base:head>
196 
197  <base:body>
198    <%
199    if (cc.getMessage() != null)
200    {
201      %>
202      <div class="error"><%=cc.getMessage()%></div>
203      <%
204      cc.setMessage(null);
205    }
206    %>
207    <tbl:table 
208      id="agents" 
209      clazz="itemlist" 
210      columns="<%=cc.getSetting("columns")%>"
211      sortby="<%=cc.getSortProperty()%>" 
212      direction="<%=cc.getSortDirection()%>"
213      title="<%=title%>"
214      action="index.jsp"
215      sc="<%=sc%>"
216      item="<%=itemType%>"
217      >
218      <tbl:hidden 
219        name="mode" 
220        value="<%=mode.getName()%>" 
221      />
222      <tbl:hidden 
223        name="callback" 
224        value="<%=callback%>" 
225        skip="<%=callback == null%>" 
226      />
227      <tbl:columndef 
228        id="name"
229        property="name"
230        datatype="string"
231        title="Name"
232        sortable="true" 
233        filterable="true"
234        exportable="true"
235        show="always" 
236      />
237      <tbl:columndef 
238        id="externalId"
239        property="externalId"
240        datatype="string"
241        title="External ID"
242        sortable="true"
243        filterable="true"
244        exportable="true"
245      />
246      <tbl:columndef 
247        id="server"
248        property="server"
249        datatype="string"
250        title="Server"
251        sortable="true"
252        filterable="true"
253        exportable="true"
254      />
255      <tbl:columndef 
256        id="port"
257        property="port"
258        datatype="int"
259        title="Port"
260        sortable="true"
261        filterable="true"
262        exportable="true"
263      />
264      <tbl:columndef
265        id="status"
266        title="Status"
267      />
268      <tbl:columndef
269        id="info"
270        title="CPU/Memory"
271      />
272      <tbl:columndef 
273        id="owner"
274        property="owner.name"
275        datatype="string"
276        title="Owner"
277        sortable="true" 
278        filterable="true"
279        exportable="true"
280      />
281      <tbl:columndef 
282        id="description"
283        property="description"
284        datatype="string"
285        title="Description" 
286        sortable="true" 
287        filterable="true" 
288        exportable="true"
289      />
290      <tbl:columndef
291        id="jobs"
292        title="Jobs"
293      />
294      <tbl:columndef
295        id="plugins"
296        title="Plugins"
297      />
298      <tbl:columndef
299        id="permission"
300        title="Permission"
301      />
302      <tbl:columndef 
303        id="sharedTo"
304        title="Shared to"
305      />
306      <tbl:toolbar
307        visible="<%=mode.hasToolbar()%>"
308        >
309        <tbl:button 
310          disabled="<%=createPermission ? false : true%>" 
311          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
312          onclick="newItem()" 
313          title="New&hellip;" 
314          tooltip="<%=createPermission ? "Create new job agent" : "You do not have permission to create job agents"%>" 
315        />
316        <tbl:button 
317          image="delete.gif"
318          onclick="deleteItems()" 
319          title="Delete" 
320          tooltip="Delete the selected items" 
321        />
322        <tbl:button 
323          image="restore.gif"
324          onclick="restoreItems()" 
325          title="Restore" 
326          tooltip="Restore the selected (deleted) items"
327        />
328        <tbl:button 
329          image="share.gif"
330          onclick="shareItems()" 
331          title="Share&hellip;" 
332          tooltip="Share the selected items"
333        />
334        <tbl:button 
335          image="take_ownership.png"
336          onclick="takeOwnership()" 
337          title="Take ownership&hellip;"
338          tooltip="Take ownership of the selected items"
339        />
340        <tbl:button 
341          image="columns.gif" 
342          onclick="configureColumns()" 
343          title="Columns&hellip;" 
344          tooltip="Show, hide and re-order columns" 
345        />
346        <tbl:button 
347          image="import.gif" 
348          onclick="runPlugin('ImportItems')" 
349          title="Import&hellip;" 
350          tooltip="Import data" 
351          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
352        />
353        <tbl:button 
354          image="export.gif" 
355          onclick="runPlugin('ExportItems')" 
356          title="Export&hellip;" 
357          tooltip="Export data" 
358          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
359        />
360        <tbl:button 
361          image="runplugin.gif" 
362          onclick="runPlugin('RunListPlugin')" 
363          title="Run plugin&hellip;" 
364          tooltip="Run a plugin" 
365          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
366        />
367        <tbl:button
368          image="pause.png"
369          onclick="controlJobAgents('PauseSelected')"
370          title="Pause"
371          tooltip="Pause the selected job agents"
372        />
373        <tbl:button
374          image="start.png"
375          onclick="controlJobAgents('StartSelected')"
376          title="Start"
377          tooltip="Start the selected job agents"
378        />
379      </tbl:toolbar>
380      <tbl:navigator
381        page="<%=cc.getPage()%>" 
382        rowsperpage="<%=cc.getRowsPerPage()%>" 
383        totalrows="<%=agents == null ? 0 : agents.getTotalCount()%>" 
384        visible="<%=mode.hasNavigator()%>"
385      />
386      <tbl:data>
387        <tbl:columns>
388        <tbl:presetselector 
389          clazz="columnheader"
390          colspan="3"
391          onchange="presetOnChange()"
392        />
393        </tbl:columns>
394
395        <tr>
396          <tbl:header 
397            clazz="index"
398            >&nbsp;</tbl:header>
399          <tbl:header 
400            clazz="check" 
401            visible="<%=mode.hasCheck()%>"
402            ><base:icon 
403              image="check_uncheck.gif" 
404              tooltip="Check/uncheck all" 
405              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
406            /></tbl:header>
407          <tbl:header 
408            clazz="check" 
409            visible="<%=mode.hasRadio()%>"
410            >&nbsp;</tbl:header>
411          <tbl:header 
412            clazz="icons" 
413            visible="<%=mode.hasIcons()%>"
414            >&nbsp;</tbl:header>
415          <tbl:propertyfilter />
416        </tr>
417         
418          <tbl:rows>
419          <%
420          int index = cc.getPage()*cc.getRowsPerPage();
421          int selectedItemId = cc.getId();
422          if (agents != null)
423          {           
424            while (agents.hasNext())
425            {
426              JobAgent item = agents.next();
427              int itemId = item.getId();
428              String openSharePopup = "shareItem("+itemId+")";
429              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
430              boolean writePermission = item.hasPermission(Permission.WRITE);
431              String name = HTML.encodeTags(item.getName());
432              String tooltip = mode.isSelectionMode() ? 
433                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
434              index++;
435              numListed++;
436              %>
437              <tbl:row>
438                <tbl:header 
439                  clazz="index"
440                  ><%=index%></tbl:header>
441                <tbl:header 
442                  clazz="check" 
443                  visible="<%=mode.hasCheck()%>"
444                  ><input 
445                    type="checkbox" 
446                    name="<%=itemId%>" 
447                    value="<%=itemId%>" 
448                    title="<%=name%>" 
449                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
450                  ></tbl:header>
451                <tbl:header 
452                  clazz="check" 
453                  visible="<%=mode.hasRadio()%>"
454                  ><input 
455                    type="radio" 
456                    name="item_id" 
457                    value="<%=itemId%>" 
458                    title="<%=name%>" 
459                    <%=selectedItemId == itemId ? "checked" : ""%>
460                  ></tbl:header>
461                <tbl:header 
462                  clazz="icons" 
463                  visible="<%=mode.hasIcons()%>"
464                  ><base:icon 
465                    image="deleted.gif" 
466                    tooltip="This item has been scheduled for deletion" 
467                    visible="<%=item.isRemoved()%>"
468                  /><base:icon 
469                    image="<%=sharePermission ? "shared.gif" : "shared_disabled.gif"%>" 
470                    onclick="<%=sharePermission ? openSharePopup : null%>"
471                    tooltip="This item is shared to other users, groups and/or projects" 
472                    visible="<%=item.isShared()%>"
473                  />&nbsp;</tbl:header>
474                <tbl:cell column="name"><div class="link" 
475                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
476                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
477                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>
478                <tbl:cell column="server"><%=HTML.encodeTags(item.getServer())%></tbl:cell>
479                <tbl:cell column="port"><%=item.getPort() == null ? "" : item.getPort().toString()%></tbl:cell>
480                <tbl:cell column="status">
481                  <%
482                  Boolean paused = item.getInfo().isPaused();
483                  %>
484                  <%=paused == null ? "<i>- unknown -</i>" : paused == true ? "Paused" : "Running"%>
485                </tbl:cell>
486                <tbl:cell column="info">
487                  CPU usage: <%=item.getCpuUsage() == null ? "<i>- unknown -</i>" : item.getCpuUsage()+"%" %><br>
488                  Total memory: <%=item.getTotalMemory() == null ? "<i>- unknown -</i>" : Values.formatBytes(item.getTotalMemory()) %><br>
489                  Used memory: <%=item.getUsedMemory() == null ? "<i>- unknown -</i>" : Values.formatBytes(item.getUsedMemory()) %>
490                </tbl:cell>
491                <tbl:cell column="jobs">
492                  <%
493                  Set<Integer> jobs = item.getInfo().getJobs();
494                  if (jobs == null || jobs.size() == 0)
495                  {
496                    %>
497                    <i>- none -</i>
498                    <%
499                  }
500                  else
501                  {
502                    String separator = "";
503                    for (int jobId : jobs)
504                    {
505                      try
506                      {
507                        Job job = Job.getById(dc, jobId);
508                        out.write(separator);
509                        if (mode.hasPropertyLink())
510                        {
511                          out.write(Base.getLinkedName(ID, job, false, mode.hasEditLink()) + 
512                            " (" + job.getPercentComplete() + "%)");
513                        }
514                        else
515                        {
516                          out.write(HTML.encodeTags(job.getName()) + 
517                            " (" + job.getPercentComplete() + "%)");
518                        }
519                        separator = ", ";
520                      }
521                      catch (Throwable t)
522                      {
523                        %>
524                        <div class="error"><%=t.getMessage()%></div>
525                        <%
526                      }
527                    }
528                  }
529                  %>
530                </tbl:cell>
531                <tbl:cell column="plugins">
532                  <%
533                  pluginQuery.setParameter("agent", itemId, Type.INT);
534                  try
535                  {
536                    String separator = "";
537                    for (PluginDefinition p : pluginQuery.list(dc))
538                    {
539                      out.write(separator);
540                      if (mode.hasPropertyLink())
541                      {
542                        out.write(Base.getLink(ID, p.getName(), Item.PLUGINDEFINITION, p.getId(), mode.hasEditLink()));
543                      }
544                      else
545                      {
546                        out.write(HTML.encodeTags(p.getName()));
547                      }
548                      separator = ", ";
549                    }
550                  }
551                  catch (Throwable t)
552                  {
553                    %>
554                    <div class="error"><%=t.getMessage()%></div>
555                    <%
556                  }
557                  %>
558                </tbl:cell>
559                <tbl:cell column="owner"
560                  ><base:propertyvalue 
561                    item="<%=item%>" 
562                    property="owner"
563                    enableEditLink="<%=mode.hasEditLink()%>" 
564                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
565                  /></tbl:cell>
566                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
567                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
568                <tbl:cell column="sharedTo">
569                  <%
570                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
571                  while(sharees.hasNext())
572                  {
573                    Nameable n = sharees.next();
574                    if (mode.hasPropertyLink())
575                    {
576                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
577                    }
578                    else
579                    {
580                      out.write(HTML.encodeTags(n.getName()));
581                    }
582                    out.write(sharees.hasNext() ? ", " : "");
583                  }
584                  %>
585                </tbl:cell>
586              </tbl:row>
587              <%
588              }
589            }
590          %>
591          </tbl:rows>
592      </tbl:data>
593      <%
594      if (numListed == 0)
595      {
596        %>
597        <tbl:panel><%=agents == null || agents.getTotalCount() == 0 ? "No job agents were found" : "No job agents on this page. Please select another page!" %></tbl:panel>
598        <%
599      }
600      else
601      {
602        %>
603        <tbl:navigator
604          page="<%=cc.getPage()%>" 
605          rowsperpage="<%=cc.getRowsPerPage()%>" 
606          totalrows="<%=agents == null ? 0 : agents.getTotalCount()%>" 
607          visible="<%=mode.hasNavigator()%>"
608          locked="true"
609        />
610        <%
611      }
612      %>
613    </tbl:table>
614    <base:buttongroup align="center" clazz="fixedatbottom">
615      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
616      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
617      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
618    </base:buttongroup>
619    <br><br><br>
620  </base:body>
621  </base:page>
622  <%
623}
624finally
625{
626  if (agents != null) agents.close();
627  if (dc != null) dc.close();
628}
629%>
Note: See TracBrowser for help on using the repository browser.