source: trunk/www/views/experiments/edit_experiment.jsp @ 4012

Last change on this file since 4012 was 4012, checked in by Nicklas Nordborg, 15 years ago

Fixes #849: Error when creating an experiment: Raw data types doesn't match

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.7 KB
Line 
1<%-- $Id: edit_experiment.jsp 4012 2007-11-28 12:37:04Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Hakkinen, Nicklas Nordborg, 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 2
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 this program; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place - Suite 330,
22  Boston, MA  02111-1307, USA.
23  ------------------------------------------------------------------
24
25
26  @author Nicklas
27  @version 2.0
28--%>
29<%@ page session="false"
30  import="net.sf.basedb.core.SessionControl"
31  import="net.sf.basedb.core.DbControl"
32  import="net.sf.basedb.core.Item"
33  import="net.sf.basedb.core.ItemContext"
34  import="net.sf.basedb.core.Permission"
35  import="net.sf.basedb.core.Experiment"
36  import="net.sf.basedb.core.RawBioAssay"
37  import="net.sf.basedb.core.AnnotationType"
38  import="net.sf.basedb.core.RawDataType"
39  import="net.sf.basedb.core.RawDataTypes"
40  import="net.sf.basedb.core.Directory"
41  import="net.sf.basedb.core.ItemQuery"
42  import="net.sf.basedb.core.ItemResultList"
43  import="net.sf.basedb.core.Include"
44  import="net.sf.basedb.core.Type"
45  import="net.sf.basedb.core.query.Restrictions"
46  import="net.sf.basedb.core.query.Expressions"
47  import="net.sf.basedb.core.query.Orders"
48  import="net.sf.basedb.core.query.Hql"
49  import="net.sf.basedb.core.PermissionDeniedException"
50  import="net.sf.basedb.core.BaseException"
51  import="net.sf.basedb.core.Project"
52  import="net.sf.basedb.clients.web.Base"
53  import="net.sf.basedb.clients.web.WebException"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.Values"
56  import="net.sf.basedb.util.Enumeration"
57  import="net.sf.basedb.util.formatter.Formatter"
58  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
59  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
60  import="java.util.Arrays"
61  import="java.util.Date"
62  import="java.util.List"
63%>
64<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
65<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
66<%
67final Item itemType = Item.EXPERIMENT;
68final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
69final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
70final int itemId = cc.getId();
71final String ID = sc.getId();
72final float scale = Base.getScale(sc);
73final DbControl dc = sc.newDbControl();
74try
75{
76  String title = null;
77  Experiment experiment = null;
78  RawDataType currentRawDataType = null;
79  RawDataType defaultRawDataType = null;
80  ItemQuery<RawBioAssay> rbaQuery = null;
81  ItemQuery<AnnotationType> efQuery = null;
82 
83  boolean readCurrentDirectory = true;
84  Directory currentDirectory = null;
85
86  List<Directory> recentDirectories = (List<Directory>)cc.getRecent(dc, Item.DIRECTORY);
87
88  int activeProjectId = sc.getActiveProjectId();
89  if (activeProjectId > 0)
90  {
91    Project activeProject = Project.getById(dc, activeProjectId);   
92    defaultRawDataType = activeProject.getDefaultRawDataType();
93  } 
94  if (itemId == 0)
95  {
96    title = "Create experiment";
97    currentRawDataType = RawDataTypes.getRawDataType(cc.getPropertyValue("rawDataType"));
98    if (currentRawDataType == null)
99    {
100      currentRawDataType = RawDataTypes.getRawDataType(cc.getRecent("RawDataType", 0));
101    }
102    if (cc.getPropertyFilter("directory.name") != null)
103    {
104      currentDirectory = Base.getFirstMatching(dc, Directory.getQuery(), "name", cc.getPropertyFilter("directory.name"));
105    }
106    cc.removeObject("item");
107    String[] selected = request.getParameterValues("rawbioassay_id");
108    if (selected != null)
109    {
110      rbaQuery = RawBioAssay.getQuery();
111      rbaQuery.restrict(Restrictions.in(Hql.property("id"), Expressions.parameter("selected")));
112      rbaQuery.setParameter("selected", Arrays.asList(Values.getInt(selected)), Type.INT);
113    }   
114  }
115  else
116  {
117    experiment = Experiment.getById(dc, itemId);
118    rbaQuery = experiment.getRawBioAssays();
119    efQuery = experiment.getExperimentalFactors();
120    cc.setObject("item", experiment);
121    currentRawDataType = experiment.getRawDataType();
122    title = "Edit experiment -- " + HTML.encodeTags(experiment.getName());
123    try
124    {
125      currentDirectory = experiment.getDirectory();
126    }
127    catch (PermissionDeniedException ex)
128    {
129      readCurrentDirectory = false;
130    }
131  }
132  if (experiment != null) experiment.checkPermission(Permission.WRITE);
133 
134  final String clazz = "class=\"text\"";
135  final String requiredClazz = "class=\"text required\"";
136  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
137  String dateFormat = FormatterSettings.getDateFormat(sc);
138  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
139  String htmlDateFormat = HTML.encodeTags(dateFormat);
140  %>
141
142  <base:page type="popup" title="<%=title%>">
143  <base:head scripts="tabcontrol.js,linkitems.js" styles="tabcontrol.css">
144    <script language="JavaScript">
145    // Validate the "Experiment" tab
146    function validateExperiment()
147    {
148      var frm = document.forms['experiment'];
149      if (Main.trimString(frm.name.value) == '')
150      {
151        alert("You must enter a name");
152        frm.name.focus();
153        return false;
154      }
155      if (frm.rawdatatype)
156      {
157        if (frm.rawdatatype[frm.rawdatatype.selectedIndex].value == '')
158        {
159          alert("You must select a raw data type");
160          frm.rawdatatype.focus();
161          return false;
162        }
163      }
164      return true;
165    }
166   
167    // Validate the "Experimental factors" tab
168    function validateExperimentalFactors()
169    {
170      return true;
171    }
172
173    // Submit the form
174    function saveSettings()
175    {
176      var frm = document.forms['experiment'];
177      if (TabControl.validateActiveTab('settings'))
178      {
179        frm.addedRawBioAssays.value = Link.getActionIds(1, 'R').join(',');
180        frm.removedRawBioAssays.value = Link.getActionIds(-1, 'R').join(',');
181
182        frm.addedAnnotationTypes.value = Link.getActionIds(1, 'A').join(',');
183        frm.removedAnnotationTypes.value = Link.getActionIds(-1, 'A').join(',');
184       
185        frm.submit();
186      }
187    }
188   
189    function addRawBioAssaysOnClick()
190    {
191      var frm = document.forms['experiment'];
192      var ids = Link.getListIds(frm.rawBioAssays, 'R');
193      var excludes = ids.join(',');
194      var rawDataType = <%=experiment == null ? "frm.rawdatatype[frm.rawdatatype.selectedIndex].value" : "'"+currentRawDataType.getId()+"'"%>;
195      var url = '../rawbioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addRawBioAssayCallback';
196      url += "&exclude="+excludes;
197      url += '&filter:STRING:rawDataType='+rawDataType;
198      Main.openPopup(url, 'AddRawBioAssays', 1000, 700);
199    }
200    function addRawBioAssayCallback(rawBioAssayId, name)
201    {
202      var item = Link.getItem('R', rawBioAssayId);
203      if (!item) item = new Item('R', rawBioAssayId, name);
204      Link.addItem(document.forms['experiment'].rawBioAssays, item);
205    }
206    function removeRawBioAssaysOnClick()
207    {
208      Link.removeSelected(document.forms['experiment'].rawBioAssays);
209    }
210   
211    function addAnnotationTypesOnClick()
212    {
213      var frm = document.forms['experiment'];
214      var ids = Link.getListIds(frm.annotationTypes, 'A');
215      var excludes = ids.join(',');
216      var url = '../../admin/annotationtypes/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addAnnotationTypeCallback';
217      url += "&exclude="+excludes;
218      Main.openPopup(url, 'AddAnnotationTypes', 1000, 700);
219    }
220    function addAnnotationTypeCallback(annotationTypeId, name)
221    {
222      var item = Link.getItem('A', annotationTypeId);
223      if (!item) item = new Item('A', annotationTypeId, name);
224      Link.addItem(document.forms['experiment'].annotationTypes, item);
225    }
226    function removeAnnotationTypesOnClick()
227    {
228      Link.removeSelected(document.forms['experiment'].annotationTypes);
229    }
230    function selectDirectoryOnClick()
231    {
232      var frm = document.forms['experiment'];
233      var url = '../../filemanager/directories/index.jsp?ID=<%=ID%>&mode=selectonedirectory&callback=setDirectoryCallback';
234      if (frm.directory_id.length > 1)
235      {
236        var id = Math.abs(parseInt(frm.directory_id[1].value));       
237        url += '&directory_id='+id;
238      }
239      Main.openPopup(url, 'SelectDirectory', 350, 500);
240    }
241    function setDirectoryCallback(id, name)
242    {
243      var frm = document.forms['experiment'];
244      var list = frm.directory_id;
245      if (list.length < 2 || list[1].value == '0') // >
246      {
247        Forms.addListOption(list, 1, new Option());
248      }
249      list[1].value = id;
250      list[1].text = name;
251      list.selectedIndex = 1;
252    }
253
254    function init()
255    {
256      var frm = document.forms['experiment'];
257      <%
258      if (experiment == null)
259      {
260        %>
261        frm.name.focus();
262        frm.name.select();
263        <%
264      }
265      if (rbaQuery != null)
266      {
267        %>
268        var rawBioAssays = frm.rawBioAssays;
269        <%
270        rbaQuery.include(Include.ALL);
271        rbaQuery.order(Orders.asc(Hql.property("name")));
272        ItemResultList<RawBioAssay> rawBioAssays = rbaQuery.list(dc);
273        if (rawBioAssays.size() > 0 && experiment == null) currentRawDataType = null;
274        for (RawBioAssay rba : rawBioAssays)
275        {
276          RawDataType rbaDataType = rba.getRawDataType();
277          if (currentRawDataType == null) 
278          {
279            currentRawDataType = rbaDataType;
280          }
281          String linkMethod = "addNewItem";
282          if (experiment == null)
283          {
284            linkMethod = "addItem";
285            // Checks for new experiment
286            if (rbaDataType != currentRawDataType)
287            {
288              throw new WebException("popup", "Raw data types doesn't match",
289                "The raw data type of the selected raw bioassays are not the same. " + 
290                "It is not possible to mix raw data types in an experiment.");
291            }
292          }
293          %>
294          Link.<%=linkMethod%>(rawBioAssays, new Item('R', <%=rba.getId()%>, '<%=HTML.javaScriptEncode(rba.getName())%>'));
295          <%
296        }
297      }
298      if (efQuery != null)
299      {
300        %>
301        var annotationTypes = frm.annotationTypes;
302        <%
303        efQuery.include(Include.ALL);
304        efQuery.order(Orders.asc(Hql.property("name")));
305        ItemResultList<AnnotationType> experimentalFactors = efQuery.list(dc);
306        for (AnnotationType at : experimentalFactors)
307        {
308          %>
309          Link.addNewItem(annotationTypes, new Item('A', <%=at.getId()%>, '<%=HTML.javaScriptEncode(at.getName())%>'));
310          <%
311        }
312      }
313      %>
314    }
315    </script>
316  </base:head>
317  <base:body onload="init()">
318    <p>
319    <form action="index.jsp?ID=<%=ID%>" method="post" name="experiment" onsubmit="return false;">
320    <input type="hidden" name="cmd" value="UpdateItem">
321
322    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
323    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*370)+"px;"%>" 
324      position="bottom" remember="<%=experiment != null%>">
325    <t:tab id="info" title="Experiment" validate="validateExperiment()" helpid="experiment.edit">
326      <table class="form" cellspacing=0>
327      <tr>
328        <td class="prompt">Name</td>
329        <td><input <%=requiredClazz%> type="text" name="name" 
330          value="<%=HTML.encodeTags(experiment == null ? Values.getString(cc.getPropertyValue("name"), "New experiment") : experiment.getName())%>" 
331          size="40" maxlength="<%=Experiment.MAX_NAME_LENGTH%>"></td>
332      </tr>
333     
334      <tr>
335        <td class="prompt">Raw data type</td>
336        <td>
337          <%
338          if (experiment == null)
339          {
340            currentRawDataType = currentRawDataType != null ? 
341              currentRawDataType : defaultRawDataType;
342            Enumeration<RawDataType, String> rawEnumeration = 
343              new Enumeration<RawDataType, String>();
344            for (RawDataType rdt : RawDataTypes.getRawDataTypes())
345            {
346              rawEnumeration.add(rdt, rdt.getName());
347            }
348            rawEnumeration.sortValues();           
349            %>
350            <select name="rawdatatype" class="required unchangeable">
351            <%
352            for (int i = 0; i < rawEnumeration.size(); ++i)
353            {
354              RawDataType rdt = rawEnumeration.getKey(i);
355              String selected = rdt.equals(currentRawDataType) ? "selected" : "";
356              %>
357              <option value="<%=rdt.getId()%>" <%=selected%>><%=HTML.encodeTags(rdt.getName())%>
358              <%
359            }
360            %>
361            </select>
362            <%
363          }
364          else
365          {
366            %>
367            <%=HTML.encodeTags(currentRawDataType.getName())%>
368            <%
369          }
370          %>
371       
372        </td>
373      </tr>
374      <tr>
375        <td class="prompt">Directory</td>
376        <td>
377          <base:select 
378            id="directory_id"
379            clazz="selectionlist"
380            required="false"
381            current="<%=currentDirectory%>"
382            denied="<%=!readCurrentDirectory%>"
383            recent="<%=recentDirectories%>"
384            newitem="<%=experiment == null%>"
385            onselect="selectDirectoryOnClick()"
386          />
387        </td>
388      </tr>
389      <tr valign="top">
390        <td class="prompt">Raw bioassays</td>
391        <td>
392          <table border="0" cellspacing="0" cellpadding="0">
393          <tr valign="top">
394          <td>
395            <select name="rawBioAssays" size="5" multiple style="width: 20em;">
396            </select>
397            <input type="hidden" name="addedRawBioAssays" value="">
398            <input type="hidden" name="removedRawBioAssays" value="">
399          </td>
400          <td>
401            <table border="0">
402            <tr><td width="150"><base:button 
403              onclick="addRawBioAssaysOnClick()" 
404              title="Add&nbsp;raw bioassays&hellip;" 
405              tooltip="Add raw bioassays"
406              /></td></tr>
407            <tr><td width="150"><base:button 
408              onclick="removeRawBioAssaysOnClick()" 
409              title="Remove" 
410              tooltip="Remove the selected raw bioassays"
411            /></td></tr>
412            </table>
413          </td>
414          </tr>
415          </table>
416        </td>
417      </tr>
418      <tr valign=top>
419        <td class="prompt">Description</td>
420        <td nowrap>
421          <textarea <%=clazz%> rows="4" cols="40" name="description" wrap="virtual"
422            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("description") : experiment.getDescription())%></textarea>
423          <a href="javascript:Main.zoom('Description', 'rawbioassay', 'description')"
424            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
425        </td>
426      </tr>
427      </table>
428      <div align=right>
429        &nbsp;<i><base:icon image="required.gif" /> = required information</i>
430        <%if (experiment == null) {%><br>
431        <i><base:icon image="unchangeable.gif" /> = can't be changed later</i>
432        <%}%>
433        </div>
434    </t:tab>
435   
436    <t:tab id="publication" title="Publication"  helpid="experiment.edit.publication">
437      <table class="form" cellspacing=0>
438      <tr>
439        <td class="prompt">PubMedId</td>
440        <td><input <%=clazz%> type="text" name="pubMedId" 
441          value="<%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("pubMedId") : experiment.getPubMedId())%>" 
442          size="40" maxlength="<%=Experiment.MAX_PUBMEDID_LENGTH%>"></td>
443      </tr>
444        <td class="prompt">Title</td>
445        <td nowrap>
446          <textarea <%=clazz%> rows="4" cols="40" name="title" wrap="virtual"
447            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("title") : experiment.getTitle())%></textarea>
448          <a href="javascript:Main.zoom('Title', 'experiment', 'title')"
449            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
450        </td>
451      </tr>
452      <tr>
453        <td class="prompt">Publication date</td>
454        <td>
455          <table border="0" cellspacing="0" cellpadding="0">
456          <tr>
457          <td>
458            <input <%=clazz%> type="text" name="publicationDate" 
459              value="<%=HTML.encodeTags(dateFormatter.format(experiment == null ? 
460                (Date)cc.getPropertyObject("publicationDate") : experiment.getPublicationDate()))%>" 
461              size="20" maxlength="20" title="Enter date in format: <%=htmlDateFormat%>">
462            &nbsp;
463          </td>
464          <td>
465          <base:button 
466            onclick="<%="Dates.selectDate('Publication date', 'experiment', 'publicationDate', null, '"+jsDateFormat+"')"%>"
467            image="calendar.png"
468            title="Calendar&hellip;" 
469            tooltip="Select a date from a calendar" 
470          />
471          </td>
472          </tr>
473          </table>
474        </td>
475      </tr>
476      <tr valign=top>
477        <td class="prompt">Abstract</td>
478        <td nowrap>
479          <textarea <%=clazz%> rows="4" cols="40" name="abstract" wrap="virtual"
480            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("abstract") : experiment.getAbstract())%></textarea>
481          <a href="javascript:Main.zoom('Abstract', 'experiment', 'abstract')"
482            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
483        </td>
484      </tr>
485      <tr valign=top>
486        <td class="prompt">Experiment design</td>
487        <td nowrap>
488          <textarea <%=clazz%> rows="4" cols="40" name="experimentDesign" wrap="virtual"
489            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("experimentDesign") : experiment.getExperimentDesign())%></textarea>
490          <a href="javascript:Main.zoom('Experiment design', 'experiment', 'experimentDesign')"
491            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
492        </td>
493      </tr>
494      <tr valign=top>
495        <td class="prompt">Experiment type</td>
496        <td nowrap>
497          <textarea <%=clazz%> rows="4" cols="40" name="experimentType" wrap="virtual"
498            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("experimentType") : experiment.getExperimentType())%></textarea>
499          <a href="javascript:Main.zoom('Experiment type', 'experiment', 'experimentType')"
500            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
501        </td>
502      </tr>
503      <tr valign=top>
504        <td class="prompt">Affiliations</td>
505        <td nowrap>
506          <textarea <%=clazz%> rows="4" cols="40" name="affiliations" wrap="virtual"
507            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("affiliations") : experiment.getAffiliations())%></textarea>
508          <a href="javascript:Main.zoom('Affiliations', 'experiment', 'affiliations')"
509            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
510        </td>
511      </tr>
512      <tr valign=top>
513        <td class="prompt">Authors</td>
514        <td nowrap>
515          <textarea <%=clazz%> rows="4" cols="40" name="authors" wrap="virtual"
516            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("authors") : experiment.getAuthors())%></textarea>
517          <a href="javascript:Main.zoom('Authors', 'experiment', 'authors')"
518            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
519        </td>
520      </tr>
521      <tr valign=top>
522        <td class="prompt">Publication</td>
523        <td nowrap>
524          <textarea <%=clazz%> rows="4" cols="40" name="publication" wrap="virtual"
525            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("publication") : experiment.getPublication())%></textarea>
526          <a href="javascript:Main.zoom('Publication', 'experiment', 'publication')"
527            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
528        </td>
529      </tr>
530      </table>
531      </t:tab>
532     
533      <t:tab id="experimentalFactors" title="Experimental factors" 
534        validate="validateExperimentalFactors()" helpid="experiment.edit.factors">
535      <table class="form" cellspacing=0>
536
537      <tr valign="top">
538        <td class="prompt">Annotation types</td>
539        <td>
540          <table border="0" cellspacing="0" cellpadding="0">
541          <tr valign="top">
542          <td>
543            <select name="annotationTypes" size="10" multiple style="width: 20em;">
544            </select>
545            <input type="hidden" name="addedAnnotationTypes" value="">
546            <input type="hidden" name="removedAnnotationTypes" value="">
547          </td>
548          <td>
549            <table border="0">
550            <tr><td width="150"><base:button 
551              onclick="addAnnotationTypesOnClick()" 
552              title="Add annotation types&hellip;" 
553              tooltip="Add annotation types"
554              /></td></tr>
555            <tr><td width="150"><base:button 
556              onclick="removeAnnotationTypesOnClick()" 
557              title="Remove" 
558              tooltip="Remove the selected annotation types"
559            /></td></tr>
560            </table>
561          </td>
562          </tr>
563          </table>
564        </td>
565      </tr>
566      </table>
567      </t:tab>
568
569    </t:tabcontrol>
570
571    <table align="center">
572    <tr>
573      <td width="50%"><base:button onclick="saveSettings()" title="Save" /></td>
574      <td width="50%"><base:button onclick="window.close()" title="Cancel" /></td>
575    </tr>
576    </table>
577    </form>
578  </base:body>
579  </base:page>
580  <%
581}
582finally
583{
584  if (dc != null) dc.close();
585}
586%>
Note: See TracBrowser for help on using the repository browser.