source: trunk/www/admin/plugindefinitions/edit_plugin.jsp @ 5905

Last change on this file since 5905 was 5905, checked in by Nicklas Nordborg, 10 years ago

References #1655: GUI improvements

  • Use relative font sizes (em and %) instead of pixel values. This should make it possible to use relative values for everything and we don't have to split up into size_*.css


  • Removed "valign" attribute from lots of tables.


  • Removed "wrap" attribute from lots of texarea fields.


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 34.6 KB
Line 
1<%-- $Id: edit_plugin.jsp 5905 2011-12-12 08:42:09Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
5  Copyright (C) 2007 Johan Enell, 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
25  @author Nicklas
26  @version 2.0
27--%>
28<%@ page pageEncoding="UTF-8" session="false"
29  import="net.sf.basedb.core.SessionControl"
30  import="net.sf.basedb.core.DbControl"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.Include"
34  import="net.sf.basedb.core.Permission"
35  import="net.sf.basedb.core.PluginDefinition"
36  import="net.sf.basedb.core.ItemQuery"
37  import="net.sf.basedb.core.ItemResultList"
38  import="net.sf.basedb.core.JobAgent"
39  import="net.sf.basedb.core.JobAgentSettings"
40  import="net.sf.basedb.core.BaseException"
41  import="net.sf.basedb.core.PermissionDeniedException"
42  import="net.sf.basedb.core.RoleKey"
43  import="net.sf.basedb.core.SystemItems"
44  import="net.sf.basedb.core.plugin.Plugin"
45  import="net.sf.basedb.core.plugin.Permissions"
46  import="net.sf.basedb.core.query.Restrictions"
47  import="net.sf.basedb.core.query.Orders"
48  import="net.sf.basedb.core.query.Hql"
49  import="net.sf.basedb.clients.web.Base"
50  import="net.sf.basedb.clients.web.util.HTML"
51  import="net.sf.basedb.clients.web.PermissionUtil"
52  import="net.sf.basedb.util.Values"
53  import="net.sf.basedb.core.plugin.GuiContext"
54  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
55  import="net.sf.basedb.clients.web.extensions.JspContext"
56  import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
57  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
58  import="java.util.EnumSet"
59  import="java.util.Set"
60  import="java.util.Map"
61  import="java.util.List"
62  import="java.util.Collection"
63%>
64<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
65<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
66<%!
67private static final int DENY_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.DENIED));
68private static final int CREATE_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.CREATE));
69private static final int READ_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.READ));
70private static final int USE_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.USE));
71private static final int WRITE_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.WRITE));
72private static final int DELETE_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.DELETE));
73private static final int SET_OWNER_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.SET_OWNER));
74private static final int SET_PERMISSION_CODE = PermissionUtil.getPermissionCode(EnumSet.of(Permission.SET_PERMISSION));
75
76private String getOption(DbControl dc, PluginDefinition plugin, Item itemType)
77  throws BaseException
78{
79  int keyId = SystemItems.getRoleKeyId(itemType);
80  if (keyId == 0) return "";
81
82  RoleKey key = RoleKey.getById(dc, keyId); 
83  StringBuilder sb = new StringBuilder();
84  sb.append("<option value=\"").append(key.getItemType().name()).append("\">");
85  sb.append(HTML.encodeTags(key.getName()));
86  sb.append(" []");
87  return sb.toString();
88}
89private void appendPermissionLetter(StringBuilder sb, Permission p, String letter, 
90  Set<Permission> defined, Set<Permission> always, Set<Permission> maybe)
91{
92  if (defined != null && defined.contains(p))
93  {
94    if (always != null && always.contains(p))
95    {
96      sb.append(letter.toUpperCase());
97    }
98    else if (maybe != null && maybe.contains(p))
99    {
100      sb.append(letter.toLowerCase());
101    }
102    else
103    {
104      sb.append("-");
105    }
106  }
107}
108%>
109<%
110final Item itemType = Item.PLUGINDEFINITION;
111final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
112final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
113final int itemId = cc.getId();
114final String ID = sc.getId();
115final float scale = Base.getScale(sc);
116final DbControl dc = sc.newDbControl();
117try
118{
119  String title = null;
120  PluginDefinition plugin = null;
121  boolean isTrusted = true;
122  Boolean allowImmediateExecution = null;
123  boolean usePermissions = false;
124  Collection<Permissions> requestedPermissions = null;
125  String warning = null;
126 
127  final int selectedAgentId = Values.getInt(request.getParameter("jobagent_id"), -1);
128
129  // Query to retrieve job agents
130  ItemQuery<JobAgent> agentQuery = null;
131
132  // Query to retrieve role keys
133  final ItemQuery<RoleKey> roleKeyQuery = RoleKey.getQuery();
134  roleKeyQuery.order(Orders.asc(Hql.property("name")));
135 
136  if (itemId == 0)
137  {
138    title = "Create plugin";
139    cc.removeObject("item");
140    String tt = cc.getPropertyValue("trusted");
141    String up = cc.getPropertyValue("usePermissions");
142    String aie = cc.getPropertyValue("allowImmediateExection");
143    isTrusted = tt == null ? isTrusted : Values.getBoolean(tt);
144    usePermissions = up == null ? usePermissions : Values.getBoolean(up);
145    allowImmediateExecution = aie == null ? null : Values.getBoolean(aie);
146  }
147  else
148  {
149    plugin = PluginDefinition.getById(dc, itemId);
150    cc.setObject("item", plugin);
151    title = "Edit plugin -- " + HTML.encodeTags(plugin.getName());
152    plugin.checkPermission(Permission.WRITE);
153    isTrusted = plugin.isTrusted();
154    usePermissions = plugin.getUsePermissions();
155    allowImmediateExecution = plugin.getAllowImmediateExecution();
156
157    agentQuery = JobAgent.getQuery();
158    agentQuery.include(Include.ALL);
159    agentQuery.order(Orders.asc(Hql.property("name")));
160    agentQuery.join(Hql.innerJoin("plugins", "p"));
161    agentQuery.restrict(Restrictions.eq(Hql.property("p", "pluginDefinition"), Hql.entity(plugin)));
162
163    try
164    {
165      Plugin thePlugin = plugin.newInstance(Plugin.class, sc, null, null);
166      requestedPermissions = thePlugin.getPermissions();
167    }
168    catch (BaseException ex)
169    {
170      warning = ex.getMessage();
171    }
172  }
173 
174  final String clazz = "class=\"text\"";
175  final String requiredClazz = "class=\"text required\"";
176  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), plugin);
177  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
178  %>
179  <base:page type="popup" title="<%=title%>">
180  <base:head scripts="tabcontrol.js,annotations.js,linkitems.js" styles="tabcontrol.css">
181    <ext:scripts context="<%=jspContext%>" />
182    <ext:stylesheets context="<%=jspContext%>" />
183    <script language="JavaScript">
184    // Validate the "Plugin" tab
185    function validatePlugin()
186    {
187      var frm = document.forms['plugin'];
188      if (Main.trimString(frm.className.value) == '')
189      {
190        alert("You must enter a class name");
191        frm.className.focus();
192        return false;
193      }
194      return true;
195    }
196
197    // Submit the form
198    function saveSettings()
199    {
200      var frm = document.forms['plugin'];
201      if (TabControl.validateActiveTab('settings'))
202      {
203        var agents = Link.getListIds(frm.agents, 'A');
204        for (var i = 0; i < agents.length; i++)
205        {
206          var agentId = agents[i];
207          var settings = getAgentSettings(agentId);
208          if (settings)
209          {
210            if (!settings.useDefaultJarPath)
211            {
212              Forms.createHidden(frm, 'jarPath.'+agentId, settings.jarPath);
213            }
214            if (!settings.useDefaultMaxMemory)
215            {
216              Forms.createHidden(frm, 'maxMemory.'+agentId, settings.maxMemory);
217            }
218            if (!settings.useDefaultTrusted)
219            {
220              Forms.createHidden(frm, 'trusted.'+agentId, settings.trusted);
221            }
222            Forms.createHidden(frm, 'priorityBoost.'+agentId, settings.priorityBoost);
223          }
224        }
225       
226        frm.allAgents.value = agents.join(',');
227        frm.removeAgents.value = Link.getActionIds(-1, 'A').join(',');
228        if (annotationsLoaded) 
229        {
230          Annotations.addModifiedAnnotationsToForm(frames.annotations, frm);
231        }
232        frm.submit();
233      }
234    }
235   
236    var annotationsLoaded = false;
237    function switchTab(tabControlId, tabId)
238    {
239      if (TabControl.setActiveTab(tabControlId, tabId))
240      {
241        if (tabId == 'annotations' && !annotationsLoaded)
242        {
243          Annotations.loadAnnotateFrame(frames.annotations, '<%=ID%>', '<%=itemType.name()%>', <%=itemId%>);
244          annotationsLoaded = true;
245        }
246      }
247    }
248   
249    function addAgentsOnClick()
250    {
251      var agents = Link.getListIds(document.forms['plugin'].agents, 'A');
252      var url = '../jobagents/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addAgentCallback';
253      url += '&exclude='+agents.join(',');
254      Main.openPopup(url, 'AddAgents', 1000, 700);
255    }
256    function addAgentCallback(agentId, name)
257    {
258      var item = Link.getItem('A', agentId);
259      if (!item) 
260      {
261        item = new Item('A', agentId, name);
262        new AgentSetting(agentId, '', '', '', '0');
263      }
264      var numBefore = document.forms['plugin'].agents.length;
265      Link.addItem(document.forms['plugin'].agents, item);
266      var numAfter = document.forms['plugin'].agents.length;
267      if (numBefore == 0 && numAfter > 0)
268      {
269        document.forms['plugin'].use_internal_jobqueue.checked = false;
270      }
271      agentsOnClick();
272    }
273
274    function removeOnClick()
275    {
276      Link.removeSelected(document.forms['plugin'].agents);
277      Main.hide('agentsettings');
278    }
279   
280   
281    function init()
282    {
283      <%
284      if (plugin == null)
285      {
286        %>
287        var frm = document.forms['plugin'];
288        frm.className.focus();
289        frm.className.select();
290        <%
291      }
292      %>
293      initAgents();
294      <%
295      if (selectedAgentId != -1)
296      {
297        %>
298        selectAgent(<%=selectedAgentId%>);
299        <%
300      }
301      %>
302      initPermissions();
303    }
304    function initAgents()
305    {
306      var agents = document.forms['plugin'].agents;
307      Link.addNewSection(agents, new Section('A', 'Job agents'));
308      <%
309      if (agentQuery != null)
310      {
311        ItemResultList<JobAgent> agents = agentQuery.list(dc);
312        for (JobAgent agent : agents)
313        {
314          // Agent specific settings
315          JobAgentSettings settings = agent.getSettings(plugin, false);
316          Boolean trusted = null;
317          Long maxMemory = null;
318          int priorityBoost = 0;
319          if (settings != null)
320          {
321            trusted = settings.isTrusted();
322            maxMemory = settings.getMaxMemory();
323            priorityBoost = settings.getPriorityBoost();
324            %>
325            Link.addNewItem(agents, new Item('A', <%=agent.getId()%>, '<%=HTML.javaScriptEncode(agent.getName())%>'));
326            <%
327          }
328          %>
329          new AgentSetting(<%=agent.getId()%>, '<%=trusted == null ? "" : trusted ? "1" : "0"%>', '<%=Values.formatBytes(maxMemory)%>', '<%=priorityBoost%>');
330          <%
331        }
332      }
333      %>
334    }
335   
336    function selectAgent(agentId)
337    {
338      var frm = document.forms['plugin'];
339      for (var i = 0; i < frm.agents.length; i++)
340      {
341        if (frm.agents[i].item.id == agentId)
342        {
343          frm.agents.selectedIndex = i;
344          agentsOnClick();
345          return;
346        }
347      }
348    }
349
350    function getAgentSettings(agentId)
351    {
352      return allAgentSettings['A'+agentId];
353    }
354    var allAgentSettings = new Array();
355    function AgentSetting(agentId, trusted, maxMemory, priorityBoost)
356    {
357      this.agentId = agentId;
358      this.trusted = trusted;
359      this.useDefaultTrusted = trusted != null;
360      this.maxMemory = maxMemory;
361      this.useDefaultMaxMemory = (maxMemory == '');
362      this.priorityBoost = priorityBoost;
363      allAgentSettings['A'+agentId] = this;
364    }
365   
366    var selectedAgentId;
367    function agentsOnClick()
368    {
369      var frm = document.forms['plugin'];
370      var agentId = frm.agents[frm.agents.selectedIndex].item.id;
371      var settings = getAgentSettings(agentId);
372      if (settings)
373      {
374        Main.show('agentsettings');
375        selectedAgentId = agentId;
376       
377        // Set max memory
378        frm.useDefaultMaxMemory.checked = settings.useDefaultMaxMemory;
379        useDefaultMaxMemoryOnClick();
380        var defaultMaxMemory = document.getElementById("defaultMaxMemory");
381        defaultMaxMemory.innerHTML = frm.maxMemory.value == '' ? 'not specified' : frm.maxMemory.value;
382       
383        // Set trusted
384        Forms.checkRadio(frm.agentTrusted, settings.trusted);
385        var defaultTrusted = document.getElementById("defaultTrusted");
386        defaultTrusted.innerHTML = Forms.getCheckedRadio(frm.trusted).value == '0' ? 'no' : 'yes';
387
388        // Set priority boost
389        frm.agentPriorityBoost.value = settings.priorityBoost;
390      }
391      else
392      {
393        Main.hide('agentsettings');
394      }
395    }
396   
397    function useDefaultMaxMemoryOnClick()
398    {
399      var frm = document.forms['plugin'];
400      var settings = getAgentSettings(selectedAgentId);
401      if (settings)
402      {
403        var useDefault = frm.useDefaultMaxMemory.checked;
404        settings.useDefaultMaxMemory = useDefault;
405        frm.agentMaxMemory.disabled = useDefault;
406        if (!useDefault) 
407        {
408          frm.agentMaxMemory.focus();
409          frm.agentMaxMemory.value = settings.maxMemory;
410        }
411      }
412    }
413   
414    function maxMemoryOnBlur()
415    {
416      var frm = document.forms['plugin'];
417      var settings = getAgentSettings(selectedAgentId);
418      if (settings)
419      {
420        settings.maxMemory = frm.agentMaxMemory.value;
421      }
422    }
423   
424    function trustedOnClick()
425    {
426      var frm = document.forms['plugin'];
427      var settings = getAgentSettings(selectedAgentId);
428      if (settings)
429      {
430        var selected = Forms.getCheckedRadio(frm.agentTrusted);
431        if (selected != null)
432        {
433          settings.trusted = selected.value;
434          settings.useDefaultTrusted = settings.trusted == '';
435        }
436      }
437    }
438   
439    function priorityBoostOnBlur()
440    {
441      var frm = document.forms['plugin'];
442      var settings = getAgentSettings(selectedAgentId);
443      if (settings)
444      {
445        var priorityBoost = parseInt(frm.agentPriorityBoost.value);
446        if (priorityBoost < 0 || priorityBoost > 10)
447        {
448          alert('The priority boost must be between 0 and 10');
449          frm.agentPriorityBoost.focus();
450          return;
451        }
452        settings.priorityBoost = priorityBoost;
453      }
454    }
455   
456    function usePermissionsOnClick()
457    {
458      var frm = document.forms['plugin'];
459      var use = Forms.getCheckedRadio(frm.use_permissions).value == '1';
460      frm.items.disabled = !use;
461      frm.grant_create.disabled = !use;
462      frm.grant_read.disabled = !use;
463      frm.grant_use.disabled = !use;
464      frm.grant_write.disabled = !use;
465      frm.grant_delete.disabled = !use;
466      frm.grant_set_owner.disabled = !use;
467      frm.grant_set_permission.disabled = !use;
468      frm.deny_create.disabled = !use;
469      frm.deny_read.disabled = !use;
470      frm.deny_use.disabled = !use;
471      frm.deny_write.disabled = !use;
472      frm.deny_delete.disabled = !use;
473      frm.deny_set_owner.disabled = !use;
474      frm.deny_set_permission.disabled = !use;
475    }
476   
477    function initPermissions()
478    {
479      var frm = document.forms['plugin'];
480      for (var i = 0; i < frm.items.length; i++)
481      {
482        updateListText(i);
483      }
484      usePermissionsOnClick();
485    }
486   
487    /*
488      Update the permission code string for the list entry with given index
489    */
490    function updateListText(index)
491    {
492      var frm = document.forms['plugin'];
493      var item = frm.items[index];
494      var itemType = item.value;
495      if (itemType)
496      {
497        var granted = parseInt(frm[itemType+'_granted'].value);
498        var denied = parseInt(frm[itemType+'_denied'].value);
499        var defined = parseInt(frm[itemType+'_defined'].value);
500       
501        var s = '';
502        s += appendPermission('C', granted, denied, defined, <%=CREATE_CODE%>);
503        s += appendPermission('R', granted, denied, defined, <%=READ_CODE%>);
504        s += appendPermission('U', granted, denied, defined, <%=USE_CODE%>);
505        s += appendPermission('W', granted, denied, defined, <%=WRITE_CODE%>);
506        s += appendPermission('D', granted, denied, defined, <%=DELETE_CODE%>);
507        s += appendPermission('O', granted, denied, defined, <%=SET_OWNER_CODE%>);
508        s += appendPermission('P', granted, denied, defined, <%=SET_PERMISSION_CODE%>);
509       
510        var text = item.text.replace(/\[.*\]/, '['+s+']');
511        item.text = text; 
512      }
513    }
514   
515    function appendPermission(cc, granted, denied, defined, permission)
516    {
517      var p = '';
518      if ((defined & permission) > 0)
519      {
520        p = (granted & permission) > 0 ? cc.toUpperCase() : ((denied & permission) > 0 ? '-' : cc.toLowerCase());
521      }
522      return p;
523    }
524   
525    function itemsOnClick()
526    {
527      var frm = document.forms['plugin'];
528      var itemType = frm.items[frm.items.selectedIndex].value;
529      if (itemType)
530      {
531        showPermissions(itemType);
532      }
533    }
534   
535    /*
536      Update checkboxes to show the permissions for specified item type
537    */
538    function showPermissions(itemType)
539    {
540      var frm = document.forms['plugin'];
541      if (itemType)
542      {
543        var granted = parseInt(frm[itemType+'_granted'].value);
544        var denied = parseInt(frm[itemType+'_denied'].value);
545        var defined = parseInt(frm[itemType+'_defined'].value);
546       
547        updateCheckBox('create', <%=CREATE_CODE%>, granted, denied, defined);
548        updateCheckBox('read', <%=READ_CODE%>, granted, denied, defined);
549        updateCheckBox('use', <%=USE_CODE%>, granted, denied, defined);
550        updateCheckBox('write', <%=WRITE_CODE%>, granted, denied, defined);
551        updateCheckBox('delete', <%=DELETE_CODE%>, granted, denied, defined);
552        updateCheckBox('set_owner', <%=SET_OWNER_CODE%>, granted, denied, defined);
553        updateCheckBox('set_permission', <%=SET_PERMISSION_CODE%>, granted, denied, defined);
554      }
555    }
556   
557    /*
558      Check/uncheck and enable/disable checkboxes depending on given permissions
559    */
560    function updateCheckBox(nameSuffix, permission, granted, denied, defined)
561    {
562      var frm = document.forms['plugin'];
563      var isGranted = (permission & granted) > 0;
564      var isDenied = (permission & denied) > 0;
565      var isDefined = (permission & defined) > 0;
566     
567      frm['grant_'+nameSuffix].disabled = !isDefined;
568      frm['deny_'+nameSuffix].disabled = !isDefined || isGranted;
569      frm['grant_'+nameSuffix].checked = isGranted & isDefined;
570      frm['deny_'+nameSuffix].checked = isDenied & isDefined;
571    }
572   
573   
574    // When a user clicks on one of the permission checkboxes
575    function permissionOnClick(checkbox)
576    {
577      var frm = document.forms['plugin'];
578      cascadeSelections(checkbox.checked);
579      var granted = getCheckedPermissions('grant_');
580      var denied = getCheckedPermissions('deny_');
581      for (var i = 0; i < frm.items.length; i++)
582      {
583        var item = frm.items[i];
584        var itemType = item.value;
585        if (item.selected && itemType)
586        {
587          frm[itemType+'_granted'].value = granted;
588          frm[itemType+'_denied'].value = denied;
589          updateListText(i);
590        }
591      }
592    }
593   
594    /*
595      Get the permission for the checked checkboxes
596      prefix should be "grant_" or "deny_"
597    */
598    function getCheckedPermissions(prefix)
599    {
600      var permissionCode = 0;
601      var frm = document.forms['plugin'];
602      permissionCode += frm[prefix+'create'].checked ? <%=CREATE_CODE%>: 0;
603      permissionCode += frm[prefix+'read'].checked ? <%=READ_CODE%>: 0;
604      permissionCode += frm[prefix+'use'].checked ? <%=USE_CODE%>: 0;
605      permissionCode += frm[prefix+'write'].checked ? <%=WRITE_CODE%>: 0;
606      permissionCode += frm[prefix+'delete'].checked ? <%=DELETE_CODE%>: 0;
607      permissionCode += frm[prefix+'set_owner'].checked ? <%=SET_OWNER_CODE%>: 0;
608      permissionCode += frm[prefix+'set_permission'].checked ? <%=SET_PERMISSION_CODE%>: 0;
609      return permissionCode;
610    }
611    /*
612      Makes sure all checkboxes are in a consistent state with
613      each other.
614    */
615    function cascadeSelections(checked)
616    {
617      var frm = document.forms['plugin'];
618     
619      // Grant permissions
620      if (checked)
621      {
622        frm['grant_write'].checked = (frm['grant_write'].checked || frm['grant_delete'].checked || frm['grant_set_owner'].checked || frm['grant_set_permission'].checked);
623        frm['grant_use'].checked = (frm['grant_use'].checked || frm['grant_write'].checked);
624        frm['grant_read'].checked = (frm['grant_read'].checked || frm['grant_use'].checked);
625      }
626      else
627      {
628        frm['grant_use'].checked = (frm['grant_use'].checked && frm['grant_read'].checked);
629        frm['grant_write'].checked = (frm['grant_write'].checked && frm['grant_use'].checked);
630        frm['grant_delete'].checked = (frm['grant_delete'].checked && frm['grant_write'].checked);
631        frm['grant_set_owner'].checked = (frm['grant_set_owner'].checked && frm['grant_write'].checked);
632        frm['grant_set_permission'].checked = (frm['grant_set_permission'].checked && frm['grant_write'].checked);
633      }
634     
635      // Deny permissions
636      frm['deny_create'].disabled = frm['grant_create'].disabled || frm['grant_create'].checked;
637      frm['deny_read'].disabled =frm['grant_read'].disabled || frm['grant_read'].checked;
638      frm['deny_use'].disabled = frm['grant_use'].disabled || frm['grant_use'].checked;
639      frm['deny_write'].disabled = frm['grant_write'].disabled || frm['grant_write'].checked;
640      frm['deny_delete'].disabled = frm['grant_delete'].disabled || frm['grant_delete'].checked;
641      frm['deny_set_owner'].disabled = frm['grant_set_owner'].disabled || frm['grant_set_owner'].checked;
642      frm['deny_set_permission'].disabled = frm['grant_set_permission'].disabled || frm['grant_set_permission'].checked;
643      if (checked)
644      {
645        if (!frm['deny_use'].disabled) frm['deny_use'].checked = frm['deny_use'].checked || frm['deny_read'].checked;
646        if (!frm['deny_write'].disabled) frm['deny_write'].checked = frm['deny_write'].checked || frm['deny_use'].checked;
647        if (!frm['deny_delete'].disabled) frm['deny_delete'].checked = frm['deny_delete'].checked || frm['deny_write'].checked;
648        if (!frm['deny_set_owner'].disabled) frm['deny_set_owner'].checked = frm['deny_set_owner'].checked || frm['deny_write'].checked;
649        if (!frm['deny_set_permission'].disabled) frm['deny_set_permission'].checked = frm['deny_set_permission'].checked || frm['deny_write'].checked;
650      }
651      else
652      {
653        if (!frm['deny_write'].disabled) frm['deny_write'].checked = frm['deny_write'].checked && !((!frm['deny_delete'].checked && !frm['deny_delete'].disabled) || (!frm['deny_set_owner'].checked && !frm['deny_set_owner'].disabled) || (!frm['deny_set_permission'].checked && !frm['deny_set_permission'].disabled));
654        if (!frm['deny_use'].disabled) frm['deny_use'].checked = frm['deny_use'].checked && frm['deny_write'].checked;
655        if (!frm['deny_read'].disabled) frm['deny_read'].checked = frm['deny_read'].checked && frm['deny_use'].checked;
656      }
657    }
658    <%
659    if (requestedPermissions != null && requestedPermissions.size() > 0)
660    {
661      %>
662      function setRequestedPermissions()
663      {
664        var frm = document.forms['plugin'];
665        // Reset all existing permissions
666        for (var i = 0; i < frm.items.length; i++)
667        {
668          var itemType = frm.items[i].value;
669          if (itemType)
670          {
671            frm[itemType+'_granted'].value = 0;
672            frm[itemType+'_denied'].value = 255;
673          }
674        }
675        // Set requested permissions
676        <%
677        for (Permissions pp : requestedPermissions)
678        {
679          Item ppType = pp.getItemType();
680          if (ppType.getDefinedPermissions() != null)
681          {
682            Set<Permission> always = Permission.expand(pp.getAlwaysGranted());
683            Set<Permission> maybe = Permission.expand(pp.getMaybeGranted());
684            %>
685            frm['<%=ppType.name()%>_granted'].value = <%=always == null ? 0 : PermissionUtil.getPermissionCode(always)%>;
686            frm['<%=ppType.name()%>_denied'].value = <%=maybe == null ? 255 : 255 & ~PermissionUtil.getPermissionCode(maybe)%>;
687            <%
688          }
689        }
690        %>
691        // Update the list
692        initPermissions();
693      }
694      <%
695    }
696    %>
697    </script>
698  </base:head>
699  <base:body onload="init()">
700    <p>
701    <form action="index.jsp?ID=<%=ID%>" method="post" name="plugin" onsubmit="return false;">
702    <input type="hidden" name="cmd" value="UpdateItem">
703
704    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
705    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*370)+"px;"%>" 
706      position="bottom" remember="<%=plugin != null%>" 
707      active="<%=selectedAgentId == -1 ? null : "agents" %>" switch="switchTab"
708      extensions="<%=invoker%>">
709    <t:tab id="info" title="Plugin" validate="validatePlugin()" helpid="plugindefinition.edit">
710      <table class="form" cellspacing=0>
711      <tr>
712        <td class="prompt">Name</td>
713        <td><%=HTML.encodeTags(plugin == null ? Values.getString(cc.getPropertyValue("name"), "New plugin") : plugin.getName())%></td>
714      </tr>
715      <tr>
716        <td class="prompt">Class</td>
717        <td><input <%=requiredClazz%> type="text" name="className" 
718          value="<%=HTML.encodeTags(plugin == null ? cc.getPropertyValue("className") : plugin.getClassName())%>" 
719          size="50" maxlength="<%=PluginDefinition.MAX_CLASSNAME_LENGTH%>"></td>
720      </tr>
721     
722      <tr>
723        <td class="prompt">JAR file</td>
724        <td><input <%=clazz%> type="text" name="jarFile" 
725          value="<%=HTML.encodeTags(plugin == null ? cc.getPropertyValue("jarFile") : plugin.getJarFile())%>"
726          size="50" maxlength="<%=PluginDefinition.MAX_JARFILE_LENGTH%>">
727        </td>
728      </tr>
729      <tr>
730        <td class="prompt">Max memory</td>
731        <td><input <%=clazz%> type="text" name="maxMemory" 
732          value="<%=Values.formatBytes(plugin == null ? Values.parseBytes(cc.getPropertyValue("maxMemory"), null) : plugin.getMaxMemory())%>"
733          size="16" maxlength="16"> (Use KB, MB or GB to specify units)</td>
734      </tr>
735     
736      <tr>
737        <td class="prompt">Trusted</td>
738        <td>
739          <input type="radio" name="trusted" id="trustedNo" value="0" 
740            <%=!isTrusted ? "checked" : ""%>><label for="trustedNo">no</label>
741          <input type="radio" name="trusted" id="trustedYes" value="1" 
742            <%=isTrusted ? "checked" : ""%>><label for="trustedYes">yes</label>
743        </td>
744      </tr> 
745     
746      <tr>
747        <td class="prompt">Allow immediate exection</td>
748        <td>
749          <input type="radio" name="allow_immediate_execution" id="immediateNo" value="0" 
750            <%=Boolean.FALSE.equals(allowImmediateExecution) ? "checked" : ""%>><label for="immediateNo">no</label>
751          <input type="radio" name="allow_immediate_execution" id="immediateYes" value="1" 
752            <%=Boolean.TRUE.equals(allowImmediateExecution) ? "checked" : ""%>><label for="immediateYes">yes</label>
753          <%
754          if (allowImmediateExecution == null)
755          {
756            %>
757            <input type="radio" name="allow_immediate_execution" id="immediateAuto" value="" 
758              checked><label for="immediateAuto">auto</label>
759            <%
760          }
761          %>
762        </td>
763      </tr> 
764      </table>
765      <%
766      if (warning != null) 
767      {
768        %>
769        <div class="error"><%=warning%></div>
770        <%
771      }
772      %>     
773      <div align=right>&nbsp;<i><base:icon image="required.gif" /> = required information</i></div>
774    </t:tab>
775   
776    <t:tab id="permissions" title="Permissions" 
777      tooltip="Set permissions for this plugindefintion" helpid="plugindefinition.edit.permissions">
778    <table class="form">
779      <tr> 
780        <td class="prompt">Use permissions</td>
781        <td>
782          <input type="radio" name="use_permissions" id="permissionsYes" value="1" 
783            <%=usePermissions ? "checked" : ""%> onclick="usePermissionsOnClick()"><label for="permissionsYes">yes</label>
784          <input type="radio" name="use_permissions" id="permissionsNo" value="0" 
785            <%=!usePermissions ? "checked" : ""%> onclick="usePermissionsOnClick()"><label for="permissionsNo">no</label>
786          <%
787          if (plugin == null)
788          {
789            %>
790            <input type="radio" name="use_permissions" id="permissionsAuto" value="2" 
791              onclick="usePermissionsOnClick()"><label for="permissionsAuto">if requested by plugin</label>
792            <%
793          }
794          %>
795        </td>
796      </tr>
797    </table>
798
799    <table>
800    <tr >
801    <td>
802      <b>Item types</b><br>
803      <select name="items" size="14" onChange="itemsOnClick()" multiple>
804      <%
805      Map<String, List<Item>> permissionGroups = PermissionUtil.getPermissionGroups();
806      for (Map.Entry<String, List<Item>> entry : permissionGroups.entrySet())
807      {
808        String name = entry.getKey();
809        List<Item> items = entry.getValue();
810        %>
811        <option class="selectoptionheader" value="">-- <%=name%>
812        <%
813        for (Item item : items)
814        {
815          %>
816          <%=getOption(dc, plugin, item)%>
817          <%
818        }
819      }
820      %>
821      </select>
822    </td>
823    <td>
824      <table>
825      <tr ><td>
826        <b>Always grant</b><br>
827        <input type="checkbox" name="grant_create" onClick="permissionOnClick(this)">Create<br>
828        <input type="checkbox" name="grant_read" onClick="permissionOnClick(this)">Read<br>
829        <input type="checkbox" name="grant_use" onClick="permissionOnClick(this)">Use<br>
830        <input type="checkbox" name="grant_write" onClick="permissionOnClick(this)">Write<br>
831        <input type="checkbox" name="grant_delete" onClick="permissionOnClick(this)">Delete<br>
832        <input type="checkbox" name="grant_set_owner" onClick="permissionOnClick(this)">Set owner<br>
833        <input type="checkbox" name="grant_set_permission" onClick="permissionOnClick(this)">Set permission
834      </td>
835      <td>
836        <b>Always deny</b><br>
837        <input type="checkbox" name="deny_create" onClick="permissionOnClick(this)">Create<br>
838        <input type="checkbox" name="deny_read" onClick="permissionOnClick(this)">Read<br>
839        <input type="checkbox" name="deny_use" onClick="permissionOnClick(this)">Use<br>
840        <input type="checkbox" name="deny_write" onClick="permissionOnClick(this)">Write<br>
841        <input type="checkbox" name="deny_delete" onClick="permissionOnClick(this)">Delete<br>
842        <input type="checkbox" name="deny_set_owner" onClick="permissionOnClick(this)">Set owner<br>
843        <input type="checkbox" name="deny_set_permission" onClick="permissionOnClick(this)">Set permission
844      </td>
845      <%
846      if (requestedPermissions != null && requestedPermissions.size() > 0)
847      {
848        %>
849        <td style="background: #f8f8e0; border: 1px solid gray;">
850        <b>Requested by plugin</b><br>
851        <table>
852        <%
853        for (Permissions pp : requestedPermissions)
854        {
855          Item ppType = pp.getItemType();
856          Set<Permission> always = Permission.expand(pp.getAlwaysGranted());
857          Set<Permission> maybe = Permission.expand(pp.getMaybeGranted());
858          Set<Permission> defined = ppType.getDefinedPermissions();
859          if (defined != null)
860          {
861            StringBuilder sb = new StringBuilder();
862            sb.append("[");
863            appendPermissionLetter(sb, Permission.CREATE, "C", defined, always, maybe);
864            appendPermissionLetter(sb, Permission.READ, "R", defined, always, maybe);
865            appendPermissionLetter(sb, Permission.USE, "U", defined, always, maybe);
866            appendPermissionLetter(sb, Permission.WRITE, "W", defined, always, maybe);
867            appendPermissionLetter(sb, Permission.DELETE, "D", defined, always, maybe);
868            appendPermissionLetter(sb, Permission.SET_OWNER, "O", defined, always, maybe);
869            appendPermissionLetter(sb, Permission.SET_PERMISSION, "P", defined, always, maybe);
870            sb.append("]");
871            %>
872            <tr>
873              <td><%=ppType%></td>
874              <td><%=sb.toString()%></td>
875            </tr>
876            <%
877          }
878        }
879        %>
880        </table>
881        <table><tr><td>
882        <base:button title="Use requested permissions" onclick="setRequestedPermissions()"
883          tooltip="Use the permissions requested by the plugin." />
884        </td></tr></table>
885        </td>
886        <%
887      }
888      %>
889      </tr>
890      </table>
891      <b>Capital letters</b> = Permission is always granted<br>
892      <b>Small letters</b> = Permission is only granted if logged in user
893        has that permission
894     
895    </td>
896    </tr>
897    </table>
898   
899   
900    </t:tab>
901   
902   
903    <t:tab id="agents" title="Job agents" helpid="plugindefinition.jobagents">
904      <table class="form">
905      <tr >
906      <td class="prompt">Run this plugin on</td>
907      <td>
908        <input type="checkbox" name="use_internal_jobqueue" value="1"
909          <%=plugin == null || plugin.getUseInternalJobQueue() ? "checked" : "" %>>
910          internal job queue
911      </td>
912      </tr>
913      <tr>
914      <td>
915        <select name="agents" size="12" multiple style="width: 15em;" 
916          onclick="agentsOnClick()">
917        </select>
918        <input type="hidden" name="removeAgents" value="">
919        <input type="hidden" name="allAgents" value="">
920      </td>
921      <td>
922        <table width="150">
923        <tr><td><base:button 
924          clazz="leftaligned buttonclass"
925          onclick="addAgentsOnClick()" 
926          title="Add&nbsp;job&nbsp;agents&hellip;" 
927          tooltip="Add job agents to this plugin"
928        /></td></tr>
929        <tr><td><base:button 
930          clazz="leftaligned buttonclass"
931          onclick="removeOnClick()" 
932          title="Remove" 
933          tooltip="Remove the selected job agents"
934        /></td></tr>
935        </table>
936
937        <br>
938        <div id="agentsettings" style="display: none;">
939        <b>Settings for the selected job agent</b>
940        <table border="0" cellspacing="0" class="form">
941        <tr>
942          <td class="prompt">Max memory</td>
943          <td>
944            <input type="text" name="agentMaxMemory" class="text" size="16" 
945              maxlength="16"
946              onblur="maxMemoryOnBlur()">
947              (Use KB, MB or GB to specify memory)
948          </td>
949        </tr>
950        <tr>
951          <td style="padding-left: 10px;">-use default</td>
952          <td>
953            <input type="checkbox" name="useDefaultMaxMemory"
954              onclick="useDefaultMaxMemoryOnClick()">
955            (<span id="defaultMaxMemory"></span>)
956          </td>
957        </tr>
958        <tr>
959          <td class="prompt">Trusted</td>
960          <td>
961            <input type="radio" name="agentTrusted" id="agentTrustedDefault" value="" 
962              onclick="trustedOnClick()"><label for="agentTrustedDefault">default (<span id="defaultTrusted"></span>)</label>
963            <input type="radio" name="agentTrusted" id="agentTrustedYes" value="1"
964              onclick="trustedOnClick()"><label for="agentTrustedYes">yes</label>
965            <input type="radio" name="agentTrusted" id="agentTrustedNo" value="0"
966              onclick="trustedOnClick()"><label for="agentTrustedNo">no</label>
967          </td>
968        </tr>
969        <tr>
970          <td class="prompt">Priority boost</td>
971          <td>
972            <input type="text" name="agentPriorityBoost" class="text" size="12" 
973              maxlength="10" onkeypress="return Numbers.integerOnly(event)"
974              onblur="priorityBoostOnBlur()">
975          </td>
976        </tr>
977        </table>
978        </div>
979      </td>
980      </tr>
981      </table>
982    </t:tab>
983   
984    <t:tab id="annotations" title="Annotations" 
985      helpid="annotations.edit" tooltip="Enter values for annotations"
986      visible="<%=plugin != null && !plugin.requiresConfiguration() && plugin.supports("net.sf.basedb.core.plugin.AnnotationSetterPlugin")%>">
987      <iframe name="annotations" id="idAnnotations" src="../../common/annotations/wait.jsp" 
988        width="100%"  height="<%=(int)(scale*370)%>" frameborder=0 vspace=0 hspace=0
989        marginwidth=0 marginheight=0 scrolling="auto" style="overflow: visible"></iframe>
990    </t:tab>
991   
992    </t:tabcontrol>
993
994    <table align="center">
995    <tr>
996      <td width="50%"><base:button onclick="saveSettings()" title="Save" /></td>
997      <td width="50%"><base:button onclick="window.close()" title="Cancel" /></td>
998    </tr>
999    </table>
1000    <%
1001    ItemResultList<RoleKey> roleKeys = roleKeyQuery.list(dc);
1002    for (RoleKey key : roleKeys)
1003    {
1004      int grantedCode = plugin == null ? 0 : PermissionUtil.getPermissionCode(plugin.getGranted(key));
1005      int deniedCode = plugin == null ? 255 : PermissionUtil.getPermissionCode(plugin.getDenied(key));
1006      int definedCode = key.getItemType().getDefinedPermissions() == null ? 0 : PermissionUtil.getPermissionCode(key.getItemType().getDefinedPermissions());     
1007      String name = key.getItemType().name();           
1008      %>
1009      <input type="hidden" name="<%=name%>_granted" value="<%=grantedCode%>">
1010      <input type="hidden" name="<%=name%>_denied" value="<%=deniedCode%>">
1011      <input type="hidden" name="<%=name%>_defined" value="<%=definedCode%>">
1012      <%
1013    }
1014    %>
1015    </form>
1016  </base:body>
1017  </base:page>
1018  <%
1019}
1020finally
1021{
1022  if (dc != null) dc.close();
1023}
1024%>
Note: See TracBrowser for help on using the repository browser.