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

Last change on this file since 3679 was 3679, checked in by Jari Häkkinen, 14 years ago

Changing the pesky "a (ä) character to a.

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