source: trunk/www/filemanager/upload/select.jsp @ 3719

Last change on this file since 3719 was 3719, checked in by Nicklas Nordborg, 14 years ago

References #411: Most of the basic functionality is now in place and has been documented
On major issue is that the Affymetrix Fusion SDK will not work with compressed files since
it expects direct access to the java.io.File object. I will try to solve this by modifying the
Affymetric Fusion SDK to work with InputStream:s instead. This would be better than to decompress
CEL and CDF files everytime they are needed. In most cases we only scan the headers anyway, so
it would be good if we can avoid copying the entire 40+ MB file(s) each time.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 17.6 KB
Line 
1<%-- $Id: select.jsp 3719 2007-09-12 13:02:59Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Hakkinen, Nicklas Nordborg, Martin Svensson
5  Copyright (C) 2007 Johan Enell, Nicklas Nordborg, Martin Svensson
6
7  This file is part of BASE - BioArray Software Environment.
8  Available at http://base.thep.lu.se/
9
10  BASE is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License
12  as published by the Free Software Foundation; either version 2
13  of the License, or (at your option) any later version.
14
15  BASE is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with this program; if not, write to the Free Software
22  Foundation, Inc., 59 Temple Place - Suite 330,
23  Boston, MA  02111-1307, USA.
24  ------------------------------------------------------------------
25
26
27  @author Nicklas
28  @version 2.0
29--%>
30<%@ page session="false"
31  import="net.sf.basedb.core.Application"
32  import="net.sf.basedb.core.SessionControl"
33  import="net.sf.basedb.core.DbControl"
34  import="net.sf.basedb.core.Item"
35  import="net.sf.basedb.core.SystemItems"
36  import="net.sf.basedb.core.ItemContext"
37  import="net.sf.basedb.core.Permission"
38  import="net.sf.basedb.core.Directory"
39  import="net.sf.basedb.core.File"
40  import="net.sf.basedb.core.FileType"
41  import="net.sf.basedb.core.User"
42  import="net.sf.basedb.core.Group"
43  import="net.sf.basedb.core.Quota"
44  import="net.sf.basedb.core.QuotaType"
45  import="net.sf.basedb.core.Location"
46  import="net.sf.basedb.core.PluginDefinition"
47  import="net.sf.basedb.core.Include"
48  import="net.sf.basedb.core.ItemQuery"
49  import="net.sf.basedb.core.ItemResultList"
50  import="net.sf.basedb.core.PermissionDeniedException"
51  import="net.sf.basedb.core.BaseException"
52  import="net.sf.basedb.core.query.Orders"
53  import="net.sf.basedb.core.query.Hql"
54  import="net.sf.basedb.util.zip.FileUnpacker"
55  import="net.sf.basedb.clients.web.Base"
56  import="net.sf.basedb.clients.web.util.HTML"
57  import="net.sf.basedb.util.Values"
58  import="java.util.List"
59  import="java.util.Set"
60  import="java.util.HashSet"
61%>
62<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
63<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
64<%
65final Item itemType = Item.FILE;
66final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
67final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
68final int itemId = cc.getId();
69final String ID = sc.getId();
70final float scale = Base.getScale(sc);
71final DbControl dc = sc.newDbControl();
72try
73{
74  String title = null;
75  File file = null;
76  Directory directory = null;
77  boolean readCurrentFileType = true;
78  int currentFileTypeId = 0;
79  Boolean compress = Application.autoCompressionEnabled() ? null : false; // null == auto
80
81  if (itemId == 0)
82  {
83    title = "Upload new file";
84    currentFileTypeId = Values.getInt(cc.getPropertyValue("fileType"), 0);
85    if (currentFileTypeId == 0)
86    {
87      currentFileTypeId = Values.getInt(cc.getRecent(Item.FILETYPE.name(), 0), 0);
88    }
89    directory = Directory.getById(dc, Values.getInt(request.getParameter("directory_id"), SystemItems.getId(Directory.ROOT)));
90    cc.removeObject("item");
91    if (directory.getAutoCompress()) compress = true;
92  }
93  else
94  {
95    file = File.getById(dc, itemId);
96    directory = file.getDirectory();
97    cc.setObject("item", file);
98    title = "Upload again -- " + HTML.encodeTags(file.getName());
99    try
100    {
101      FileType ft = file.getFileType();
102      if (ft != null) currentFileTypeId = ft.getId();
103    }
104    catch (PermissionDeniedException ex)
105    {
106      readCurrentFileType = false;
107    }
108  }
109  if (file != null && !file.hasPermission(Permission.WRITE))
110  {
111    throw new PermissionDeniedException(Permission.WRITE, itemType.toString());
112  }
113 
114  if (file == null || file.getLocation() != Location.PRIMARY)
115  {
116    // Check quota
117    User user = User.getById(dc, sc.getLoggedInUserId());
118    QuotaType totalQuotaType = QuotaType.getById(dc, SystemItems.getId(QuotaType.TOTAL));
119    QuotaType fileQuotaType = QuotaType.getById(dc, SystemItems.getId(QuotaType.FILE));
120   
121    if (user.hasExceededQuota(totalQuotaType, Location.PRIMARY) 
122      || user.hasExceededQuota(fileQuotaType, Location.PRIMARY))
123    {
124      throw new PermissionDeniedException("Quota has been exceeded");
125    }
126  }
127 
128 
129  // Query to retrieve file types
130  final ItemQuery<FileType> fileTypeQuery = FileType.getQuery();
131  fileTypeQuery.order(Orders.asc(Hql.property("name")));
132  fileTypeQuery.setCacheResult(true);
133 
134  // Query to retreive FileUnpacker plugins
135  final ItemQuery<PluginDefinition> pluginQuery = PluginDefinition.getQuery(null, "net.sf.basedb.util.zip.FileUnpacker");
136  pluginQuery.order(Orders.asc(Hql.property("name")));
137  pluginQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
138  List<PluginDefinition> plugins = pluginQuery.list(dc);
139
140  final String clazz = "class=\"text\"";
141  final String requiredClazz = "class=\"text required\"";
142  %>
143  <base:page type="popup" title="<%=title%>">
144  <base:head scripts="tabcontrol.js,ajax.js" styles="tabcontrol.css,progressbar.css">
145    <script language="JavaScript">
146    // Validate the "File" tab
147    function validateFile()
148    {
149      var frm = document.forms['file'];
150      if (Main.trimString(frm.the_file.value) == '')
151      {
152        alert("You must select a file to upload");
153        frm.the_file.focus();
154        return false;
155      }
156      return true;
157    }
158
159    // Submit the form
160    function doUpload()
161    {
162      var frm = document.forms['file'];
163      if (TabControl.validateActiveTab('settings'))
164      {
165        // Copy form values so they are sent BEFORE the file
166        frm.check_md5.value = frm.temp_check_md5 && frm.temp_check_md5.checked ? "1" : "0";
167        frm.write_protected.value = frm.temp_write_protected.checked ? "1" : "0";
168        frm.compressed.value = frm.temp_compressed && frm.temp_compressed[frm.temp_compressed.selectedIndex].value;
169        if (frm.temp_zip_format)
170        {
171          frm.zip_format.value = frm.temp_zip_format[frm.temp_zip_format.selectedIndex].value;
172          frm.zip_unpack.value = frm.temp_zip_unpack.checked ? "1" : "0";
173          frm.zip_overwrite.value = frm.temp_zip_overwrite.checked ? "1" : "0";
174          frm.zip_keep.value = frm.temp_zip_keep.checked ? "1" : "0";
175        }
176        frm.filetype_id.value = frm.temp_filetype_id[frm.temp_filetype_id.selectedIndex].value;
177        frm.description.value = frm.temp_description.value;
178        frm.submit();
179        Main.hide('selectForm');
180        Main.show('progressForm');
181        if (!sendProgressUpdateWithAjax())
182        {
183          window.top.frames['progress'].location.href = 'progress.jsp?ID=<%=ID%>';
184        }
185      }
186    }
187   
188    function sendProgressUpdateWithAjax()
189    {
190      var request = Ajax.getXmlHttpRequest();
191      if (request != null)
192      {
193        var url = 'progress.jsp?ID=<%=ID%>&ajax=1&'+Math.random();
194        request.open("GET", url, true);
195        Ajax.setReadyStateHandler(request, updateProgressWithAjax);
196        request.send(null);
197      }
198      return request != null;
199    }
200   
201    function updateProgressWithAjax(request)
202    {
203      var response = request.responseText.split(':');
204      //alert(response[0]+':'+response[1]+':'+response[2]+':'+response[3]+':'+response[4]+':'+response[5]);
205      displayProgress(response[0],response[1],response[2],response[3],response[4],response.slice(5).join(':'));
206      setTimeout('sendProgressUpdateWithAjax()', 1500);
207    }
208   
209    function abortUpload()
210    {
211      if (confirm('Are you sure you want to abort the upload? It cannot be resumed.'))
212      {
213        window.top.frames['progress'].location.href = 'progress.jsp?ID=<%=ID%>&abort=1';
214      }
215    }
216   
217    function fileOnChange()
218    {
219      var frm = document.forms['file'];
220      var filename = frm.the_file.value;
221      var isZip = false;
222      var zipIndex = 0;
223     
224      for (var i = 0; i < allZipFormats.length; i++)
225      {
226        var zf = allZipFormats[i];
227        if (zf.matchesExtension(filename))
228        {
229          isZip = true;
230          zipIndex = zf.index;
231          i = allZipFormats.length;
232        }
233      }
234     
235      if (frm.temp_zip_format)
236      {
237        frm['temp_zip_format'].disabled = !isZip;
238        frm['temp_zip_format'].selectedIndex = zipIndex;
239        frm['temp_zip_unpack'].disabled = !isZip;
240        frm['temp_zip_overwrite'].disabled = !isZip || !frm['temp_zip_unpack'].checked;
241        frm['temp_zip_keep'].disabled = !isZip || !frm['temp_zip_unpack'].checked;
242        frm['temp_compressed'].disabled = isZip;
243        if (isZip)
244        {
245          // Select '-auto-' if present, otherwise 'no'
246          Forms.selectListOption(frm['temp_compressed'], '0');
247          Forms.selectListOption(frm['temp_compressed'], '');
248        }
249      }
250    }
251    function unpackZipOnClick()
252    {
253      var frm = document.forms['file'];
254      var checked = frm['temp_zip_unpack'].checked;
255      if (!checked) frm['temp_zip_keep'].checked = true;
256      frm['temp_zip_overwrite'].disabled = !checked;
257      frm['temp_zip_keep'].disabled = !checked;
258    }
259   
260    function initZipFormats()
261    {
262      var frm = document.forms['file'];
263      var zipFormat = frm.temp_zip_format;
264      if (zipFormat)
265      {
266      <%
267      for (PluginDefinition plugin : plugins)
268      {
269        FileUnpacker unpacker = plugin.newInstance(FileUnpacker.class, null, sc, null, null);
270        %>
271          var extensions = [ '<%=Values.getString(unpacker.getExtensions(), "','", true)%>' ];
272          var zf = new ZipFormat(zipFormat.length, <%=plugin.getId()%>, '<%=HTML.javaScriptEncode(unpacker.getFormatName())%>', extensions);
273          zipFormat[zipFormat.length] = new Option(zf.toString(), zf.id);
274        <%
275      }
276      %>
277      }
278    }
279   
280    function displayProgress(fileName, transferredBytes, totalBytes, transferTime, remainTime, unpackMessage)
281    {
282      // File name
283      document.getElementById('fileName').innerHTML = 'Uploading ' + fileName + '...';
284       
285      // Percent done
286      var percentDone = totalBytes == 0 ? 0 : Math.round(100 * transferredBytes / totalBytes);
287      document.getElementById('percent').innerHTML = '&nbsp;' + percentDone+'%';
288      var doneElement = document.getElementById('percentDone');
289      doneElement.style.width = percentDone+'%';
290      var remainElement = document.getElementById('percentRemain');
291      remainElement.style.width = (100-percentDone)+'%';
292      if (percentDone == 100) Main.hide('percentRemain');
293     
294      // Bytes
295      document.getElementById('transferredBytes').innerHTML = Numbers.formatBytes(transferredBytes);
296      document.getElementById('totalBytes').innerHTML = Numbers.formatBytes(totalBytes);
297
298      // Times and rate
299      var transferRate = transferTime == 0 ? 0 : transferredBytes / transferTime;
300      document.getElementById('transferTime').innerHTML = Numbers.formatSeconds(transferTime);
301      document.getElementById('transferRate').innerHTML = '(' + Numbers.formatBytes(transferRate) + '/s)';
302      document.getElementById('remainTime').innerHTML = Numbers.formatSeconds(remainTime) + ' (estimated)';
303     
304      // Message
305      if (unpackMessage)
306      {
307        document.getElementById('unpackMessage').innerHTML = unpackMessage.replace(/(.*):(.*)/, '<b>$1:</b> $2');
308      }
309    }
310   
311    var allZipFormats = new Array();
312    function ZipFormat(index, id, name, extensions)
313    {
314      this.index = index;
315      this.id = id;
316      this.name = name;
317      this.extensions = extensions;
318     
319      allZipFormats[allZipFormats.length] = this;
320     
321      this.matchesExtension = function(filename)
322      {
323        for (var i = 0; i < this.extensions.length; i++)
324        {
325          var ext = '.' + this.extensions[i];
326          var index = filename.lastIndexOf(ext);
327          if (index > 0 && (index + ext.length == filename.length))
328          {
329            return true;
330          }
331        }
332        return false;
333      }
334     
335      this.toString = function()
336      {
337        var s = this.name + " [";
338        for (var i = 0; i < this.extensions.length; i++)
339        {
340          if (i > 0) s += ', ';
341          s += '*.' + this.extensions[i];
342        }
343        s += ']';
344        return s;
345      }
346    }
347   
348    </script>
349  </base:head>
350  <base:body onload="initZipFormats()">
351  <p>
352  <div id="selectForm">
353    <form action="upload.jsp?ID=<%=ID%>&directory_id=<%=directory.getId()%>" 
354      method="post" name="file" enctype="multipart/form-data" onsubmit="return false;" target="upload">
355
356    <input type="hidden" name="check_md5" value="0">
357    <input type="hidden" name="write_protected" value="0">
358    <input type="hidden" name="compressed" value="">
359    <input type="hidden" name="zip_format" value="">
360    <input type="hidden" name="zip_unpack" value="0">
361    <input type="hidden" name="zip_overwrite" value="0">
362    <input type="hidden" name="zip_keep" value="1">
363    <input type="hidden" name="filetype_id" value="">
364    <input type="hidden" name="description" value="">
365
366    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
367    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*340)+"px;"%>" 
368      position="bottom" remember="false">
369    <t:tab id="info" title="File" validate="validateFile()" helpid="file.upload">
370      <table class="form" cellspacing=0>
371      <tr>
372        <td class="prompt">Directory</td>
373        <td><%=HTML.encodeTags(directory.getPath().toString())%></td>
374      </tr>
375      <tr>
376        <td class="prompt">File</td>
377        <td>
378          <input <%=requiredClazz%> type="file" name="the_file" size="50"
379            onchange="fileOnChange()">
380        </td>
381      </tr>
382      <tr>
383        <td class="prompt">Write protected</td>
384        <td>
385          <input type="checkbox" name="temp_write_protected" value="1" 
386          <%=(file != null && file.isWriteProtected()) || 
387            (file == null && Values.getBoolean(cc.getPropertyValue("writeProtected"))) ? "checked" : ""%>>
388        </td>
389      </tr>
390      <tr>
391        <td class="prompt">Store compressed</td>
392        <td>
393          <select name="temp_compressed">
394            <%
395            if (Application.autoCompressionEnabled())
396            {
397              %>
398              <option value="" <%=compress == null ? "selected" : "" %>>- auto -
399              <%
400            }
401            %>
402            <option value="1" <%=Boolean.TRUE.equals(compress) ? "selected" : ""%>>yes
403            <option value="0" <%=Boolean.FALSE.equals(compress) ? "selected" : ""%>>no
404          </select>
405        </td>
406      </tr>
407      <%
408      if (file != null)
409      {
410        %>
411        <tr>
412          <td class="prompt">Validate MD5</td>
413          <td><input type="checkbox" name="temp_check_md5"></td>
414        </tr>
415        <%
416      }
417      %>
418      <tr valign="top">
419        <td class="prompt">Type</td>
420        <td colspan="2">
421          <select name="temp_filetype_id" <%=!readCurrentFileType ? "disabled readonly class=\"disabled\"" : ""%>>
422          <%
423          if (!readCurrentFileType)
424          {
425            %>
426            <option value="-1">- denied -
427            <%
428          }
429          else
430          {
431            %>
432            <option value="0">- none -
433            <%
434            ItemResultList<FileType> fileTypes = fileTypeQuery.list(dc);
435            for (FileType fileType : fileTypes)
436            {
437              int id = fileType.getId();
438              boolean current = id == currentFileTypeId;
439              %>
440              <option 
441                value="<%=current && file != null ? -id : id%>" 
442                <%=current ? "selected" : ""%>
443                ><%=HTML.encodeTags(fileType.getName())%>
444              <%
445            }
446          }
447          %>
448          </select>
449        </td>
450      </tr>
451
452      <tr valign=top>
453        <td class="prompt">Description</td>
454        <td nowrap>
455          <textarea <%=clazz%> rows="4" cols="50" name="temp_description" wrap="virtual"
456            ><%=HTML.encodeTags(file == null ? cc.getPropertyValue("description") : file.getDescription())%></textarea>
457          <a href="javascript:Main.zoom('Description', 'file', 'temp_description')"
458            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
459        </td>
460      </tr>
461     
462      <tr valign=top>
463        <td class="prompt">Max trans-<br>fer rate</td>
464        <td nowrap>
465          <%
466          long maxTransferRate = Values.getInt(sc.getClientDefaultSetting("server.transferRate"), 0);
467          %>
468          <%=maxTransferRate == 0 ? "unlimited" : Values.formatBytes(maxTransferRate)+"/s (approx.)"%>
469        </td>
470      </tr>
471     
472      <%
473      if (file == null)
474      {
475        %>
476        <tr valign=top>
477          <td class="prompt">Compressed file</td>
478          <td>
479            <select name="temp_zip_format" disabled>
480              <option>
481            </select><br>
482         
483            <input type="checkbox" name="temp_zip_unpack" disabled
484              onclick="unpackZipOnClick()"><a 
485              href="javascript:document.forms['file'].temp_zip_unpack.click()">Unpack file</a><br>
486            <input type="checkbox" name="temp_zip_overwrite" disabled
487              ><a 
488              href="javascript:document.forms['file'].temp_zip_overwrite.click()">Overwrite existing files</a><br>
489            <input type="checkbox" name="temp_zip_keep" disabled checked
490              ><a 
491              href="javascript:document.forms['file'].temp_zip_keep.click()">Keep the compressed file</a><br>
492          </td>
493        </tr>
494        <%
495      }
496      %>
497     
498      </table>
499      <div align=right>&nbsp;<i><base:icon image="required.gif" /> = required information</i></div>
500    </t:tab>
501
502    </t:tabcontrol>
503
504    <table align="center">
505    <tr>
506      <td width="50%"><base:button image="upload.gif" onclick="doUpload()" title="Upload" /></td>
507      <td width="50%"><base:button onclick="top.window.close()" title="Cancel" /></td>
508    </tr>
509    </table>
510    </form>
511  </div>
512 
513  <div id="progressForm" style="display:none;">
514    <h3 class="docked" id="fileName">Preparing file upload...</h3>
515    <div class="boxed" style="background: #E0E0E0">
516      <br>
517      <table width="90%" border=0 cellspacing=0 cellpadding=0 align="center">
518      <tr>
519      <td width="90%" >
520        <table width="100%" class="progressbar" border=0 cellspacing=0 cellpadding=0>
521        <tr>
522          <td width="0%" class="done" id="percentDone">&nbsp;</td>
523          <td width="100%" class="remain" id="percentRemain">&nbsp;</td>
524        </tr>
525        </table>
526      </td>
527        <td width="10%" id="percent">&nbsp;0%</td>
528      </tr>
529      <tr>
530        <td colspan="2">
531          <b>Transferred:</b> <span id="transferredBytes">0 bytes</span> of <span id="totalBytes">unknown</span><br>
532          <b>Time:</b> <span id="transferTime">0s</span> <span id="transferRate"></span><br>
533          <b>Remain:</b> <span id="remainTime">unknown</span><br>
534          <span id="unpackMessage"></span>
535        </td>
536      </tr>
537      </table>
538      <br>
539    </div>
540    <br>
541    <table align="center">
542    <tr>
543      <td><base:button image="cancel.gif" onclick="abortUpload()" title="Abort..." /></td>
544    </tr>
545    </table>
546 
547  </div>
548  </base:body>
549  </base:page>
550  <%
551}
552finally
553{
554  if (dc != null) dc.close();
555}
556%>
Note: See TracBrowser for help on using the repository browser.