source: trunk/www/common/plugin/test_with_file.jsp @ 5955

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

References #1655: GUI improvements

"Test with file" dialog.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 12.9 KB
Line 
1<%-- $Id: test_with_file.jsp 5955 2012-02-13 14:36:42Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Johan Enell, Nicklas Nordborg
4  Copyright (C) 2007 Nicklas Nordborg
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  contentType="text/html; charset=UTF-8" 
28  import="net.sf.basedb.core.SessionControl"
29  import="net.sf.basedb.core.DbControl"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.Config"
32  import="net.sf.basedb.core.Location"
33  import="net.sf.basedb.util.parser.FlatFileParser"
34  import="net.sf.basedb.clients.web.Base"
35  import="net.sf.basedb.util.Values"
36  import="net.sf.basedb.plugins.util.Parameters"
37  import="net.sf.basedb.clients.web.util.HTML"
38  import="java.nio.charset.Charset"
39%>
40<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
41<%@ taglib prefix="m" uri="/WEB-INF/menu.tld" %>
42
43<%
44final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
45final String ID = sc.getId();
46final DbControl dc = sc.newDbControl();
47try
48{
49  String preQuote = "(?!\"x\"y)";
50  String postQuote = "(?=\"x\"y)";
51  %>
52  <base:page type="popup" title="Test with file">
53  <base:head scripts="plugin.js,menu.js,ajax.js,json2.js" styles="menu.css">
54    <script language="JavaScript">
55    function browseOnClick()
56    {
57      var frm = document.forms['testwithfile'];
58      var url = '../../filemanager/index.jsp?ID=<%=ID%>&cmd=SelectOne&title=Test+with+file&callback=setFileCallback';
59      Main.openPopup(url, 'SelectFile', 1050, 700);
60    }
61    function setFileCallback(fileId, path)
62    {
63      var frm = document.forms['testwithfile'];
64      frm.file_id.value = fileId;
65      frm.path.value = path;
66      updateCharset(fileId);
67    }
68    function updateCharset(fileId)
69    {
70      var request = Ajax.getXmlHttpRequest();
71      if (request != null)
72      {
73        var url = '../../filemanager/files/ajax.jsp?ID=<%=ID%>&cmd=GetFileInfo&item_id=' + fileId;
74        request.open("GET", url, true);
75        Ajax.setReadyStateHandler(request, updateCharsetCallback);
76        request.send(null);
77      }
78      return request != null;
79    }
80    function updateCharsetCallback(request)
81    {
82      var response = Ajax.parseJsonResponse(request.responseText);
83      var charset = response.characterSet;
84      if (charset)
85      {
86        var frm = document.forms['testwithfile'];
87        Forms.selectListOption(frm.charset, charset);
88      }
89    }
90    function showPredefined(event, menu)
91    {
92      Menu.toggleTopMenu(document.getElementById(menu), event.clientX, event.clientY);
93      event.cancelBubble = true;
94    }
95    var preQuote = '(?!")';
96    var postQuote = '(?=")';
97    var whiteSpaceOrQuote = '[\\s\\"]*';
98    var notInsideQoute = '(?=(?:[^"]*"[^"]*")*(?![^"]*"))';
99    function setRegexp(field, regexp)
100    {
101      var frm = document.forms['testwithfile'];
102      frm[field].value = regexp;
103    }
104    function doParse()
105    {
106      var frm = document.forms['testwithfile'];
107      if (Main.trimString(frm.path.value) == '')
108      {
109        frm.path.focus();
110        alert('You must select a file');
111        return false;
112      }
113      else if (Main.trimString(frm.dataSplitter.value) == '')
114      {
115        frm.dataSplitter.focus();
116        alert('You must specify a data splitter regular expression');
117        return false;
118      }
119      frm.submit();
120    }
121   
122    var parameterNames = new Array();
123    function init()
124    {
125      var frm = document.forms['testwithfile'];
126      var configWin = window.opener;
127      frm.path.value = configWin.getParameterValue('file');
128      frm.header.value = configWin.getParameterValue('headerRegexp');
129      frm.dataHeader.value = configWin.getParameterValue('dataHeaderRegexp');
130      frm.dataSplitter.value = configWin.getParameterValue('dataSplitterRegexp');
131      frm.dataFooter.value = configWin.getParameterValue('dataFooterRegexp');
132      frm.ignore.value = configWin.getParameterValue('ignoreRegexp');
133      frm.minDataColumns.value = configWin.getParameterValue('minDataColumns');
134      frm.maxDataColumns.value = configWin.getParameterValue('maxDataColumns');
135      frm.trimQuotes.checked = configWin.getParameterValue('trimQuotes') != 'false';
136      Forms.selectListOption(frm.charset, configWin.getParameterValue('<%=Parameters.CHARSET_PARAMETER%>'));
137     
138      var allParameters = configWin.Parameters.allParameters;
139      for (var i = 0; i < allParameters.length; i++)
140      {
141        var param = allParameters[i];
142        if (param.name.search('Mapping') >= 0)
143        {
144          parameterNames[parameterNames.length] = param.name;
145          Forms.createHidden(frm, 'mapping.'+param.name+'.label', param.label);
146          Forms.createHidden(frm, 'mapping.'+param.name+'.expression', param.values.length == 0 ? '' : param.values[0]);
147        }
148      }
149      if (parameterNames.length > 0)
150      {
151        Forms.createHidden(frm, 'mappingParameterNames', parameterNames.join(','));
152      }
153    }
154   
155    function saveSettings()
156    {
157      var frm = document.forms['testwithfile'];
158      var configWin = window.opener;
159      configWin.setParameterValue('file', frm.path.value);
160      configWin.setParameterValue('headerRegexp', frm.header.value);
161      configWin.setParameterValue('dataHeaderRegexp', frm.dataHeader.value);
162      configWin.setParameterValue('dataSplitterRegexp', frm.dataSplitter.value);
163      configWin.setParameterValue('dataFooterRegexp', frm.dataFooter.value);
164      configWin.setParameterValue('ignoreRegexp', frm.ignore.value);
165      configWin.setParameterValue('minDataColumns', frm.minDataColumns.value);
166      configWin.setParameterValue('maxDataColumns', frm.maxDataColumns.value);
167      configWin.setParameterValue('trimQuotes', frm.trimQuotes.checked ? 'true' : 'false');
168      configWin.setParameterValue('<%=Parameters.CHARSET_PARAMETER%>', frm.charset[frm.charset.selectedIndex].value);
169      for (var i = 0; i < parameterNames.length; i++)
170      {
171        var name = parameterNames[i];
172        configWin.setParameterValue(name, frm['mapping.'+name+'.expression'].value);
173      }
174      window.close();
175    }
176   
177    function setFormValue(field, value)
178    {
179      var frm = document.forms['testwithfile'];
180      frm.elements[field].value = value;
181    }
182   
183    </script>
184  </base:head>
185  <base:body onload="init();">
186
187  <m:menu 
188    id="predefinedSplitters"
189    style="display: none;">
190 
191    <m:menuitem 
192      title="Tab" 
193      onclick="setRegexp('dataSplitter', '\\\\t')"
194      tooltip="Splits data on tab"
195    />
196    <m:menuitem 
197      title="Comma" 
198      onclick="setRegexp('dataSplitter', ',')"
199      tooltip="Splits data on comma"
200    />
201    <m:menuitem 
202      title="Semicolon" 
203      onclick="setRegexp('dataSplitter', ';')"
204      tooltip="Splits data on semicolon"
205    />
206    <m:menuseparator />
207    <m:menuitem 
208      title="Tab with quotes" 
209      onclick="setRegexp('dataSplitter', preQuote+'\\\\t'+postQuote)"
210      tooltip="Splits data on tab, but only if it is has quotes before and after"
211    />
212    <m:menuitem 
213      title="Comma with quotes" 
214      onclick="setRegexp('dataSplitter', preQuote+','+postQuote)"
215      tooltip="Splits data on comma, but only if it is has quotes before and after"
216    />
217    <m:menuitem 
218      title="Semicolon with quotes" 
219      onclick="setRegexp('dataSplitter', preQuote+';'+postQuote)"
220      tooltip="Splits data on semicolon, but only if it is has quotes before and after"
221    />
222    <m:menuseparator />
223    <m:menuitem 
224      title="Comma; ignored inside quotes" 
225      onclick="setRegexp('dataSplitter', ','+notInsideQoute)"
226      tooltip="Splits data on comma, but not if they are inside quotes"
227    />
228    <m:menuitem 
229      title="Semicolon; ignored inside quotes" 
230      onclick="setRegexp('dataSplitter', ';'+notInsideQoute)"
231      tooltip="Splits data on semicolon, but not if they are inside quotes"
232    />
233  </m:menu>
234
235  <m:menu 
236    id="predefinedHeaders"
237    style="display: none;">
238    <m:menuitem 
239      title="Key = value" 
240      onclick="setRegexp('header', '(.+)=(.*)')"
241      tooltip="Headers have a key and value separated by an equal sign"
242    />
243    <m:menuitem
244      title="Key = value; remove whitespace and quotes"
245      onclick="setRegexp('header', whiteSpaceOrQuote + '(.+?)' + whiteSpaceOrQuote + '=' + whiteSpaceOrQuote + '(.*?)' + whiteSpaceOrQuote)"
246      tooltip="Header have a key and value separated by an equal sign; whitespace and quotes are removed"
247    />
248  </m:menu>
249 
250  <m:menu 
251    id="predefinedIgnore"
252    style="display: none;">
253    <m:menuitem 
254      title="# Comment" 
255      onclick="setRegexp('ignore', '#.*')"
256      tooltip="Ignore all lines starting with #"
257    />
258    <m:menuitem 
259      title="Empty line" 
260      onclick="setRegexp('ignore', '\\\\s*')"
261      tooltip="Ignore all lines that contains nothing but white-space"
262    />
263  </m:menu>
264    <h1>Test with file <base:help helpid="runplugin.testwithfile" /></h1>
265    <form name="testwithfile" action="parse_file.jsp?ID=<%=ID%>" target="parsed" method="post" onsubmit="return false;">
266    <input type="hidden" name="file_id" value="">
267
268    <div class="content">
269      <div class="absolutefull" style="height: 15em;">
270      <table class="fullform input100 bottomborder">
271      <tr>
272        <th>File to test</th>
273        <td colspan="3">
274          <table style="width: 100%;">
275            <tr>
276            <td><input type="text" class="text required" name="path" value=""></td>
277            <td style="width: 11em;"><base:button title="Browse&hellip;" onclick="browseOnClick()" style="width: 10em;" /></td>
278            <td style="width: 11em;"><base:button title="Parse the file" onclick="doParse()" style="width: 10em;" image="gonext.png"/></td>
279            </tr>
280          </table>
281        </td>
282      </tr>
283      <tr>
284        <th>Lines to parse</th>
285        <td>
286          <input type="text" class="text" name="maxLines" style="width: 15em;" maxlength="10"
287            value="<%=FlatFileParser.DEFAULT_MAX_UNKNOWN_LINES%>"
288            onkeypress="return Numbers.integerOnly(event)">
289        </td>
290        <th class="leftborder">Character set</th>
291        <td>
292          <select name="charset">
293          <%
294          String defaultCharset = Config.getCharset();
295          int numCommon = Config.getCommonCharsets().size();
296          int i = 0;
297          for (String charset : Config.getAllCharsets())
298          {
299            %>
300            <option value="<%=charset%>" 
301              <%=defaultCharset.equalsIgnoreCase(charset) ? "selected" : ""%> 
302              <%=i==numCommon ? "style=\"border-top: 1px solid #666666;\"" : "" %>><%=charset%>
303            <%
304            i++;
305          }
306          %>
307          </select>
308        </td>
309      </tr>
310      <tr >
311        <th>Header regexp</th>
312        <td>
313          <table style="width: 100%;">
314          <tr>
315          <td><input type="text" class="text" name="header"></td>
316          <td style="width: 11em;">
317            <base:button title="Predefined&hellip;" style="width: 10em;"
318              onclick="showPredefined(event, 'predefinedHeaders')" />
319          </td>
320          </tr>
321          </table>
322        </td>
323        <th class="leftborder">Min data columns</th>
324        <td>
325          <input type="text" class="text" name="minDataColumns" style="width: 15em;" maxlength="10"
326            onkeypress="return Numbers.integerOnly(event)">
327        </td>
328      </tr>
329      <tr >
330        <th>Data splitter regexp</th>
331        <td>
332          <table style="width: 100%;">
333          <tr>
334          <td><input type="text" class="text required" name="dataSplitter" ></td>
335          <td style="width: 11em;">
336            <base:button title="Predefined&hellip;" style="width: 10em;"
337              onclick="showPredefined(event, 'predefinedSplitters')" />
338          </td>
339          </tr>
340          </table>
341        </td>
342        <th class="leftborder">Max data columns</th>
343        <td>
344          <input type="text" class="text" name="maxDataColumns" style="width: 15em;" maxlength="10"
345            onkeypress="return Numbers.integerOnly(event)">
346        </td>
347      </tr>
348      <tr >
349        <th>Ignore regexp</th>
350        <td>
351          <table style="width: 100%;">
352          <tr>
353          <td><input type="text" class="text" name="ignore"></td>
354          <td style="width: 11em;">
355            <base:button title="Predefined&hellip;" style="width: 10em;"
356              onclick="showPredefined(event, 'predefinedIgnore')" />
357          </td>
358          </tr>
359          </table>
360        </td>
361        <th class="leftborder"><label for="trimQuotes">Remove quotes</label></th>
362        <td><input type="checkbox" name="trimQuotes" id="trimQuotes" value="1"></td>
363      </tr>
364      <tr >
365        <th>Data header regexp</th>
366        <td><input type="text" class="text" name="dataHeader"></td>
367        <th class="subprompt leftborder"></th>
368        <td></td>
369      </tr>
370      <tr class="dynamic">
371        <th>Data footer regexp</th>
372        <td><input type="text" class="text" name="dataFooter"></td>
373        <th class="subprompt leftborder"></th>
374        <td></td>
375      </tr>
376       
377      </table>
378    </div>
379     
380    <div class="absolutefull" style="top: 16em;">
381      <iframe name="parsed" id="idParsed" src="parse_file.jsp?ID=<%=ID%>" 
382        style="width: 100%; height: 100%;"></iframe>
383    </div>
384 
385    </div>
386    </form>
387 
388    <base:buttongroup subclass="dialogbuttons">
389      <base:button onclick="saveSettings();" title="Ok" />
390      <base:button onclick="window.close();" title="Cancel" />
391    </base:buttongroup>
392  </base:body>
393  </base:page>
394  <%
395}
396finally
397{
398  if (dc != null) dc.close();
399}
400%>
401
Note: See TracBrowser for help on using the repository browser.