source: trunk/www/common/plugin/index.jsp @ 3480

Last change on this file since 3480 was 3480, checked in by Martin Svensson, 16 years ago

References #426 Option to flag an import/export job to be removed, when finished successfully, is now implemented.
Need to be documented too....

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 20.5 KB
Line 
1<%-- $Id: index.jsp 3480 2007-06-13 10:39:31Z martin $
2  ------------------------------------------------------------------
3  Copyright (C) Authors contributing to this file.
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 2
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330,
21  Boston, MA  02111-1307, USA.
22  ------------------------------------------------------------------
23
24  @author Nicklas
25  @version 2.0
26--%>
27<%@ page session="false"
28  import="net.sf.basedb.core.SessionControl"
29  import="net.sf.basedb.core.DbControl"
30  import="net.sf.basedb.core.BasicItem"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.ItemQuery"
34  import="net.sf.basedb.core.PluginDefinition"
35  import="net.sf.basedb.core.PluginConfiguration"
36  import="net.sf.basedb.core.PluginParameter"
37  import="net.sf.basedb.core.ParameterType"
38  import="net.sf.basedb.core.StringParameterType"
39  import="net.sf.basedb.core.IntegerParameterType"
40  import="net.sf.basedb.core.LongParameterType"
41  import="net.sf.basedb.core.FloatParameterType"
42  import="net.sf.basedb.core.DoubleParameterType"
43  import="net.sf.basedb.core.ItemParameterType"
44  import="net.sf.basedb.core.DateParameterType"
45  import="net.sf.basedb.core.BooleanParameterType"
46  import="net.sf.basedb.core.FileParameterType"
47  import="net.sf.basedb.core.PathParameterType"
48  import="net.sf.basedb.core.File"
49  import="net.sf.basedb.core.Path"
50  import="net.sf.basedb.core.Job"
51  import="net.sf.basedb.core.Type"
52  import="net.sf.basedb.core.BaseException"
53  import="net.sf.basedb.core.PluginConfigurationRequest"
54  import="net.sf.basedb.core.PluginExecutionRequest"
55  import="net.sf.basedb.core.PluginResponse"
56  import="net.sf.basedb.core.Include"
57  import="net.sf.basedb.core.query.Hql"
58  import="net.sf.basedb.core.query.Expressions"
59  import="net.sf.basedb.core.query.Restrictions"
60  import="net.sf.basedb.core.query.Orders"
61  import="net.sf.basedb.core.plugin.Plugin"
62  import="net.sf.basedb.core.plugin.Response"
63  import="net.sf.basedb.core.plugin.GuiContext"
64  import="net.sf.basedb.core.plugin.InteractivePlugin"
65  import="net.sf.basedb.core.plugin.ExportOutputStream"
66  import="net.sf.basedb.clients.web.Base"
67  import="net.sf.basedb.clients.web.WebException"
68  import="net.sf.basedb.util.Values"
69  import="net.sf.basedb.util.ContextUtil"
70  import="net.sf.basedb.util.ContextUtil.ContextResult"
71  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
72  import="net.sf.basedb.clients.web.util.HTML"
73  import="net.sf.basedb.clients.web.util.ServletExportOutputStream"
74  import="java.util.List"
75  import="java.util.LinkedList"
76  import="java.util.Arrays"
77  import="java.util.Map"
78  import="java.util.HashMap"
79  import="java.util.LinkedHashMap"
80  import="java.util.Set"
81  import="java.util.HashSet"
82  import="java.io.PrintWriter"
83%>
84<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
85<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
86
87<%!
88private static String getJspPage(PluginConfigurationRequest request, PluginDefinition plugin, String defaultPage)
89{
90  String jspPage = request.getRequestInformation().getJspPage();
91  if (jspPage == null)
92  {
93    jspPage = defaultPage;
94  }
95  else
96  {
97    String className = plugin.getClassName();
98    int lastDot = className.lastIndexOf('.');
99    String packageName = lastDot == -1 ? "" : className.substring(0, lastDot+1);
100    jspPage = "/plugins/"+packageName.replace('.', '/')+jspPage;
101  }
102  return jspPage;
103}
104%>
105
106<%
107final String root = request.getContextPath()+"/";
108final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
109final String ID = sc.getId();
110final String cmd = request.getParameter("cmd");
111
112DbControl dc = null;
113String forward = null;
114String message = null;
115String redirect = null;
116try
117{
118
119  if ("SelectPlugin".equals(cmd))
120  {
121    Item itemType = Item.valueOf(request.getParameter("item_type"));
122    String subContext = Values.getString(request.getParameter("subcontext"), "");
123    GuiContext.Type contextType = GuiContext.Type.valueOf(request.getParameter("context_type"));
124    GuiContext context = new GuiContext(itemType, contextType, subContext);
125    Plugin.MainType mainType = Plugin.MainType.valueOf(request.getParameter("main_type"));
126
127    ItemQuery<PluginDefinition> pluginQuery = PluginDefinition.getQuery(context, null);
128    pluginQuery.restrict(
129      Restrictions.eq(
130        Hql.property("mainType"),
131        Expressions.integer(mainType.getValue())
132      )
133    );
134    pluginQuery.order(Orders.asc(Hql.property("name")));
135    pluginQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
136   
137    ItemQuery<PluginConfiguration> configQuery = PluginConfiguration.getQuery();
138    configQuery.restrict(
139        Restrictions.eq(
140          Hql.property("pluginDefinition"),
141          Expressions.parameter("plugin")
142        )
143      );
144    configQuery.order(Orders.asc(Hql.property("name")));
145    configQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
146   
147    dc = sc.newDbControl();
148    Object currentItem = null;
149    if (contextType == GuiContext.Type.ITEM)
150    {
151      currentItem = itemType.getById(dc, sc.getCurrentContext(itemType).getId());
152    }
153    List<ContextResult> contextResult = ContextUtil.checkContext(dc, pluginQuery, configQuery, context, currentItem);
154    dc.close();
155
156    boolean showWarnings = Values.getBoolean(sc.getUserClientSetting("plugins.showWarnings"), true);
157    int totalPlugins = ContextUtil.countUsuablePlugins(contextResult);
158    Set<String> contextMessages = ContextUtil.getContextMessages(contextResult, showWarnings, true);
159   
160    if (totalPlugins == 0)
161    {
162      String msg = "No plugins can be used in this context, for the following reasons:<br><ul><li>";
163      if (contextMessages.size() == 0)
164      {
165        msg += "Could not find any plugins that you have permission to use</ul>";
166      }
167      else
168      {
169        msg += Values.getString(contextMessages, "<li>", true) + "</ul>";
170      }
171      throw new WebException("popup", "No usable plugins found", msg);
172    }
173    sc.setSessionSetting("MESSAGES", contextMessages);
174    sc.setSessionSetting("PLUGINS", contextResult);
175    if (false && totalPlugins == 1 && contextMessages.size() == 0)
176    {
177      // Only one plug-in exists, go directly to parameter input page
178      PluginDefinition thePlugin = contextResult.get(0).getPluginDefinition();
179      PluginConfiguration theConfig = contextResult.get(0).getPluginConfiguration();
180      int pluginDefinitionId = thePlugin.getId();
181      int pluginConfigurationId = theConfig == null ? 0 : theConfig.getId();
182      forward = "index.jsp?cmd=NewJob"+
183        "&plugindefinition_id="+pluginDefinitionId+
184        "&pluginconfiguration_id="+pluginConfigurationId;
185    }
186    else
187    {
188      forward = "select_plugin.jsp";
189    }
190  }
191  else if ("ConfigurePlugin".equals(cmd))
192  {
193    int pluginConfigurationId = Values.getInt(request.getParameter("pluginconfiguration_id"));
194   
195    dc = sc.newDbControl();
196    PluginConfiguration pluginConfig = PluginConfiguration.getById(dc, pluginConfigurationId);
197    PluginDefinition plugin = pluginConfig.getPluginDefinition();
198   
199    if (!plugin.supportsConfigurations())
200    {
201      throw new WebException("popup", "Configurations are not supported",
202        "The plugin {1} doesn't support configurations.", HTML.encodeTags(plugin.getName()));
203    }
204    PluginConfigurationRequest pcRequest = pluginConfig.configure();
205   
206    sc.setSessionSetting("plugin.configure.request", pcRequest);
207    sc.setSessionSetting("plugin.configure.job", null);
208    sc.setSessionSetting("plugin.configure.plugin", plugin);
209    sc.setSessionSetting("plugin.configure.config", pluginConfig);
210    sc.setSessionSetting("plugin.configure.errors.message", null);
211    sc.setSessionSetting("plugin.configure.errors.list", null);
212    forward = getJspPage(pcRequest, plugin, "configure.jsp");
213  }
214
215  else if ("NewJob".equals(cmd))
216  {
217    String pluginClass = request.getParameter("plugin_class");
218    int pluginDefinitionId = Values.getInt(request.getParameter("plugindefinition_id"));
219    int pluginConfigurationId = Values.getInt(request.getParameter("pluginconfiguration_id"));
220    Item itemType = Item.valueOf(request.getParameter("item_type"));
221    String subContext = Values.getString(request.getParameter("subcontext"), "");
222    ItemContext currentContext = sc.getCurrentContext(itemType, subContext);
223    GuiContext.Type contextType = GuiContext.Type.valueOf(request.getParameter("context_type"));
224    GuiContext context = new GuiContext(itemType, contextType, subContext);
225   
226    dc = sc.newDbControl();
227    PluginDefinition plugin = pluginClass == null ? 
228      PluginDefinition.getById(dc, pluginDefinitionId) : PluginDefinition.getByClassName(dc, pluginClass);
229    PluginConfiguration pluginConfig = pluginConfigurationId == 0 ? null : PluginConfiguration.getById(dc, pluginConfigurationId);
230    Job job = Job.getNew(dc, plugin, pluginConfig);
231    String jobName = Values.getStringOrNull(request.getParameter("job_name"));
232    job.setName(jobName == null ? "Run plugin: " + plugin.getName() : jobName);
233    job.setDescription(request.getParameter("job_description"));
234   
235    PluginConfigurationRequest pcRequest = job.configure(context);
236    sc.setSessionSetting("plugin.configure.request", pcRequest);
237    sc.setSessionSetting("plugin.configure.job", job);
238    sc.setSessionSetting("plugin.configure.plugin", plugin);
239    sc.setSessionSetting("plugin.configure.config", pluginConfig);
240    sc.setSessionSetting("plugin.configure.errors.message", null);
241    sc.setSessionSetting("plugin.configure.errors.list", null);
242    sc.setSessionSetting("plugin.configure.currentContext", currentContext);
243    forward = getJspPage(pcRequest, plugin, "configure.jsp");
244  }
245 
246  else if ("CopyJob".equals(cmd))
247  {
248    dc = sc.newDbControl();
249    int jobId = Values.getInt(request.getParameter("job_id"));
250    Job copyFrom = Job.getById(dc, jobId);
251    PluginDefinition plugin = copyFrom.getPluginDefinition();
252    PluginConfiguration pluginConfig = copyFrom.getPluginConfiguration();
253   
254    Job job = Job.getNew(dc, plugin, pluginConfig);
255    job.copyParametersFrom(copyFrom);
256   
257    Item itemType = Item.valueOf(request.getParameter("item_type"));
258    String subContext = Values.getString(request.getParameter("subcontext"), "");
259    ItemContext currentContext = sc.getCurrentContext(itemType, subContext);
260    GuiContext.Type contextType = GuiContext.Type.valueOf(request.getParameter("context_type"));
261    GuiContext context = new GuiContext(itemType, contextType, subContext);
262   
263    PluginConfigurationRequest pcRequest = job.configure(context);
264    sc.setSessionSetting("plugin.configure.request", pcRequest);
265    sc.setSessionSetting("plugin.configure.job", job);
266    sc.setSessionSetting("plugin.configure.plugin", plugin);
267    sc.setSessionSetting("plugin.configure.config", pluginConfig);
268    sc.setSessionSetting("plugin.configure.errors.message", null);
269    sc.setSessionSetting("plugin.configure.errors.list", null);
270    sc.setSessionSetting("plugin.configure.currentContext", currentContext);
271    forward = getJspPage(pcRequest, plugin, "configure.jsp");
272  }
273 
274  else if ("ConfigureJob".equals(cmd))
275  {
276    dc = sc.newDbControl();
277
278    int jobId = Values.getInt(request.getParameter("job_id"));
279    Job job = Job.getById(dc, jobId);
280   
281    // TODO - This is not meaningful unless we can get a context
282    //int pluginDefinitionId = Values.getInt(request.getParameter("plugindefinition_id"));
283    //int pluginConfigurationId = Values.getInt(request.getParameter("pluginconfiguration_id"));
284   
285    //Item itemType = Item.valueOf(request.getParameter("item_type"));
286    //String subContext = Values.getString(request.getParameter("subcontext"), "");
287    //GuiContext.Type contextType = GuiContext.Type.valueOf(request.getParameter("context_type"));
288    //GuiContext context = new GuiContext(itemType, contextType, subContext);
289   
290    PluginDefinition plugin = job.getPluginDefinition();
291    PluginConfiguration pluginConfig = job.getPluginConfiguration();
292   
293    PluginConfigurationRequest pcRequest = job.configure(null);
294    sc.setSessionSetting("plugin.configure.request", pcRequest);
295    sc.setSessionSetting("plugin.configure.job", job);
296    sc.setSessionSetting("plugin.configure.plugin", plugin);
297    sc.setSessionSetting("plugin.configure.config", pluginConfig);
298    sc.setSessionSetting("plugin.configure.errors.message", null);
299    sc.setSessionSetting("plugin.configure.errors.list", null);
300    forward = getJspPage(pcRequest, plugin, "configure.jsp");
301  }
302
303  else if ("SetParameters".equals(cmd))
304  {
305    int maxRecent = Base.getMaxRecent(sc);
306    PluginConfigurationRequest pcRequest = (PluginConfigurationRequest)sc.getSessionSetting("plugin.configure.request");
307    List<PluginParameter<?>> parameters =  pcRequest.getRequestInformation().getParameters();
308    List<Throwable> parseErrors = new LinkedList<Throwable>();
309    ItemContext currentContext = (ItemContext)sc.getSessionSetting("plugin.configure.currentContext");
310    // Clear old errors
311    sc.setSessionSetting("plugin.configure.errors.message", null);
312    sc.setSessionSetting("plugin.configure.errors.list", null);
313    if (parameters != null && parameters.size() > 0)
314    {
315      for (PluginParameter<?> param : parameters)
316      {
317        ParameterType pType = param.getParameterType();
318        if (pType != null)
319        {
320          String[] sValues = request.getParameterValues("parameter:"+param.getName());
321          Object[] oValues = null;
322          try
323          {
324            if (sValues != null)
325            {
326              if (pType instanceof StringParameterType)
327              {
328                oValues = sValues;
329              }
330              else if (pType instanceof IntegerParameterType)
331              {
332                oValues = Values.getInt(sValues);
333              }
334              else if (pType instanceof LongParameterType)
335              {
336                oValues = Values.getLong(sValues);
337              }
338              else if (pType instanceof FloatParameterType)
339              {
340                oValues = Values.getFloat(sValues);
341              }
342              else if (pType instanceof DoubleParameterType)
343              {
344                oValues = Values.getDouble(sValues);
345              }
346              else if (pType instanceof BooleanParameterType)
347              {
348                oValues = Type.BOOLEAN.parseStrings(sValues);
349              }
350              else if (pType instanceof DateParameterType)
351              {
352                oValues = Values.getDate(sValues, FormatterFactory.getDateFormatter(sc));
353              }
354              else if (pType instanceof ItemParameterType)
355              {
356                Integer[] itemId = Values.getInt(sValues);
357                oValues = new Object[itemId.length];
358                Item iType = Item.fromItemClass(pType.getParameterClass());
359                dc = sc.newDbControl();
360                for (int i = 0; i < itemId.length; ++i)
361                {
362                  Integer id = itemId[i];
363                  if (id != null && id != 0)
364                  {
365                    BasicItem item = iType.getById(dc, id);
366                    oValues[i] = item;
367                    if (currentContext != null) 
368                    {
369                      currentContext.setRecent(item, maxRecent);
370                    }
371                  }
372                }
373                dc.close();
374              }
375              else if (pType instanceof FileParameterType)
376              {
377                oValues = new Object[sValues.length];
378                dc = sc.newDbControl();
379                for (int i = 0; i < sValues.length; ++i)
380                {
381                  File file = File.getByPath(dc, new Path(sValues[i], Path.Type.FILE), false);
382                  oValues[i] = file;
383                  if (currentContext != null) 
384                  {
385                    currentContext.setRecent(file, maxRecent);
386                  }
387                }
388                dc.close();
389              }
390              else if (pType instanceof PathParameterType)
391              {
392                oValues = sValues;
393              }
394            }
395          }
396          catch (Throwable t)
397          {
398            parseErrors.add(t);
399          }
400          pcRequest.setParameterValues(param.getName(), oValues == null ? null : Arrays.asList(oValues));
401        }
402      }
403    }
404    PluginResponse pluginResponse = null;
405    Response.Status status = null;
406    if (parseErrors.size() == 0)
407    {
408      pluginResponse = pcRequest.invoke();
409      status = pluginResponse.getStatus();
410    }
411    else
412    {
413      status = Response.Status.ERROR;
414    }
415    if (status == Response.Status.DONE || status == Response.Status.EXECUTE_IMMEDIATELY)
416    {
417      Job job = (Job)sc.getSessionSetting("plugin.configure.job");
418      if (job != null)
419      {
420        sc.setSessionSetting("plugin.configure.response", pluginResponse);
421        forward = "finish_job.jsp";
422      }
423      else
424      {
425        dc = sc.newDbControl();
426        pluginResponse.saveParameters(dc);
427        dc.commit();
428        sc.setSessionSetting("plugin.configure.request", null);
429        sc.setSessionSetting("plugin.configure.plugin", null);
430        sc.setSessionSetting("plugin.configure.config", null);
431        sc.setSessionSetting("plugin.configure.currentContext", null);
432        message = "Plugin configured";
433      }
434    }
435    else if (status == Response.Status.CONTINUE)
436    {
437      pcRequest = pluginResponse.getNextRequest();
438      sc.setSessionSetting("plugin.configure.request", pcRequest);
439      PluginDefinition plugin = (PluginDefinition)sc.getSessionSetting("plugin.configure.plugin");
440      forward = getJspPage(pcRequest, plugin, "configure.jsp");
441    }
442    else if (status == Response.Status.ERROR)
443    {
444      PluginDefinition plugin = (PluginDefinition)sc.getSessionSetting("plugin.configure.plugin");
445      if (parseErrors.size() > 0)
446      {
447        sc.setSessionSetting("plugin.configure.errors.message", 
448          parseErrors.size() + " parameter value(s) are invalid");
449        sc.setSessionSetting("plugin.configure.errors.list", parseErrors);
450      }
451      else
452      {
453        sc.setSessionSetting("plugin.configure.errors.message", pluginResponse.getMessage());
454        sc.setSessionSetting("plugin.configure.errors.list", pluginResponse.getErrorList());
455      }
456      forward = getJspPage(pcRequest, plugin, "configure.jsp");
457    }
458    else if (status == Response.Status.DOWNLOAD_IMMEDIATELY)
459    {
460      sc.setSessionSetting("plugin.configure.response", pluginResponse);
461      forward = "download_immediately.jsp";
462    }
463    else
464    {
465      throw new WebException("popup", "Unknown response from plugin", status.toString());
466    }
467  }
468  else if ("FinishNewJob".equals(cmd))
469  {
470    dc = sc.newDbControl();
471    Job job = (Job)sc.getSessionSetting("plugin.configure.job");
472    PluginResponse pluginResponse = (PluginResponse)sc.getSessionSetting("plugin.configure.response");
473
474    job.setName(Values.getStringOrNull(request.getParameter("name")));
475    job.setDescription(Values.getStringOrNull(request.getParameter("description")));
476    job.setSendMessage(Values.getBoolean(request.getParameter("send_message")));
477    job.setRemoveJobWhenFinished(Values.getBoolean(request.getParameter("remove_job")));
478    dc.saveItem(job);
479    if (pluginResponse != null) pluginResponse.saveParameters(dc);
480    dc.commit();
481    redirect = "../../views/jobs/index.jsp?ID="+ID+"&cmd=ViewItem&item_id="+job.getId();
482    sc.setSessionSetting("plugin.configure.job", null);
483    sc.setSessionSetting("plugin.configure.request", null);
484    sc.setSessionSetting("plugin.configure.response", null);
485    sc.setSessionSetting("plugin.configure.plugin", null);
486    sc.setSessionSetting("plugin.configure.config", null);
487    sc.setSessionSetting("plugin.configure.currentContext", null);
488    if (pluginResponse != null && pluginResponse.getStatus() == Response.Status.EXECUTE_IMMEDIATELY)
489    {
490      PluginExecutionRequest executionRequest = pluginResponse.getExecutionRequest(null);
491      Thread t = new Thread(executionRequest);
492      t.setPriority(Thread.currentThread().getPriority() - 1);
493      t.start();
494    }
495  }
496  else if ("ExportImmediately".equals(cmd))
497  {
498    PluginResponse pluginResponse = (PluginResponse)sc.getSessionSetting("plugin.configure.response");
499    ExportOutputStream exportStream = new ServletExportOutputStream(response);
500    try
501    {
502      pluginResponse.downloadImmediately(exportStream, null);
503    }
504    catch (Throwable t)
505    {
506      PrintWriter pw = new PrintWriter(exportStream, true);
507      t.printStackTrace(pw);
508      pw.flush();
509      pw.close();
510      System.out.println("EXCEPTION:" + t.toString());
511    }
512    exportStream.flush();
513    exportStream.close();
514    sc.setSessionSetting("plugin.configure.job", null);
515    sc.setSessionSetting("plugin.configure.request", null);
516    sc.setSessionSetting("plugin.configure.response", null);
517    sc.setSessionSetting("plugin.configure.plugin", null);
518    sc.setSessionSetting("plugin.configure.config", null);
519    sc.setSessionSetting("plugin.configure.errors.message", null);
520    sc.setSessionSetting("plugin.configure.errors.list", null);
521    sc.setSessionSetting("plugin.configure.currentContext", null);
522    return;
523  }
524  else
525  {
526    throw new WebException("popup", "Invalid command", "The command {1} is not recognised as a valid command.", cmd);
527  }
528}
529finally
530{
531  if (dc != null) dc.close();
532}
533
534if (forward != null)
535{
536  pageContext.forward(forward);
537}
538else if (redirect != null)
539{
540  response.sendRedirect(redirect);
541}
542else if (message == null)
543{
544  response.sendRedirect(root + "common/close_popup.jsp?refresh_opener=1&wait=0");
545}
546else
547{
548  response.sendRedirect(root + "common/close_popup.jsp?refresh_opener=1&message="+HTML.urlEncode(message));
549}
550%>
Note: See TracBrowser for help on using the repository browser.