source: trunk/www/biomaterials/samples/view_sample.jsp @ 6053

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

Fixes #1689: The list with parent and child items on the single-item pages for biomaterial should include the subtype

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 20.0 KB
Line 
1<%-- $Id: view_sample.jsp 6053 2012-05-03 07:27:21Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Johan Enell, Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Martin Svensson
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 pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.SystemItems"
30  import="net.sf.basedb.core.Extract"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.Permission"
34  import="net.sf.basedb.core.Sample"
35  import="net.sf.basedb.core.BioSource"
36  import="net.sf.basedb.core.BioMaterial"
37  import="net.sf.basedb.core.BioMaterialEvent"
38  import="net.sf.basedb.core.BioMaterialEventSource"
39  import="net.sf.basedb.core.BioWell"
40  import="net.sf.basedb.core.Protocol"
41  import="net.sf.basedb.core.ItemSubtype"
42  import="net.sf.basedb.core.User"
43  import="net.sf.basedb.core.Group"
44  import="net.sf.basedb.core.ItemProxy"
45  import="net.sf.basedb.core.ItemQuery"
46  import="net.sf.basedb.core.ItemResultList"
47  import="net.sf.basedb.core.query.ResultList"
48  import="net.sf.basedb.core.SpecialQuery"
49  import="net.sf.basedb.core.Include"
50  import="net.sf.basedb.core.MultiPermissions"
51  import="net.sf.basedb.core.query.Orders"
52  import="net.sf.basedb.core.query.Hql"
53  import="net.sf.basedb.core.PermissionDeniedException"
54  import="net.sf.basedb.core.PluginDefinition"
55  import="net.sf.basedb.core.plugin.GuiContext"
56  import="net.sf.basedb.core.plugin.Plugin"
57  import="net.sf.basedb.core.Project"
58  import="net.sf.basedb.clients.web.Base"
59  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
60  import="net.sf.basedb.clients.web.PermissionUtil"
61  import="net.sf.basedb.clients.web.util.HTML"
62  import="net.sf.basedb.util.Values"
63  import="net.sf.basedb.util.formatter.Formatter"
64  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
65  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
66  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
67  import="net.sf.basedb.clients.web.extensions.JspContext"
68  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
69  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
70  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
71  import="java.util.ArrayList"
72  import="java.util.Collections"
73  import="java.util.Date"
74  import="java.util.Map"
75  import="java.util.Set"
76  import="java.util.List"
77%>
78<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
79<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
80<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
81<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
82<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
83<%!
84  private static final Item itemType = Item.SAMPLE;
85  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
86%>
87<%
88final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
89final String ID = sc.getId();
90final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
91final int itemId = cc.getId();
92final String tab = Values.getString(request.getParameter("tab"), "properties");
93final float scale = Base.getScale(sc);
94final DbControl dc = sc.newDbControl();
95try
96{
97  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
98  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
99
100  WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
101  WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
102 
103  String title = null;
104  Sample sample = Sample.getById(dc, itemId);
105  BioMaterialEvent creationEvent = sample.getCreationEvent();
106 
107  final boolean usePermission = sample.hasPermission(Permission.USE);
108  final boolean writePermission = sample.hasPermission(Permission.WRITE);
109  final boolean deletePermission = sample.hasPermission(Permission.DELETE);
110  final boolean sharePermission = sample.hasPermission(Permission.SET_PERMISSION);
111  final boolean setOwnerPermission = sample.hasPermission(Permission.SET_OWNER);
112  final boolean isRemoved = sample.isRemoved();
113  final boolean isUsed = isRemoved && sample.isUsed();
114  final boolean deletePermanentlyPermission = deletePermission && !isUsed;
115  final boolean isOwner = sample.isOwner();
116  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, sample);
117  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
118  %>
119  <base:page title="<%=title%>">
120  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
121    <ext:scripts context="<%=jspContext%>" />
122    <ext:stylesheets context="<%=jspContext%>" />
123    <script language="JavaScript">
124    function editItem()
125    {
126      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
127    }
128    function shareItem()
129    {
130      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id=<%=itemId%>', 'ShareSample', 600, 400);
131    }
132    function newExtract()
133    {
134      Main.viewOrEditItem('<%=ID%>', 'EXTRACT', 0, true, '&sample_id=<%=itemId%>');
135    }
136    function newSample()
137    {
138      Main.viewOrEditItem('<%=ID%>', 'SAMPLE', 0, true, '&sample_id=<%=itemId%>');
139    }
140    function deleteItem()
141    {
142      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&item_id=<%=itemId%>');
143    }
144    function restoreItem()
145    {
146      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&item_id=<%=itemId%>');
147    }
148    function deleteItemPermanently()
149    {
150      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', <%=itemId%>, '&callback=itemDeleted');
151    }
152    function itemDeleted()
153    {
154      Main.listItems('<%=ID%>', '<%=itemType.name()%>');
155    }
156    function showUsingItems()
157    {
158      Main.showUsingItems('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>);
159    }
160    function setOwner()
161    {
162      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=SetOwnerOfItem&item_id=<%=itemId%>', 'SetOwnerOfItem', 450, 300);
163    }
164    function runPlugin(cmd)
165    {
166      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&item_id=<%=itemId%>', 'RunPlugin'+cmd, 750, 500);
167    }
168    function viewEvents()
169    {
170      location.href = '../events/index.jsp?ID=<%=ID%>&cmd=List&biomaterial_id=<%=itemId%>&biomaterial_type=<%=itemType.name()%>';
171    }
172    function switchTab(tabControlId, tabId)
173    {
174      if (TabControl.isActive(tabControlId, tabId)) return;
175      if ((tabId == 'overview' || tabId == 'history') && tabId != '<%=tab%>')
176      {
177        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=itemId%>&tab='+tabId;
178      }
179      else if (tabId == 'events')
180      {
181        viewEvents();
182      }
183      else
184      {
185        TabControl.setActiveTab(tabControlId, tabId);
186      }
187    }
188    </script>
189  </base:head>
190  <base:body>
191    <p:path><p:pathelement 
192      title="Samples" href="<%="index.jsp?ID="+ID%>" /><p:pathelement 
193      title="<%=HTML.encodeTags(sample.getName())%>" /></p:path>
194   
195    <t:tabcontrol id="main" 
196      subclass="content mastertabcontrol"
197      active="<%=tab%>" switch="switchTab" remember="false">
198    <t:tab id="properties" title="Properties">
199
200      <div>
201      <table class="fullform bottomborder">
202      <tr>
203        <th class="itemstatus">
204          <base:icon 
205            image="shared.png" 
206            visible="<%=sample.isShared()%>"
207            tooltip="This item is shared to other users, groups and/or projects"
208          />
209          <base:icon 
210            image="deleted.png"
211            onclick="deleteItemPermanently()"
212            tooltip="This item has been flagged for deletion. Click to delete it now."
213            enabled="<%=deletePermanentlyPermission %>"
214            visible="<%=isRemoved%>" 
215          />
216          <base:icon image="used.png" 
217            onclick="showUsingItems()"
218            tooltip="This item is used by other items and can't be permanently deleted. Show the items that are using this one"
219            visible="<%=isRemoved && isUsed%>" />
220        </th>
221        <td style="padding: 0px;">
222
223        <tbl:toolbar subclass="bottomborder">
224          <tbl:button 
225            disabled="<%=!writePermission%>" 
226            image="edit.png" 
227            onclick="editItem()" 
228            title="Edit&hellip;" 
229            tooltip="<%=writePermission ? "Edit this sample" : "You do not have permission to edit this sample"%>" 
230          />
231          <tbl:button 
232            disabled="<%=!deletePermission%>" 
233            image="delete.png" 
234            onclick="deleteItem()" 
235            title="Delete"
236            visible="<%=!sample.isRemoved()%>"
237            tooltip="<%=deletePermission ? "Delete this sample" : "You do not have permission to delete this sample"%>" 
238          />
239          <tbl:button 
240            disabled="<%=!writePermission%>" 
241            image="restore.png" 
242            onclick="restoreItem()" 
243            title="Restore"
244            visible="<%=sample.isRemoved()%>"
245            tooltip="<%=writePermission ? "Restore this sample" : "You do not have permission to restore this sample"%>" 
246          />
247          <tbl:button 
248            disabled="<%=!sharePermission%>"
249            image="share.png"
250            onclick="shareItem()" 
251            title="Share&hellip;" 
252            tooltip="<%=sharePermission ? "Share this sample to other user, groups and projects" : "You do not have permission to share this sample"%>"
253          />
254          <tbl:button 
255            disabled="<%=!setOwnerPermission%>"
256            image="take_ownership.png"
257            onclick="setOwner()" 
258            title="Set owner&hellip;"
259            tooltip="<%=setOwnerPermission ? "Change owner of this item" : "You do not have permission to change ownership of this item"%>"
260          />
261          <tbl:button
262            image="add.png"
263            onclick="newSample()"
264            title="New child sample&hellip;"
265            tooltip="Create a new child sample from this sample"
266            visible="<%=sc.hasPermission(Permission.CREATE, Item.SAMPLE) && usePermission%>"
267          />
268          <tbl:button
269            image="add.png"
270            onclick="newExtract()"
271            title="New child extract&hellip;"
272            tooltip="Create a new extract from this sample"
273            visible="<%=sc.hasPermission(Permission.CREATE, Item.EXTRACT) && usePermission%>"
274          />
275          <tbl:button 
276            image="import.png" 
277            onclick="runPlugin('ImportItem')" 
278            title="Import&hellip;" 
279            tooltip="Import data" 
280            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
281          />
282          <tbl:button 
283            image="export.png" 
284            onclick="runPlugin('ExportItem')" 
285            title="Export&hellip;" 
286            tooltip="Export data" 
287            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
288          />
289          <tbl:button 
290            image="runplugin.png" 
291            onclick="runPlugin('RunPlugin')" 
292            title="Run plugin&hellip;" 
293            tooltip="Run a plugin" 
294            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
295          /> 
296          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
297            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
298          <tbl:button
299            image="help.png"
300            onclick="<%="Main.openHelp('" + ID +"', 'sample.view.properties')"%>"
301            title="Help&hellip;"
302            tooltip="Get help about this page"
303          />   
304          </tbl:toolbar>
305        </td>
306      </tr>
307      <tr>
308        <th>Name</th>
309        <td><%=HTML.encodeTags(sample.getName())%></td>
310      </tr>
311      <tr>
312        <th>Type</th>
313        <td><base:propertyvalue item="<%=sample%>" property="itemSubtype" /></td>
314      </tr>
315      <tr>
316        <th>External ID</th>
317        <td><%=HTML.encodeTags(sample.getExternalId())%></td>
318      </tr>
319      <tr>
320        <th>Created</th>
321        <td><%=dateFormatter.format(creationEvent.getEventDate())%></td>
322      </tr>
323      <tr>
324        <th>Registered</th>
325        <td><%=dateFormatter.format(creationEvent.getEntryDate())%></td>
326      </tr>
327      <tr>
328        <th>Protocol</th>
329        <td><base:propertyvalue item="<%=creationEvent%>" property="protocol" /></td>
330      </tr>
331      <tr>
332        <th>Original quantity</th>
333        <td><%=Values.formatNumber(sample.getOriginalQuantity(), 2, " µg")%></td>
334      </tr>
335      <tr>
336        <th class="subprompt">- remaining</th>
337        <td><%=Values.formatNumber(sample.getRemainingQuantity(), 2, " µg")%></td>
338      </tr>
339      <tr>
340        <th>Bioplate</th>
341        <td>
342          <base:propertyvalue item="<%=sample%>" property="bioWell.bioPlate" />
343          <%
344          try
345          {
346            BioWell well = sample.getBioWell();
347            if (well != null)
348            {
349              %>
350              [<%=rowFormatter.format(well.getRow())%><%=columnFormatter.format(well.getColumn())%>]
351              <base:icon image="locked.png"  visible="<%=sample.isLockedInWell()%>"/>
352            <%
353            }
354          }
355          catch (PermissionDeniedException ex)
356          {}
357          %>
358        </td>
359      </tr>
360      <tr>
361        <th>Owner</th>
362        <td><base:propertyvalue item="<%=sample%>" property="owner" /></td>
363      </tr>
364      <tr>
365        <th>Permissions</th>
366        <td><%=PermissionUtil.getFullPermissionNames(sample)%></td>
367      </tr>
368      <tr>
369        <th>Description</th>
370        <td><%=HTML.niceFormat(sample.getDescription())%></td>
371      </tr>
372      </table>
373      </div>
374     
375      <%
376      SpecialQuery<BioMaterialEventSource> sourceQuery = creationEvent.getEventSources();
377      sourceQuery.order(Orders.asc(Hql.property("bioMaterial.name")));
378      ResultList<BioMaterialEventSource> sources = sourceQuery.list(dc);
379      %>
380      <base:section 
381        id="parentsSection" 
382        title="<%="Parent items (" + sources.size() + ")"%>"
383        context="<%=cc%>"
384        >
385        <%
386        if (sources.size() == 0)
387        {
388          %>
389          <div class="messagecontainer note">
390          This sample doesn't have any parent items
391          (or, you don't have permission to view them).
392          </div>
393          <%
394        }
395        else
396        {
397          %>
398          <tbl:table
399            id="parents"
400            columns="all"
401          >
402          <tbl:columndef 
403            id="name"
404            title="Name"
405          />
406          <tbl:columndef 
407            id="type"
408            title="Type"
409          />
410          <tbl:columndef 
411            id="quantity"
412            title="Used quantity (µg)"
413          />
414          <tbl:columndef 
415            id="description"
416            title="Description"
417          />
418          <tbl:data>
419            <tbl:headers>
420              <tbl:headerrow>
421                <tbl:columnheaders />
422              </tbl:headerrow>
423            </tbl:headers>
424            <tbl:rows>
425            <%
426            for (BioMaterialEventSource item : sources)
427            {
428              BioMaterial bm = null;
429              ItemSubtype subtype = null;
430              try
431              {
432                bm = item.getBioMaterial();
433                subtype = bm.getItemSubtype();
434              }
435              catch (PermissionDeniedException ex)
436              {}
437              %>
438              <tbl:row>
439                <tbl:cell column="name"><base:icon 
440                    image="deleted.png" 
441                    tooltip="This item has been scheduled for deletion" 
442                    visible="<%=bm != null && bm.isRemoved()%>"
443                  /><%=Base.getLinkedName(ID, bm, bm == null, true)%></tbl:cell>
444                <tbl:cell column="type">
445                  <%
446                  if (subtype != null)
447                  {
448                    %>
449                    <%=Base.getLinkedName(ID, subtype, false, true)%> <span class="itemsubtype">(<%=bm.getType() %>)</span>
450                    <%
451                  }
452                  else
453                  {
454                    %>
455                    <%=bm != null ? bm.getType() : "" %>
456                    <%
457                  }
458                  %>
459                </tbl:cell>
460                <tbl:cell column="quantity"><%=Values.formatNumber(item.getUsedQuantity(), 2)%></tbl:cell>
461                <tbl:cell column="description"><%=HTML.encodeTags(bm == null ? "" : bm.getDescription())%></tbl:cell>
462              </tbl:row>
463              <%
464            }
465            %>
466            </tbl:rows>
467          </tbl:data>
468          </tbl:table>
469          <%
470        }
471        %>
472      </base:section>
473      <%
474      SpecialQuery<BioMaterialEventSource> childQuery = sample.getChildCreationEvents();
475      childQuery.join(Hql.innerJoin("es", "event", "evt", true));
476      childQuery.join(Hql.innerJoin("evt", "bioMaterial", "bm", true));
477      childQuery.order(Orders.asc(Hql.property("bm", "name")));
478      ResultList<BioMaterialEventSource> children = childQuery.list(dc);
479      %>
480      <base:section 
481        id="childSection" 
482        title="<%="Child items (" + children.size() + ")"%>"
483        context="<%=cc%>"
484        >
485        <%
486        if (children.size() == 0)
487        {
488          %>
489          <div class="messagecontainer help">
490          No child items have been created from this sample
491          (or, you don't have permission to view them).
492          </div>
493          <%
494        }
495        else
496        {
497          %>
498          <tbl:table 
499            id="children"
500           
501            columns="all"
502            >
503            <tbl:columndef 
504              id="name"
505              title="Name"
506            />
507            <tbl:columndef 
508              id="type"
509              title="Type"
510            />
511            <tbl:columndef 
512              id="quantity"
513              title="Used quantity (µg)"
514            />
515            <tbl:columndef 
516              id="description"
517              title="Description"
518            />
519            <tbl:data>
520              <tbl:headers>
521                <tbl:headerrow>
522                  <tbl:columnheaders />
523                </tbl:headerrow>
524              </tbl:headers>
525              <tbl:rows>
526              <%
527              for (BioMaterialEventSource item : children)
528              {
529                BioMaterial bm = null;
530                ItemSubtype subtype = null;
531                try
532                {
533                  bm = item.getEvent().getBioMaterial();
534                  subtype = bm.getItemSubtype();
535                }
536                catch (PermissionDeniedException ex)
537                {}
538                %>
539                <tbl:row>
540                  <tbl:cell column="name"><base:icon 
541                      image="deleted.png" 
542                      tooltip="This item has been scheduled for deletion" 
543                      visible="<%=bm != null && bm.isRemoved()%>"
544                    /><%=Base.getLinkedName(ID, bm, bm == null, true)%></tbl:cell>
545                  <tbl:cell column="type">
546                    <%
547                    if (subtype != null)
548                    {
549                      %>
550                      <%=Base.getLinkedName(ID, subtype, false, true)%> <span class="itemsubtype">(<%=bm.getType() %>)</span>
551                      <%
552                    }
553                    else
554                    {
555                      %>
556                      <%=bm != null ? bm.getType() : "" %>
557                      <%
558                    }
559                    %>
560                  </tbl:cell>
561                  <tbl:cell column="quantity"><%=Values.formatNumber(item.getUsedQuantity(), 2)%></tbl:cell>
562                  <tbl:cell column="description"><%=HTML.encodeTags(bm == null ? "" : bm.getDescription())%></tbl:cell>
563                </tbl:row>
564                <%
565              }
566              %>           
567              </tbl:rows>
568            </tbl:data>
569          </tbl:table>
570          <%
571        }
572        %>
573      </base:section>
574     
575      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
576        <jsp:param name="ID" value="<%=ID%>" />
577        <jsp:param name="item_type" value="<%=itemType.name()%>" />
578        <jsp:param name="item_id" value="<%=itemId%>" />
579        <jsp:param name="title" value="Other items related to this sample" />
580      </jsp:include>
581     
582      <jsp:include page="../../common/share/list_share.jsp">
583        <jsp:param name="ID" value="<%=ID%>" />
584        <jsp:param name="item_type" value="<%=itemType.name()%>" />
585        <jsp:param name="item_id" value="<%=itemId%>" />
586        <jsp:param name="title" value="Shared to" />
587      </jsp:include>
588      </t:tab>
589     
590      <t:tab id="annotations" title="Annotations &amp; parameters" 
591        tooltip="View annotation values and protocol parameters" clazz="white">
592        <jsp:include page="../../common/annotations/list_annotations.jsp">
593          <jsp:param name="item_type" value="<%=itemType.name()%>" />
594          <jsp:param name="item_id" value="<%=itemId%>" />
595          <jsp:param name="ID" value="<%=ID%>" />
596        </jsp:include>
597      </t:tab>
598      <t:tab id="events" title="Events" />
599      <t:tab id="overview" title="Overview" 
600        tooltip="Display a tree overview of related items">
601        <%
602        if ("overview".equals(tab))
603        {
604          %>
605          <jsp:include page="../../common/overview/overview.jsp">
606            <jsp:param name="item_type" value="<%=itemType.name()%>" />
607            <jsp:param name="item_id" value="<%=itemId%>" />
608            <jsp:param name="ID" value="<%=ID%>" />
609          </jsp:include>
610          <%
611        }
612        %>
613      </t:tab>     
614      <t:tab id="history" title="Change history" 
615        tooltip="Displays a log of all modifications made to this item"
616        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>">
617        <%
618        if ("history".equals(tab))
619        {
620          %>
621          <jsp:include page="../../common/history/frameset.jsp">
622            <jsp:param name="source_type" value="<%=itemType.name()%>" />
623            <jsp:param name="source_id" value="<%=itemId%>" />
624            <jsp:param name="ID" value="<%=ID%>" />
625          </jsp:include>
626          <%
627        }
628        %>
629      </t:tab>     
630      </t:tabcontrol>
631
632  </base:body>
633  </base:page>
634  <%
635}
636finally
637{
638  if (dc != null) dc.close();
639}
640
641%>
Note: See TracBrowser for help on using the repository browser.