www/admin/jobagents/edit_agent.jsp

Code
Comments
Other
Rev Date Author Line
2629 08 Sep 06 nicklas 1 <%-- $Id$
2629 08 Sep 06 nicklas 2   ------------------------------------------------------------------
3675 16 Aug 07 jari 3   Copyright (C) 2006 Nicklas Nordborg
2629 08 Sep 06 nicklas 4
2629 08 Sep 06 nicklas 5   This file is part of BASE - BioArray Software Environment.
2629 08 Sep 06 nicklas 6   Available at http://base.thep.lu.se/
2629 08 Sep 06 nicklas 7
2629 08 Sep 06 nicklas 8   BASE is free software; you can redistribute it and/or
2629 08 Sep 06 nicklas 9   modify it under the terms of the GNU General Public License
4476 05 Sep 08 jari 10   as published by the Free Software Foundation; either version 3
2629 08 Sep 06 nicklas 11   of the License, or (at your option) any later version.
2629 08 Sep 06 nicklas 12
2629 08 Sep 06 nicklas 13   BASE is distributed in the hope that it will be useful,
2629 08 Sep 06 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
2629 08 Sep 06 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2629 08 Sep 06 nicklas 16   GNU General Public License for more details.
2629 08 Sep 06 nicklas 17
2629 08 Sep 06 nicklas 18   You should have received a copy of the GNU General Public License
4510 11 Sep 08 jari 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
2629 08 Sep 06 nicklas 20   ------------------------------------------------------------------
2629 08 Sep 06 nicklas 21
2629 08 Sep 06 nicklas 22
2629 08 Sep 06 nicklas 23   @author Nicklas
2629 08 Sep 06 nicklas 24   @version 2.0
2629 08 Sep 06 nicklas 25 --%>
5426 24 Sep 10 nicklas 26 <%@ page pageEncoding="UTF-8" session="false"
2629 08 Sep 06 nicklas 27   import="net.sf.basedb.core.SessionControl"
2629 08 Sep 06 nicklas 28   import="net.sf.basedb.core.DbControl"
2629 08 Sep 06 nicklas 29   import="net.sf.basedb.core.Include"
2629 08 Sep 06 nicklas 30   import="net.sf.basedb.core.Item"
2629 08 Sep 06 nicklas 31   import="net.sf.basedb.core.ItemContext"
2629 08 Sep 06 nicklas 32   import="net.sf.basedb.core.Permission"
2629 08 Sep 06 nicklas 33   import="net.sf.basedb.core.JobAgent"
2629 08 Sep 06 nicklas 34   import="net.sf.basedb.core.JobAgentSettings"
2629 08 Sep 06 nicklas 35   import="net.sf.basedb.core.PluginDefinition"
2629 08 Sep 06 nicklas 36   import="net.sf.basedb.core.ItemQuery"
2629 08 Sep 06 nicklas 37   import="net.sf.basedb.core.ItemResultList"
2629 08 Sep 06 nicklas 38   import="net.sf.basedb.core.PermissionDeniedException"
2629 08 Sep 06 nicklas 39   import="net.sf.basedb.core.query.Orders"
2629 08 Sep 06 nicklas 40   import="net.sf.basedb.core.query.Hql"
2629 08 Sep 06 nicklas 41   import="net.sf.basedb.clients.web.Base"
2629 08 Sep 06 nicklas 42   import="net.sf.basedb.clients.web.util.HTML"
2753 20 Oct 06 nicklas 43   import="net.sf.basedb.util.Values"
5508 19 Nov 10 nicklas 44   import="net.sf.basedb.core.plugin.GuiContext"
5508 19 Nov 10 nicklas 45   import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
5508 19 Nov 10 nicklas 46   import="net.sf.basedb.clients.web.extensions.JspContext"
5508 19 Nov 10 nicklas 47   import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
7604 25 Feb 19 nicklas 48   import="net.sf.basedb.clients.web.extensions.tabcontrol.TabAction"
5508 19 Nov 10 nicklas 49   import="net.sf.basedb.util.extensions.ExtensionsInvoker"
6305 09 Aug 13 nicklas 50   import="net.sf.basedb.util.json.NameableConverter"
6305 09 Aug 13 nicklas 51   import="org.json.simple.JSONArray"
6305 09 Aug 13 nicklas 52   import="org.json.simple.JSONObject"
2629 08 Sep 06 nicklas 53 %>
2629 08 Sep 06 nicklas 54 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
2629 08 Sep 06 nicklas 55 <%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
6147 21 Sep 12 nicklas 56 <%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
2629 08 Sep 06 nicklas 57 <%
2629 08 Sep 06 nicklas 58 final Item itemType = Item.JOBAGENT;
2629 08 Sep 06 nicklas 59 final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
2629 08 Sep 06 nicklas 60 final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
2629 08 Sep 06 nicklas 61 final int itemId = cc.getId();
2629 08 Sep 06 nicklas 62 final String ID = sc.getId();
2629 08 Sep 06 nicklas 63 final float scale = Base.getScale(sc);
7954 12 May 21 nicklas 64 final DbControl dc = sc.newDbControl(":Edit "+itemType);
2629 08 Sep 06 nicklas 65 try
2629 08 Sep 06 nicklas 66 {
2629 08 Sep 06 nicklas 67   String title = null;
2629 08 Sep 06 nicklas 68   JobAgent agent = null;
2629 08 Sep 06 nicklas 69   Integer port = null;
2631 08 Sep 06 nicklas 70
6305 09 Aug 13 nicklas 71   final int selectedPluginId = Values.getInt(request.getParameter("plugin_id"));
2631 08 Sep 06 nicklas 72
2629 08 Sep 06 nicklas 73   // Query to retrieve installed plugins
2631 08 Sep 06 nicklas 74   ItemQuery<PluginDefinition> pluginQuery = PluginDefinition.getQuery();
3890 30 Oct 07 nicklas 75   pluginQuery.include(Include.ALL);
2631 08 Sep 06 nicklas 76   pluginQuery.order(Orders.asc(Hql.property("name")));
2629 08 Sep 06 nicklas 77
2629 08 Sep 06 nicklas 78   if (itemId == 0)
2629 08 Sep 06 nicklas 79   {
2629 08 Sep 06 nicklas 80     title = "Create job agent";
2629 08 Sep 06 nicklas 81     cc.removeObject("item");
2648 19 Sep 06 nicklas 82     port = Values.getInteger(cc.getPropertyValue("port"), JobAgent.DEFAULT_PORT);
2629 08 Sep 06 nicklas 83   }
2629 08 Sep 06 nicklas 84   else
2629 08 Sep 06 nicklas 85   {
2629 08 Sep 06 nicklas 86     agent = JobAgent.getById(dc, itemId);
6305 09 Aug 13 nicklas 87     agent.checkPermission(Permission.WRITE);
2629 08 Sep 06 nicklas 88     cc.setObject("item", agent);
2629 08 Sep 06 nicklas 89     title = "Edit job agent -- " + HTML.encodeTags(agent.getName());
2629 08 Sep 06 nicklas 90     port = agent.getPort();
2629 08 Sep 06 nicklas 91   }
6217 14 Dec 12 nicklas 92   
6305 09 Aug 13 nicklas 93   // Load plugin definitions as JSON objects
6305 09 Aug 13 nicklas 94   JSONArray jsonSettings = new JSONArray();
6305 09 Aug 13 nicklas 95   JSONObject jsonPlugins = new JSONObject();
6305 09 Aug 13 nicklas 96   jsonPlugins.put("itemType", "PLUGINDEFINITION");
6305 09 Aug 13 nicklas 97   if (pluginQuery != null)
6305 09 Aug 13 nicklas 98   {
6305 09 Aug 13 nicklas 99     JSONArray jsonLinked = new JSONArray();
7604 25 Feb 19 nicklas 100     NameableConverter<PluginDefinition> converter = new NameableConverter<>();
6305 09 Aug 13 nicklas 101     for (PluginDefinition plugin : pluginQuery.list(dc))
2629 08 Sep 06 nicklas 102     {
6305 09 Aug 13 nicklas 103       // Default settings
6305 09 Aug 13 nicklas 104       boolean defaultTrusted = plugin.isTrusted();
6305 09 Aug 13 nicklas 105       Long defaultMaxMemory = plugin.getMaxMemory();
2629 08 Sep 06 nicklas 106
6305 09 Aug 13 nicklas 107       // Specific settings
6305 09 Aug 13 nicklas 108       JobAgentSettings settings = agent == null ? null : agent.getSettings(plugin, false);
6305 09 Aug 13 nicklas 109       Boolean trusted = null;
6305 09 Aug 13 nicklas 110       Long maxMemory = null;
6305 09 Aug 13 nicklas 111       int priorityBoost = 0;
6305 09 Aug 13 nicklas 112       if (settings != null)
2629 08 Sep 06 nicklas 113       {
6305 09 Aug 13 nicklas 114         trusted = settings.isTrusted();
6305 09 Aug 13 nicklas 115         maxMemory = settings.getMaxMemory();
6305 09 Aug 13 nicklas 116         priorityBoost = settings.getPriorityBoost();
6305 09 Aug 13 nicklas 117         jsonLinked.add(converter.convert(plugin));
2629 08 Sep 06 nicklas 118         
2629 08 Sep 06 nicklas 119       }
6305 09 Aug 13 nicklas 120       JSONObject jsonSetting = new JSONObject();
6305 09 Aug 13 nicklas 121       jsonSetting.put("pluginId", plugin.getId());
6305 09 Aug 13 nicklas 122       jsonSetting.put("defaultTrusted", defaultTrusted ? 1 : 0);
6305 09 Aug 13 nicklas 123       if (trusted != null) 
2629 08 Sep 06 nicklas 124       {
6305 09 Aug 13 nicklas 125         jsonSetting.put("trusted", trusted ? 1 : 0);
2629 08 Sep 06 nicklas 126       }
2629 08 Sep 06 nicklas 127       else
2629 08 Sep 06 nicklas 128       {
6305 09 Aug 13 nicklas 129         jsonSetting.put("trusted", "");
2629 08 Sep 06 nicklas 130       }
6305 09 Aug 13 nicklas 131       if (defaultMaxMemory != null)
2629 08 Sep 06 nicklas 132       {
6305 09 Aug 13 nicklas 133         jsonSetting.put("defaultMaxMemory", Values.formatBytes(defaultMaxMemory));
2629 08 Sep 06 nicklas 134       }
6305 09 Aug 13 nicklas 135       if (maxMemory != null)
2629 08 Sep 06 nicklas 136       {
6305 09 Aug 13 nicklas 137         jsonSetting.put("maxMemory", Values.formatBytes(maxMemory));
2629 08 Sep 06 nicklas 138       }
6305 09 Aug 13 nicklas 139       jsonSetting.put("priorityBoost", priorityBoost);
6305 09 Aug 13 nicklas 140       jsonSettings.add(jsonSetting);
6305 09 Aug 13 nicklas 141     }  
6305 09 Aug 13 nicklas 142     jsonPlugins.put("items", jsonLinked);
6305 09 Aug 13 nicklas 143   }
2629 08 Sep 06 nicklas 144
6305 09 Aug 13 nicklas 145   JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), agent);
7604 25 Feb 19 nicklas 146   ExtensionsInvoker<TabAction> invoker = EditUtil.useEditExtensions(jspContext);
6305 09 Aug 13 nicklas 147   %>
6305 09 Aug 13 nicklas 148   <base:page type="popup" title="<%=title%>" id="edit-page">
6305 09 Aug 13 nicklas 149   <base:head scripts="tabcontrol-2.js,linkitems-2.js,~agents.js" styles="tabcontrol.css">
6305 09 Aug 13 nicklas 150     <ext:scripts context="<%=jspContext%>" />
6305 09 Aug 13 nicklas 151     <ext:stylesheets context="<%=jspContext%>" />
2629 08 Sep 06 nicklas 152   </base:head>
6305 09 Aug 13 nicklas 153   <base:body>
5922 11 Jan 12 nicklas 154     <h1><%=title%> <base:help tabcontrol="settings" /></h1>
6162 10 Oct 12 nicklas 155     <form action="index.jsp?ID=<%=ID%>" method="post" name="agent">
2629 08 Sep 06 nicklas 156     <input type="hidden" name="cmd" value="UpdateItem">
2629 08 Sep 06 nicklas 157
6305 09 Aug 13 nicklas 158     <div id="page-data" class="datacontainer"
6305 09 Aug 13 nicklas 159       data-plugin-settings="<%=HTML.encodeTags(jsonSettings.toJSONString()) %>"
6305 09 Aug 13 nicklas 160       data-select-plugin="<%=selectedPluginId%>"
6305 09 Aug 13 nicklas 161       ></div>
6305 09 Aug 13 nicklas 162
5922 11 Jan 12 nicklas 163     <t:tabcontrol id="settings" 
5922 11 Jan 12 nicklas 164       subclass="content dialogtabcontrol"
6305 09 Aug 13 nicklas 165       position="bottom" remember="<%=agent != null%>" 
6305 09 Aug 13 nicklas 166       active="<%=selectedPluginId == 0 ? null : "plugins" %>"
5508 19 Nov 10 nicklas 167       extensions="<%=invoker%>">
6305 09 Aug 13 nicklas 168     <t:tab id="info" title="Job agent" helpid="jobagent.edit">
5922 11 Jan 12 nicklas 169       <table class="fullform input100 smaller">
2629 08 Sep 06 nicklas 170       <tr>
5922 11 Jan 12 nicklas 171         <th>Name</th>
6305 09 Aug 13 nicklas 172         <td><input class="text required auto-init" data-auto-init="<%=agent == null ? "focus-select" : "focus" %>"
6305 09 Aug 13 nicklas 173           type="text" name="name" 
2629 08 Sep 06 nicklas 174           value="<%=HTML.encodeTags(agent == null ? Values.getString(cc.getPropertyValue("name"), "New job agent") : agent.getName())%>" 
5922 11 Jan 12 nicklas 175           maxlength="<%=JobAgent.MAX_NAME_LENGTH%>"></td>
5922 11 Jan 12 nicklas 176         <td></td>
2629 08 Sep 06 nicklas 177       </tr>
2629 08 Sep 06 nicklas 178       <tr>
5922 11 Jan 12 nicklas 179         <th>External Id</th>
6217 14 Dec 12 nicklas 180         <td><input class="text required" type="text" name="external_id" 
2629 08 Sep 06 nicklas 181           value="<%=HTML.encodeTags(agent == null ? cc.getPropertyValue("externalId") : agent.getExternalId())%>" 
5922 11 Jan 12 nicklas 182           maxlength="<%=JobAgent.MAX_EXTERNAL_ID_LENGTH%>"></td>
5922 11 Jan 12 nicklas 183         <td></td>
2629 08 Sep 06 nicklas 184       </tr>
2629 08 Sep 06 nicklas 185       <tr>
5922 11 Jan 12 nicklas 186         <th>Server</th>
6217 14 Dec 12 nicklas 187         <td><input class="text" type="text" name="server" 
2629 08 Sep 06 nicklas 188           value="<%=HTML.encodeTags(agent == null ? cc.getPropertyValue("server") : agent.getServer())%>" 
5922 11 Jan 12 nicklas 189           maxlength="<%=JobAgent.MAX_SERVER_LENGTH%>"></td>
5922 11 Jan 12 nicklas 190         <td></td>
2629 08 Sep 06 nicklas 191       </tr>
2629 08 Sep 06 nicklas 192       <tr>
5922 11 Jan 12 nicklas 193         <th>Port</th>
6305 09 Aug 13 nicklas 194         <td><input class="text" type="text" name="port" id="port"
2648 19 Sep 06 nicklas 195           value="<%=port == null ?  "" : port.toString() %>" 
6305 09 Aug 13 nicklas 196           maxlength="10" style="width: 15em;">
6305 09 Aug 13 nicklas 197           <span class="link" id="useDefaultPort" 
6305 09 Aug 13 nicklas 198             data-port="<%=JobAgent.DEFAULT_PORT%>"
2648 19 Sep 06 nicklas 199             >Use default (<%=JobAgent.DEFAULT_PORT%>)</span>
2648 19 Sep 06 nicklas 200           </td>
5922 11 Jan 12 nicklas 201         <td></td>
2629 08 Sep 06 nicklas 202       </tr>
5922 11 Jan 12 nicklas 203       <tr class="dynamic">
5922 11 Jan 12 nicklas 204         <th>Description</th>
5922 11 Jan 12 nicklas 205         <td>
6217 14 Dec 12 nicklas 206           <textarea class="text" rows="6" name="description" id="description"
2629 08 Sep 06 nicklas 207             ><%=HTML.encodeTags(agent == null ? cc.getPropertyValue("description") : agent.getDescription())%></textarea>
2629 08 Sep 06 nicklas 208         </td>
5922 11 Jan 12 nicklas 209         <td style="width: 20px;">
6215 13 Dec 12 nicklas 210           <base:zoom textarea="description" title="Description" />
5922 11 Jan 12 nicklas 211         </td>
2629 08 Sep 06 nicklas 212       </tr>
2629 08 Sep 06 nicklas 213       </table>
2629 08 Sep 06 nicklas 214     </t:tab>
2629 08 Sep 06 nicklas 215     
2629 08 Sep 06 nicklas 216     <t:tab id="plugins" title="Plugins" helpid="jobagent.plugins">
5922 11 Jan 12 nicklas 217       <table class="fullform input100 smaller">
5922 11 Jan 12 nicklas 218       <tr class="big">
5922 11 Jan 12 nicklas 219         <th>Installed plugins</th>
5922 11 Jan 12 nicklas 220         <td>
5922 11 Jan 12 nicklas 221           <div class="selectionlist">
5922 11 Jan 12 nicklas 222             <table>
5922 11 Jan 12 nicklas 223             <tr>
5922 11 Jan 12 nicklas 224               <td>
6305 09 Aug 13 nicklas 225                 <select name="plugins" id="plugins" 
6305 09 Aug 13 nicklas 226                   class="auto-init" data-auto-init="link-container"
6305 09 Aug 13 nicklas 227                   data-initial-items="[<%=HTML.encodeTags(jsonPlugins.toJSONString()) %>]"
6305 09 Aug 13 nicklas 228                   size="12" multiple>
5922 11 Jan 12 nicklas 229                 </select>
5922 11 Jan 12 nicklas 230               </td>
5922 11 Jan 12 nicklas 231               <td style="vertical-align: top;">
5922 11 Jan 12 nicklas 232                 <base:buttongroup vertical="true">
5922 11 Jan 12 nicklas 233                   <base:button 
6305 09 Aug 13 nicklas 234                     id="btnAddPlugins"
6305 09 Aug 13 nicklas 235                     subclass="leftaligned auto-init"
6305 09 Aug 13 nicklas 236                     data-auto-init="add-link"
6305 09 Aug 13 nicklas 237                     data-list-id="plugins"
6305 09 Aug 13 nicklas 238                     data-item-type="PLUGINDEFINITION"
5922 11 Jan 12 nicklas 239                     title="Add&nbsp;plugins&hellip;"  
5922 11 Jan 12 nicklas 240                     tooltip="Add plugins to this job agent"
5922 11 Jan 12 nicklas 241                   />
5922 11 Jan 12 nicklas 242                   <base:button 
6305 09 Aug 13 nicklas 243                     id="btnRemovePlugins"
6305 09 Aug 13 nicklas 244                     subclass="leftaligned auto-init"
6305 09 Aug 13 nicklas 245                     data-auto-init="remove-link"
6305 09 Aug 13 nicklas 246                     data-list-id="plugins"
5922 11 Jan 12 nicklas 247                     title="Remove" 
5922 11 Jan 12 nicklas 248                     tooltip="Remove the selected plugins"
5922 11 Jan 12 nicklas 249                   />
5922 11 Jan 12 nicklas 250                 </base:buttongroup>
5922 11 Jan 12 nicklas 251               </td>
5922 11 Jan 12 nicklas 252             </tr>
5922 11 Jan 12 nicklas 253             </table>
5922 11 Jan 12 nicklas 254           </div>
5922 11 Jan 12 nicklas 255         </td>
5922 11 Jan 12 nicklas 256       </tr>
6621 24 Nov 14 nicklas 257       <tbody class="sectionheader">
2629 08 Sep 06 nicklas 258         <tr>
6621 24 Nov 14 nicklas 259           <th colspan="2">Settings for the selected plug-in</th>
5922 11 Jan 12 nicklas 260         </tr>
6621 24 Nov 14 nicklas 261       </tbody>
6621 24 Nov 14 nicklas 262       <tbody id="pluginsettings" style="display: none;">
5922 11 Jan 12 nicklas 263         <tr>
5922 11 Jan 12 nicklas 264           <th class="subprompt">Max memory</th>
2629 08 Sep 06 nicklas 265           <td>
6305 09 Aug 13 nicklas 266             <input type="text" name="maxMemory" id="maxMemory" class="text" style="width: 15em;"
6305 09 Aug 13 nicklas 267               maxlength="16">(Use KB, MB or GB to specify memory)
2629 08 Sep 06 nicklas 268           </td>
2629 08 Sep 06 nicklas 269         </tr>
2629 08 Sep 06 nicklas 270         <tr>
5922 11 Jan 12 nicklas 271           <th class="subprompt"></th>
2629 08 Sep 06 nicklas 272           <td>
6305 09 Aug 13 nicklas 273             <input type="checkbox" name="useDefaultMaxMemory" id="useDefaultMaxMemory">
5922 11 Jan 12 nicklas 274             <label for="useDefaultMaxMemory">Use default</label> (<span id="defaultMaxMemory"></span>)
2629 08 Sep 06 nicklas 275           </td>
2629 08 Sep 06 nicklas 276         </tr>
2629 08 Sep 06 nicklas 277         <tr>
5922 11 Jan 12 nicklas 278           <th class="subprompt">Trusted</th>
2629 08 Sep 06 nicklas 279           <td>
5812 17 Oct 11 nicklas 280             <input type="radio" name="trusted" id="trustedDefault" value="" 
6305 09 Aug 13 nicklas 281               ><label for="trustedDefault">default (<span id="defaultTrusted"></span>)</label>
5812 17 Oct 11 nicklas 282             <input type="radio" name="trusted" id="trustedYes" value="1"
6305 09 Aug 13 nicklas 283               ><label for="trustedYes">yes</label>
5812 17 Oct 11 nicklas 284             <input type="radio" name="trusted" id="trustedNo" value="0"
6305 09 Aug 13 nicklas 285               ><label for="trustedNo">no</label>
2629 08 Sep 06 nicklas 286           </td>
2629 08 Sep 06 nicklas 287         </tr>
2629 08 Sep 06 nicklas 288         <tr>
5922 11 Jan 12 nicklas 289           <th class="subprompt">Priority boost</th>
2629 08 Sep 06 nicklas 290           <td>
6305 09 Aug 13 nicklas 291             <input type="text" name="priorityBoost" id="priorityBoost" class="text" style="width: 15em;"
6305 09 Aug 13 nicklas 292               maxlength="10">
2629 08 Sep 06 nicklas 293           </td>
2629 08 Sep 06 nicklas 294         </tr>
5922 11 Jan 12 nicklas 295       </tbody>
5922 11 Jan 12 nicklas 296       <tr class="dynamic">
5922 11 Jan 12 nicklas 297         <th></th>
5922 11 Jan 12 nicklas 298         <td></td>
2629 08 Sep 06 nicklas 299       </tr>
2629 08 Sep 06 nicklas 300       </table>
2629 08 Sep 06 nicklas 301     </t:tab>
5922 11 Jan 12 nicklas 302     </t:tabcontrol>
5922 11 Jan 12 nicklas 303     </form>
2629 08 Sep 06 nicklas 304     
5922 11 Jan 12 nicklas 305     <div class="legend">
5946 03 Feb 12 nicklas 306       <base:icon image="required.png" />= required information
5922 11 Jan 12 nicklas 307     </div>
2629 08 Sep 06 nicklas 308
5922 11 Jan 12 nicklas 309     <base:buttongroup subclass="dialogbuttons">
6305 09 Aug 13 nicklas 310       <base:button id="btnSave" title="Save" />
6305 09 Aug 13 nicklas 311       <base:button id="close" title="Cancel" />
5922 11 Jan 12 nicklas 312     </base:buttongroup>
2629 08 Sep 06 nicklas 313   </base:body>
2629 08 Sep 06 nicklas 314   </base:page>
2629 08 Sep 06 nicklas 315   <%
2629 08 Sep 06 nicklas 316 }
2629 08 Sep 06 nicklas 317 finally
2629 08 Sep 06 nicklas 318 {
2629 08 Sep 06 nicklas 319   if (dc != null) dc.close();
2629 08 Sep 06 nicklas 320 }
2629 08 Sep 06 nicklas 321 %>