source: trunk/www/views/experiments/bioassaysets/view_bioassayset.jsp @ 4910

Last change on this file since 4910 was 4910, checked in by Nicklas Nordborg, 13 years ago

References #1120: The dynamic part of BASE should keep track whether intensity data is in log space or not

Added this flag to bioassay set and made it possible to modify it in the web interface.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.7 KB
Line 
1<%-- $Id: view_bioassayset.jsp 4910 2009-04-29 09:05:20Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.ItemContext"
31  import="net.sf.basedb.core.Permission"
32  import="net.sf.basedb.core.Experiment"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.BioAssay"
35  import="net.sf.basedb.core.Transformation"
36  import="net.sf.basedb.core.Job"
37  import="net.sf.basedb.core.PluginDefinition"
38  import="net.sf.basedb.core.PluginConfiguration"
39  import="net.sf.basedb.core.User"
40  import="net.sf.basedb.core.ItemQuery"
41  import="net.sf.basedb.core.ItemResultList"
42  import="net.sf.basedb.core.Include"
43  import="net.sf.basedb.core.PermissionDeniedException"
44  import="net.sf.basedb.core.PluginDefinition"
45  import="net.sf.basedb.core.ParameterInfo"
46  import="net.sf.basedb.core.RawDataType"
47  import="net.sf.basedb.core.BasicItem"
48  import="net.sf.basedb.core.Nameable"
49  import="net.sf.basedb.core.File"
50  import="net.sf.basedb.core.plugin.GuiContext"
51  import="net.sf.basedb.core.plugin.Plugin"
52  import="net.sf.basedb.core.query.Orders"
53  import="net.sf.basedb.core.query.Hql"
54  import="net.sf.basedb.clients.web.Base"
55  import="net.sf.basedb.clients.web.PermissionUtil"
56  import="net.sf.basedb.clients.web.util.HTML"
57  import="net.sf.basedb.util.Values"
58  import="net.sf.basedb.clients.web.util.NameablePluginAdaptor"
59  import="net.sf.basedb.util.formatter.Formatter"
60  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
61  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
62  import="net.sf.basedb.clients.web.extensions.JspContext"
63  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
64  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
65  import="net.sf.basedb.clients.web.extensions.plot.OverviewPlotAction"
66  import="net.sf.basedb.clients.web.extensions.plot.PlotGenerator"
67  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
68  import="net.sf.basedb.util.extensions.ActionIterator"
69  import="java.util.Date"
70  import="java.util.Map"
71  import="java.util.Set"
72  import="java.util.List"
73  import="java.util.Iterator"
74%>
75<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
76<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
77<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
78<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
79<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
80<%!
81  private static final Item itemType = Item.BIOASSAYSET;
82  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
83%>
84<%
85final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
86final String ID = sc.getId();
87final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
88final int itemId = cc.getId();
89final String tabId = Values.getString(request.getParameter("tab"), "properties");
90
91final float scale = Base.getScale(sc);
92final String root = request.getContextPath();
93final DbControl dc = sc.newDbControl();
94try
95{
96  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
97
98  String title = null;
99  final BioAssaySet bioAssaySet = BioAssaySet.getById(dc, itemId);
100  final Experiment experiment = bioAssaySet.getExperiment();
101  final int experimentId = experiment.getId();
102  final boolean hasDbSpots = bioAssaySet.getNumSpots() > 0;
103  Transformation transformation = bioAssaySet.getTransformation();
104  RawDataType rawDataType = experiment.getRawDataType();
105 
106  Job job = null;
107  boolean readJob = true;
108  PluginDefinition plugin = null;
109  boolean readPlugin = true;
110  PluginConfiguration configuration = null;
111  boolean readConfiguration = true;
112
113  try
114  {
115    job = transformation.getJob();
116  }
117  catch (PermissionDeniedException ex)
118  {
119    readJob = false;
120    readPlugin = false;
121    readConfiguration = false;
122  }
123  if (job != null)
124  {
125    try
126    {
127      plugin = job.getPluginDefinition();
128    }
129    catch (PermissionDeniedException ex)
130    {
131      readPlugin = false;
132    }
133    try
134    {
135      configuration = job.getPluginConfiguration();
136    }
137    catch (PermissionDeniedException ex)
138    {
139      readConfiguration = false;
140    }
141  }
142 
143  final boolean createPermission = experiment.hasPermission(Permission.USE);
144  final boolean writePermission = bioAssaySet.hasPermission(Permission.WRITE);
145  final boolean deletePermission = bioAssaySet.hasPermission(Permission.DELETE);
146  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
147  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
148  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioAssaySet);
149  ExtensionsInvoker toolbarInvoker = ToolbarUtil.useExtensions(jspContext);
150  ExtensionsInvoker overviewPlotInvoker = ExtensionsControl.useExtensions(jspContext, 
151      "net.sf.basedb.clients.web.bioassayset.overviewplots");
152  %>
153  <base:page title="<%=title%>">
154  <base:head scripts="table.js,tabcontrol.js,newjoust.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css,newjoust.css">
155    <ext:scripts context="<%=jspContext%>" />
156    <ext:stylesheets context="<%=jspContext%>" />
157    <script language="JavaScript">
158    function editItem()
159    {
160      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
161    }
162    function deleteItem()
163    {
164      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
165    }
166    function restoreItem()
167    {
168      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
169    }
170    function switchTab(tabControlId, tabId)
171    {
172      if (TabControl.isActive(tabControlId, tabId)) return;
173      if (tabId == 'bioassays')
174      {
175        location.href = '../bioassays/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
176      }
177      else if (tabId == 'spotdata')
178      {
179        location.href = '../spotdata/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>';
180      }
181      else if ((tabId == 'overviewplots' || tabId == 'cfplots') && tabId != '<%=tabId%>')
182      {
183        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
184      }
185      else
186      {
187        TabControl.setActiveTab(tabControlId, tabId);
188      }
189    }
190    function runItemPlugin(cmd)
191    {
192      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&experiment_id=<%=experimentId%>&item_id=<%=itemId%>', 'RunPlugin'+cmd, 740, 540);
193    }
194
195    function ImageQueue(baseId)
196    {
197      this.images = new Array();
198      this.nextImage = 0;
199
200      this.addImage = function(imageId, url)
201      {
202        this.images[this.images.length] = imageId;
203        var img = document.getElementById(imageId);
204        img.realSrc = url;
205      }
206
207      this.loadNextImage = function()
208      {
209        if (this.images.length <= this.nextImage) return;
210        var imageId = this.images[this.nextImage];
211        var img = document.getElementById(imageId);
212        img.src = '../../../images/plot_generating_400x300.gif';
213        img.realImg = new Image();
214        img.realImg.onload = function()
215        {
216          img.src = img.realImg.src;
217          setTimeout('loadNextImage()', 100);
218        };
219        img.realImg.src = img.realSrc;
220        this.nextImage++;
221      }
222    }
223   
224    var plotQueue = new Array();
225    var currentQueue = null;
226    function registerImage(baseId, plotId, url)
227    {
228      if (!currentQueue) currentQueue = baseId;
229      var imageQueue = plotQueue[baseId];
230      if (!imageQueue)
231      {
232        imageQueue = new ImageQueue(baseId);
233        plotQueue[baseId] = imageQueue;
234      }
235      var imageId = baseId + '.' + plotId;
236      imageQueue.addImage(imageId, url);
237    }
238    function switchOverview(tabControlId, tabId)
239    {
240      currentQueue = tabId;
241      TabControl.setActiveTab(tabControlId, tabId);
242      loadNextImage();
243    }
244    function loadNextImage()
245    {
246      var imageQueue = plotQueue[currentQueue];
247      if (imageQueue) imageQueue.loadNextImage();
248    }
249    </script>
250    <style>
251    .plot {
252      border: 1px solid #666666;
253      background-image: url('../../../images/plot_empty_400x300.png');
254      margin: 2px;
255    }
256    </style>
257  </base:head>
258  <base:body onload="loadNextImage()">
259    <p>
260    <p:path>
261      <p:pathelement title="Experiments" href="<%="../index.jsp?ID="+ID%>" />
262      <p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
263        href="<%="index.jsp?ID="+ID+"&experiment_id="+experimentId%>" />
264      <p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" />
265    </p:path>
266   
267    <t:tabcontrol id="view" active="<%=tabId%>" switch="switchTab" remember="false">
268    <t:tab id="properties" title="Properties">
269   
270    <tbl:toolbar
271      >
272      <tbl:button 
273        disabled="<%=writePermission ? false : true%>" 
274        image="<%=writePermission ? "edit.gif" : "edit_disabled.gif"%>" 
275        onclick="editItem()" 
276        title="Edit&hellip;" 
277        tooltip="<%=writePermission ? "Edit this bioassay set" : "You do not have permission to edit this bioassay set"%>" 
278      />
279      <tbl:button 
280        disabled="<%=deletePermission ? false : true%>" 
281        image="<%=deletePermission ? "delete.gif" : "delete_disabled.gif"%>" 
282        onclick="deleteItem()" 
283        title="Delete"
284        visible="<%=!bioAssaySet.isRemoved()%>"
285        tooltip="<%=deletePermission ? "Delete this bioassay set" : "You do not have permission to delete this bioassay set"%>" 
286      />
287      <tbl:button 
288        disabled="<%=writePermission ? false : true%>" 
289        image="<%=writePermission ? "restore.gif" : "restore_disabled.gif"%>" 
290        onclick="restoreItem()" 
291        title="Restore"
292        visible="<%=bioAssaySet.isRemoved()%>"
293        tooltip="<%=writePermission ? "Restore this bioassay set" : "You do not have permission to restore this bioassay set"%>" 
294      />
295      <tbl:button 
296        image="import.gif" 
297        onclick="runItemPlugin('ImportItem')" 
298        title="Import&hellip;" 
299        tooltip="Import data" 
300        visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
301      />
302      <tbl:button 
303        image="export.gif" 
304        onclick="runItemPlugin('ExportItem')" 
305        title="Export&hellip;" 
306        tooltip="Export data" 
307        visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
308      />
309      <tbl:button
310        image="plotter.gif"
311        onclick="<%="openPlotTool(" + itemId + ")"%>"
312        title="Plot tool&hellip;"
313        tooltip="A simple tool for generating plots"
314        visible="<%=hasDbSpots%>"
315      />
316      <tbl:button
317        image="explorer.png"
318        onclick="<%="openExperimentExplorer(" + itemId + ")"%>"
319        title="Experiment explorer"
320        tooltip="View the data reporter by reporter"
321        visible="<%=hasDbSpots%>"
322      />
323      <tbl:button
324        disabled="<%=!createPermission%>"
325        image="<%=createPermission ? "filter.gif" : "filter_disabled.gif"%>"
326        onclick="<%="filter(" + itemId +")"%>"
327        title="Filter bioassay set&hellip;"
328        tooltip="<%=createPermission ? 
329          "Create a new bioassay set by filtering this bioassayset" :
330          "You do not have permission analyze this experiment"%>"
331        visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE)%>"
332      />
333      <tbl:button 
334        image="runplugin.gif" 
335        onclick="runItemPlugin('RunPlugin')"
336        title="Run plugin&hellip;" 
337        tooltip="Run a plugin" 
338        visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
339      />
340      <tbl:button 
341        disabled="<%=!createPermission%>"
342        image="<%=createPermission ? "runplugin.gif" : "runplugin_disabled.gif"%>" 
343        onclick="<%="runAnalysisPlugin(" + itemId + ")"%>"
344        title="Run analysis&hellip;" 
345        tooltip="<%=createPermission ? "Run an analysis plugin" : 
346          "You do not have permission to analyze this experiment"%>"
347        visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE)%>"
348      />
349      <ext:render extensions="<%=toolbarInvoker%>" context="<%=jspContext%>" 
350        wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
351      <tbl:button
352        image="help.gif"
353        onclick="<%="Main.openHelp('" + ID +"', 'bioassayset.view.properties')"%>"
354        title="Help&hellip;"
355        tooltip="Get help about this page"
356      />
357      </tbl:toolbar>
358    <div class="boxedbottom">
359      <div class="itemstatus">Permissions on this item: <i><%=PermissionUtil.getFullPermissionNames(bioAssaySet)%></i></div>
360      <%
361      if (bioAssaySet.isRemoved())
362      {
363        %>
364        <div class="itemstatus">
365          <base:icon image="deleted.gif" 
366            visible="<%=bioAssaySet.isRemoved()%>"> This item has been flagged for deletion<br></base:icon>
367        </div>
368        <%
369      }
370      %>
371     
372      <table width="100%">
373      <tr valign="top">
374      <td width="50%">
375        <h4>Bioassay set</h4>
376        <table class="form" cellspacing=0>
377        <tr>
378          <td class="prompt">Name</td>
379          <td><%=HTML.encodeTags(bioAssaySet.getName())%></td>
380        </tr>
381        <tr>
382          <td class="prompt">Experiment</td>
383          <td><%=Base.getLinkedName(ID, experiment, false, writePermission)%>
384          (<%=experiment.getRawDataType()%>)</td>
385        </tr>
386        <tr>
387          <td class="prompt">Intensity transformation</td>
388          <td><%=bioAssaySet.getIntensityTransform().toString()%></td>
389        </tr>
390        <tr>
391          <td class="prompt">Spots</td>
392          <td>db: <%=bioAssaySet.getNumSpots()%>; file: <%=bioAssaySet.getNumFileSpots()%></td>
393        </tr>
394        <tr>
395          <td class="prompt">Reporters</td>
396          <td>db: <%=bioAssaySet.getNumReporters()%>; file: <%=bioAssaySet.getNumFileReporters()%></td>
397        </tr>
398        <tr>
399          <td class="prompt">Description</td>
400          <td><%=HTML.niceFormat(bioAssaySet.getDescription())%></td>
401        </tr>
402        </table>
403       
404        <h4>Transformation &amp; job</h4>
405        <table class="form" cellspacing=0>
406        <tr>
407          <td class="prompt">Transformation</td>
408          <td><%=Base.getLinkedName(ID, transformation, false, 
409              transformation.hasPermission(Permission.WRITE))%></td>
410        </tr>
411        <tr>
412          <td class="prompt">Job</td>
413          <td><%=Base.getLinkedName(ID, job, !readJob, false)%></td>
414        </tr>
415        <tr valign=top>
416          <td class="prompt">Started</td>
417          <td>
418            <%=job == null ? "" : dateTimeFormatter.format(job.getStarted())%>
419          </td>
420        </tr>
421        <tr valign=top>
422          <td class="prompt">Ended</td>
423          <td>
424            <%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%>
425          </td>
426        </tr>
427        <tr valign=top>
428          <td class="prompt">Server</td>
429          <td>
430            <%=job == null ? "" : HTML.encodeTags(job.getServer())%>
431          </td>
432        </tr>
433        <tr>
434          <td class="prompt">Description</td>
435          <td><%=HTML.niceFormat(transformation.getDescription())%></td>
436        </tr>
437        </table>
438      </td>
439      <td width="50%">
440        <h4>Plugin &amp; parameters</h4>
441        <table class="form" cellspacing=0>
442        <tr>
443          <td class="prompt">Plugin</td>
444          <td><%=Base.getLinkedName(ID, plugin == null ? null : new NameablePluginAdaptor(plugin), 
445              !readPlugin, plugin != null && plugin.hasPermission(Permission.WRITE))%></td>
446        </tr>
447        <tr>
448          <td class="prompt">Plugin configuration</td>
449          <td><%=Base.getLinkedName(ID, configuration, !readConfiguration, 
450            configuration != null && configuration.hasPermission(Permission.WRITE))%></td>
451        </tr>
452        <%
453        if (job != null)
454        {
455          for (String name : job.getParameterNames())
456          {
457            StringBuilder sb = new StringBuilder();
458            String displayValue = "";
459            String description = "";
460            try
461            {
462              ParameterInfo pi = job.getParameterInfo(name);
463              if (pi.getLabel() != null) name = HTML.encodeTags(pi.getLabel());
464              description = HTML.encodeTags(pi.getDescription());
465              List<?> values = pi.getValues();
466              int i = 0;
467              for (Object value : values)
468              {
469                if (value != null)
470                {
471                  if (i > 0) sb.append(", ");
472                  i++;
473                  if (value instanceof BasicItem)
474                  {
475                    BasicItem item = (BasicItem)value;
476                    String itemName = "";
477                    if (item instanceof File)
478                    {
479                      itemName = ((File)item).getPath().toString();
480                    }
481                    else if (item instanceof Nameable)
482                    {
483                      itemName = ((Nameable)item).getName();
484                    }
485                    else
486                    {
487                      itemName = item.toString();
488                    }
489                    sb.append(Base.getLink(ID, HTML.encodeTags(itemName), 
490                      item.getType(), item.getId(), item.hasPermission(Permission.WRITE)));
491                  }
492                  else if (value instanceof Date)
493                  {
494                    sb.append(dateFormatter.format((Date)value));
495                  }
496                  else
497                  {
498                    sb.append(HTML.encodeTags(value.toString()));
499                  }
500                }
501              }
502              displayValue = sb.toString();
503            }
504            catch (Throwable ex)
505            {
506              displayValue = "<i>ERROR: "+ex.getMessage()+"</i>";
507            }
508            %>
509            <tr>
510            <td class="prompt"><span title="<%=description%>"><%=name%></span></td>
511              <td>
512                <%=displayValue%>
513              </td>
514            </tr>
515            <%
516          }
517        }
518        %>
519        </table>
520
521      </td>
522      </tr>
523      </table>
524     
525      <jsp:include page="../../../common/datafiles/list_files.jsp">
526        <jsp:param name="item_type" value="<%=itemType.name()%>" />
527        <jsp:param name="item_id" value="<%=itemId%>" />
528        <jsp:param name="ID" value="<%=ID%>" />
529      </jsp:include>
530     
531      <p>
532      <h4 class="docked">Analysis subtree</h4>
533      <jsp:include page="analysis_tree.jsp">
534        <jsp:param name="ID" value="<%=ID%>" />
535        <jsp:param name="experiment_id" value="<%=experimentId%>" />
536        <jsp:param name="item_id" value="<%=itemId%>" />
537      </jsp:include>
538      </div>
539      </t:tab>
540     
541      <t:tab id="annotations" title="Annotations" 
542        tooltip="View annotation values">
543        <div class="boxed">
544        <jsp:include page="../../../common/annotations/list_annotations.jsp">
545          <jsp:param name="item_type" value="<%=itemType.name()%>" />
546          <jsp:param name="item_id" value="<%=itemId%>" />
547          <jsp:param name="ID" value="<%=ID%>" />
548        </jsp:include>
549        </div>
550      </t:tab>
551     
552      <t:tab id="bioassays" title="Bioassays" />
553     
554      <t:tab id="spotdata" title="Spot data" 
555        visible="<%=hasDbSpots%>" />
556     
557      <t:tab id="overviewplots" title="Overview plots" 
558        tooltip="Predefined plots for all bioassays in this bioassay set"
559        visible="<%=overviewPlotInvoker.getNumExtensions() > 0%>">
560        <%
561        if ("overviewplots".equals(tabId))
562        {
563          ActionIterator<OverviewPlotAction> plots = overviewPlotInvoker.iterate();
564          StringBuilder script = new StringBuilder();
565          %>
566          <t:tabcontrol id="overviewplots" switch="switchOverview">
567          <% 
568          while (plots.hasNext())
569          {
570            OverviewPlotAction action = plots.next();
571            String baseId = plots.getExtension().getId() + "." + action.getId();
572            %>
573            <t:tab 
574              tooltip="<%=action.getDescription() %>"
575              title="<%=action.getTitle()%>"
576              id="<%=baseId%>"
577              >
578              <%
579              for (PlotGenerator generator : action.getPlotGenerators())
580              {
581                String plotId = generator.getId();
582                script.append("registerImage('").append(baseId).append("','")
583                    .append(plotId).append("','")
584                    .append(HTML.javaScriptEncode(generator.getUrl())).append("');\n");
585                %><img id="<%=baseId + "." + plotId%>"
586                  class="plot"
587                  src="../../../images/transparent_pixel.gif"
588                  width="<%=generator.getWidth()%>"
589                  height="<%=generator.getHeight()%>"
590                  alt="<%=HTML.encodeTags(generator.getTitle())%>"
591                >&#8203;&#8203;<%
592              }
593              %>
594            </t:tab>
595            <%
596          }
597          %>
598          </t:tabcontrol>
599          <script language="JavaScript">
600          <%=script%>
601          </script>
602          <%
603        }
604        %>
605      </t:tab>
606      </t:tabcontrol>
607
608  </base:body>
609  </base:page>
610  <%
611}
612finally
613{
614  if (dc != null) dc.close();
615}
616
617%>
Note: See TracBrowser for help on using the repository browser.