extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/servlet/SessionServlet.java

Code
Comments
Other
Rev Date Author Line
1897 06 Mar 13 nicklas 1 package net.sf.basedb.reggie.servlet;
1897 06 Mar 13 nicklas 2
1897 06 Mar 13 nicklas 3 import java.io.IOException;
7115 17 Apr 23 nicklas 4 import java.io.InputStreamReader;
6864 04 Nov 22 nicklas 5 import java.io.OutputStream;
7115 17 Apr 23 nicklas 6 import java.io.PrintWriter;
7115 17 Apr 23 nicklas 7 import java.io.Reader;
5376 23 Apr 19 nicklas 8 import java.time.LocalDateTime;
5376 23 Apr 19 nicklas 9 import java.time.ZoneId;
5376 23 Apr 19 nicklas 10 import java.time.temporal.ChronoUnit;
3124 09 Feb 15 nicklas 11 import java.util.Date;
5376 23 Apr 19 nicklas 12 import java.util.Locale;
7117 18 Apr 23 nicklas 13 import java.util.regex.Pattern;
1897 06 Mar 13 nicklas 14
1897 06 Mar 13 nicklas 15 import javax.servlet.ServletException;
1897 06 Mar 13 nicklas 16 import javax.servlet.http.HttpServlet;
1897 06 Mar 13 nicklas 17 import javax.servlet.http.HttpServletRequest;
1897 06 Mar 13 nicklas 18 import javax.servlet.http.HttpServletResponse;
1897 06 Mar 13 nicklas 19
7024 07 Feb 23 nicklas 20 import org.apache.commons.lang3.time.FastDateFormat;
5375 18 Apr 19 nicklas 21 import org.json.simple.JSONArray;
1897 06 Mar 13 nicklas 22 import org.json.simple.JSONObject;
1897 06 Mar 13 nicklas 23
6864 04 Nov 22 nicklas 24 import net.lingala.zip4j.io.ZipOutputStream;
6864 04 Nov 22 nicklas 25 import net.lingala.zip4j.model.ZipParameters;
6864 04 Nov 22 nicklas 26 import net.lingala.zip4j.util.Zip4jConstants;
7115 17 Apr 23 nicklas 27 import net.sf.basedb.clients.web.util.HTML;
5740 20 Nov 19 nicklas 28 import net.sf.basedb.core.Application;
1897 06 Mar 13 nicklas 29 import net.sf.basedb.core.DbControl;
1990 23 May 13 nicklas 30 import net.sf.basedb.core.Directory;
6864 04 Nov 22 nicklas 31 import net.sf.basedb.core.File;
1990 23 May 13 nicklas 32 import net.sf.basedb.core.Item;
1990 23 May 13 nicklas 33 import net.sf.basedb.core.Path;
1897 06 Mar 13 nicklas 34 import net.sf.basedb.core.SessionControl;
3904 29 Apr 16 nicklas 35 import net.sf.basedb.core.SimpleProgressReporter;
5919 24 Apr 20 nicklas 36 import net.sf.basedb.reggie.AbortableProgressReporter;
2598 22 Aug 14 nicklas 37 import net.sf.basedb.reggie.JsonUtil;
3124 09 Feb 15 nicklas 38 import net.sf.basedb.reggie.Reggie;
5740 20 Nov 19 nicklas 39 import net.sf.basedb.reggie.activity.ActivityDef;
5376 23 Apr 19 nicklas 40 import net.sf.basedb.reggie.activity.ActivityEntry;
5376 23 Apr 19 nicklas 41 import net.sf.basedb.reggie.activity.ActivityLog;
5761 28 Nov 19 nicklas 42 import net.sf.basedb.reggie.activity.QuoteOfTheDay;
5376 23 Apr 19 nicklas 43 import net.sf.basedb.reggie.converter.DateToStringConverter;
3059 19 Dec 14 nicklas 44 import net.sf.basedb.reggie.counter.CounterService;
6864 04 Nov 22 nicklas 45 import net.sf.basedb.reggie.dao.Annotationtype;
7115 17 Apr 23 nicklas 46 import net.sf.basedb.reggie.extensions.TabularViewActionFactory;
6864 04 Nov 22 nicklas 47 import net.sf.basedb.util.FileUtil;
1897 06 Mar 13 nicklas 48 import net.sf.basedb.util.Values;
1897 06 Mar 13 nicklas 49 import net.sf.basedb.util.error.ThrowableUtil;
1897 06 Mar 13 nicklas 50
1897 06 Mar 13 nicklas 51 /**
1897 06 Mar 13 nicklas 52   Get information about the current session.
1897 06 Mar 13 nicklas 53   
1897 06 Mar 13 nicklas 54   @author nicklas
1897 06 Mar 13 nicklas 55    @since 2.12
1897 06 Mar 13 nicklas 56 */
1897 06 Mar 13 nicklas 57 public class SessionServlet 
1897 06 Mar 13 nicklas 58   extends HttpServlet 
1897 06 Mar 13 nicklas 59 {
1897 06 Mar 13 nicklas 60
1897 06 Mar 13 nicklas 61   private static final long serialVersionUID = -1308781977707573172L;
1897 06 Mar 13 nicklas 62
1897 06 Mar 13 nicklas 63   public SessionServlet()
1897 06 Mar 13 nicklas 64   {}
1897 06 Mar 13 nicklas 65
1897 06 Mar 13 nicklas 66   @Override
1897 06 Mar 13 nicklas 67   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
1897 06 Mar 13 nicklas 68     throws ServletException, IOException 
1897 06 Mar 13 nicklas 69   {
1897 06 Mar 13 nicklas 70     String cmd = req.getParameter("cmd");
5404 08 May 19 nicklas 71     if (cmd == null) cmd = req.getPathInfo();
2598 22 Aug 14 nicklas 72     JsonUtil.setJsonResponseHeaders(resp);
1897 06 Mar 13 nicklas 73     
1897 06 Mar 13 nicklas 74     JSONObject json = new JSONObject();
1897 06 Mar 13 nicklas 75     json.put("status", "ok");
1897 06 Mar 13 nicklas 76   
1897 06 Mar 13 nicklas 77     SessionControl sc = null;
1897 06 Mar 13 nicklas 78     DbControl dc = null;
1897 06 Mar 13 nicklas 79     try
1897 06 Mar 13 nicklas 80     {
1897 06 Mar 13 nicklas 81       if ("CheckSession".equals(cmd))
1897 06 Mar 13 nicklas 82       {
1897 06 Mar 13 nicklas 83         boolean simulateTimeout = Values.getBoolean(req.getParameter("simulateTimeout"));
1897 06 Mar 13 nicklas 84         JSONObject jsonSession = null;
1897 06 Mar 13 nicklas 85         try
1897 06 Mar 13 nicklas 86         {
3975 26 May 16 nicklas 87           sc = Reggie.getSessionControl(req);
1897 06 Mar 13 nicklas 88           if (sc.isLoggedIn())
1897 06 Mar 13 nicklas 89           {
1897 06 Mar 13 nicklas 90             if (simulateTimeout)
1897 06 Mar 13 nicklas 91             {
1897 06 Mar 13 nicklas 92               // Actually, not a simulation
1897 06 Mar 13 nicklas 93               sc.logout();
1897 06 Mar 13 nicklas 94             }
1897 06 Mar 13 nicklas 95             else
1897 06 Mar 13 nicklas 96             {
1897 06 Mar 13 nicklas 97               sc.updateLastAccess();
1897 06 Mar 13 nicklas 98               jsonSession = new JSONObject();
1897 06 Mar 13 nicklas 99               jsonSession.put("id", sc.getId());
1897 06 Mar 13 nicklas 100               jsonSession.put("lastAccess", sc.getLastAccess());
1897 06 Mar 13 nicklas 101             }
1897 06 Mar 13 nicklas 102           }
1897 06 Mar 13 nicklas 103         }
1897 06 Mar 13 nicklas 104         catch (RuntimeException ex)
1897 06 Mar 13 nicklas 105         {}
1897 06 Mar 13 nicklas 106         json.put("session", jsonSession);
1897 06 Mar 13 nicklas 107       }
1990 23 May 13 nicklas 108       else if ("SetCurrentDirectory".equals(cmd))
1990 23 May 13 nicklas 109       {
3975 26 May 16 nicklas 110         sc = Reggie.getSessionControl(req);
6337 16 Jun 21 nicklas 111         dc = sc.newDbControl(":Set current directory");
1990 23 May 13 nicklas 112         Path path = new Path(req.getParameter("path"), Path.Type.DIRECTORY);
1990 23 May 13 nicklas 113         try
1990 23 May 13 nicklas 114         {
1990 23 May 13 nicklas 115           int pathId = Directory.getIdFromPath(dc, path);
1990 23 May 13 nicklas 116           sc.getCurrentContext(Item.DIRECTORY).setId(pathId);
1990 23 May 13 nicklas 117           
1990 23 May 13 nicklas 118           JSONObject jsonPath = new JSONObject();
1990 23 May 13 nicklas 119           jsonPath.put("id", pathId);
1990 23 May 13 nicklas 120           jsonPath.put("name", path.toString());
1990 23 May 13 nicklas 121           json.put("path", jsonPath);
1990 23 May 13 nicklas 122         }
1990 23 May 13 nicklas 123         catch (RuntimeException ex)
1990 23 May 13 nicklas 124         {}
1990 23 May 13 nicklas 125       }
5376 23 Apr 19 nicklas 126       else if ("GetCountersAndActivityLog".equals(cmd))
3059 19 Dec 14 nicklas 127       {
3124 09 Feb 15 nicklas 128         boolean forceUpdate = Values.getBoolean(req.getParameter("forceUpdate"));
3124 09 Feb 15 nicklas 129         
3124 09 Feb 15 nicklas 130         CounterService svc = CounterService.getInstance();
3124 09 Feb 15 nicklas 131         if (forceUpdate) svc.setForceCountAndWait(5);
3124 09 Feb 15 nicklas 132         
3124 09 Feb 15 nicklas 133         long countTime = svc.getCurrentCountTime();
4691 13 Mar 18 nicklas 134         json.put("isCounting", svc.isCounting());
6091 01 Dec 20 nicklas 135         json.put("isRunning", svc.isRunning());
4691 13 Mar 18 nicklas 136         if (countTime > 0)
4691 13 Mar 18 nicklas 137         {
4691 13 Mar 18 nicklas 138           json.put("counts", svc.getCurrentCounts());
4691 13 Mar 18 nicklas 139           json.put("countTime", Reggie.CONVERTER_DATETIME_TO_STRING.convert(new Date(countTime)));
4691 13 Mar 18 nicklas 140           json.put("countAge", (System.currentTimeMillis()-countTime)/1000);
4691 13 Mar 18 nicklas 141         }
5376 23 Apr 19 nicklas 142         
5376 23 Apr 19 nicklas 143         JSONArray jsonActivityLog = new JSONArray();
5388 26 Apr 19 nicklas 144         String firstDay = null;
5376 23 Apr 19 nicklas 145         LocalDateTime today = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS);
7024 07 Feb 23 nicklas 146         DateToStringConverter toDay = new DateToStringConverter(FastDateFormat.getInstance("EEE d MMMM", Locale.ENGLISH));
7024 07 Feb 23 nicklas 147         DateToStringConverter toTime = new DateToStringConverter(FastDateFormat.getInstance("HH:mm", Locale.ENGLISH));
5376 23 Apr 19 nicklas 148         for (ActivityEntry activity : ActivityLog.getInstance().getActivities())
5376 23 Apr 19 nicklas 149         {
5376 23 Apr 19 nicklas 150           JSONObject jsonActivity = new JSONObject();
5376 23 Apr 19 nicklas 151           jsonActivity.put("message", activity.getMessage());
5376 23 Apr 19 nicklas 152           
5376 23 Apr 19 nicklas 153           LocalDateTime activityDay = activity.getEventDay();
5376 23 Apr 19 nicklas 154           long daysBetween = ChronoUnit.DAYS.between(activityDay, today);
5376 23 Apr 19 nicklas 155           if (daysBetween == 0) 
5376 23 Apr 19 nicklas 156           {
5376 23 Apr 19 nicklas 157             jsonActivity.put("day", "Today");
5376 23 Apr 19 nicklas 158           }
5376 23 Apr 19 nicklas 159           else if (daysBetween == 1)
5376 23 Apr 19 nicklas 160           {
5376 23 Apr 19 nicklas 161             jsonActivity.put("day", "Yesterday");
5376 23 Apr 19 nicklas 162           }
5376 23 Apr 19 nicklas 163           else
5376 23 Apr 19 nicklas 164           {
5376 23 Apr 19 nicklas 165             jsonActivity.put("day", toDay.convert(activity.getEventDate()));
5376 23 Apr 19 nicklas 166           }
5388 26 Apr 19 nicklas 167           if (firstDay == null) firstDay = (String)jsonActivity.get("day");
5376 23 Apr 19 nicklas 168           jsonActivity.put("time", toTime.convert(activity.getEventDate()));
5376 23 Apr 19 nicklas 169           jsonActivityLog.add(jsonActivity);
5376 23 Apr 19 nicklas 170         }
5388 26 Apr 19 nicklas 171         if (!"Today".equals(firstDay))
5388 26 Apr 19 nicklas 172         {
5388 26 Apr 19 nicklas 173           JSONObject jsonActivity = new JSONObject();
5388 26 Apr 19 nicklas 174           jsonActivity.put("time", toTime.convert(new Date()));
5761 28 Nov 19 nicklas 175           QuoteOfTheDay qod = ActivityLog.getInstance().getQuoteOfTheDay();
5761 28 Nov 19 nicklas 176           if (qod != null)
5761 28 Nov 19 nicklas 177           {
5761 28 Nov 19 nicklas 178             jsonActivity.put("message", qod.getQuote());
5761 28 Nov 19 nicklas 179             jsonActivity.put("author", qod.getAuthor());
5761 28 Nov 19 nicklas 180             jsonActivity.put("subclass", "quote-of-the-day");
5761 28 Nov 19 nicklas 181             jsonActivity.put("quoteOfTheDay", true);
5761 28 Nov 19 nicklas 182           }
5761 28 Nov 19 nicklas 183           else
5761 28 Nov 19 nicklas 184           {
5761 28 Nov 19 nicklas 185             // Add 'Nothing yet' as first entry of Today
5761 28 Nov 19 nicklas 186             jsonActivity.put("day", "Today");
5761 28 Nov 19 nicklas 187             jsonActivity.put("message", "Nothing yet");
5761 28 Nov 19 nicklas 188             jsonActivity.put("subclass", "nothing-yet");
5761 28 Nov 19 nicklas 189           }
5388 26 Apr 19 nicklas 190           jsonActivityLog.add(0, jsonActivity);
5388 26 Apr 19 nicklas 191         }
5376 23 Apr 19 nicklas 192         json.put("activityLog", jsonActivityLog);
5376 23 Apr 19 nicklas 193         
3059 19 Dec 14 nicklas 194       }
5404 08 May 19 nicklas 195       else if ("/ActivityLog.rss".equals(cmd))
5404 08 May 19 nicklas 196       {
5404 08 May 19 nicklas 197         final String scheme = req.getScheme();
5404 08 May 19 nicklas 198         final String serverName = req.getServerName();
5404 08 May 19 nicklas 199         final int serverPort = req.getServerPort();
5404 08 May 19 nicklas 200         final String server = scheme + "://" + serverName + ":" + serverPort;
5404 08 May 19 nicklas 201         final String context = req.getContextPath();
5404 08 May 19 nicklas 202         json = null;
5404 08 May 19 nicklas 203
5404 08 May 19 nicklas 204         byte[] feed = ActivityLog.getInstance().getRssFeed(server, context);
5404 08 May 19 nicklas 205         resp.setContentType("application/rss+xml");
5404 08 May 19 nicklas 206         resp.setContentLength(feed.length);
5404 08 May 19 nicklas 207         resp.setCharacterEncoding("UTF-8");
5404 08 May 19 nicklas 208         resp.getOutputStream().write(feed);
5404 08 May 19 nicklas 209       }
3904 29 Apr 16 nicklas 210       else if ("GetProgress".equals(cmd))
3904 29 Apr 16 nicklas 211       {
3904 29 Apr 16 nicklas 212         /**
3904 29 Apr 16 nicklas 213           Get progress information for a named progress bar.
3904 29 Apr 16 nicklas 214           The 'name' parameter is the same name that was 
3904 29 Apr 16 nicklas 215           submitted to the 'Reggie.showLoadingAnimation()` 
3904 29 Apr 16 nicklas 216           JavaScript method. The working servlet MUST:
3904 29 Apr 16 nicklas 217           
3904 29 Apr 16 nicklas 218           1. Create a SimpleProgressReporter instance
3904 29 Apr 16 nicklas 219           2. Store the instance in SessionControl.setSessionSetting() 
3904 29 Apr 16 nicklas 220              with the same name we get here
3904 29 Apr 16 nicklas 221           3. Call ProgressReporter.display() at regular intervals
3904 29 Apr 16 nicklas 222         */
3904 29 Apr 16 nicklas 223         String name = req.getParameter("name");
3904 29 Apr 16 nicklas 224         
3975 26 May 16 nicklas 225         sc = Reggie.getSessionControl(req);
3904 29 Apr 16 nicklas 226         Object tmp = sc.getSessionSetting(name);
3904 29 Apr 16 nicklas 227         if (tmp instanceof SimpleProgressReporter)
3904 29 Apr 16 nicklas 228         {
3904 29 Apr 16 nicklas 229           SimpleProgressReporter progress = (SimpleProgressReporter)tmp;
3904 29 Apr 16 nicklas 230           JSONObject jsonProgress = new JSONObject();
3904 29 Apr 16 nicklas 231           jsonProgress.put("name", name);
3904 29 Apr 16 nicklas 232           jsonProgress.put("percent", progress.getPercent());
3904 29 Apr 16 nicklas 233           jsonProgress.put("message", progress.getMessage());
3904 29 Apr 16 nicklas 234           json.put("progress", jsonProgress);
3904 29 Apr 16 nicklas 235         }
3904 29 Apr 16 nicklas 236       }
5919 24 Apr 20 nicklas 237       else if ("AbortProcess".equals(cmd))
5919 24 Apr 20 nicklas 238       {
5919 24 Apr 20 nicklas 239         /**
5919 24 Apr 20 nicklas 240           Abort a process by setting the 'abort' flag
5919 24 Apr 20 nicklas 241           on an AbortableProgressReporter
5919 24 Apr 20 nicklas 242           The 'name' parameter is the same name that was 
5919 24 Apr 20 nicklas 243           submitted to the 'Reggie.showLoadingAnimation()` 
5919 24 Apr 20 nicklas 244           JavaScript method. The working servlet MUST:
5919 24 Apr 20 nicklas 245           
5919 24 Apr 20 nicklas 246           1. Create a AbortableProgressReporter instance
5919 24 Apr 20 nicklas 247           2. Store the instance in SessionControl.setSessionSetting() 
5919 24 Apr 20 nicklas 248              with the same name we get here
5919 24 Apr 20 nicklas 249           3. Call ProgressReporter.display() at regular intervals
5919 24 Apr 20 nicklas 250         */
5919 24 Apr 20 nicklas 251         String name = req.getParameter("name");
5919 24 Apr 20 nicklas 252         
5919 24 Apr 20 nicklas 253         sc = Reggie.getSessionControl(req);
5919 24 Apr 20 nicklas 254         Object tmp = sc.getSessionSetting(name);
5919 24 Apr 20 nicklas 255         if (tmp instanceof AbortableProgressReporter)
5919 24 Apr 20 nicklas 256         {
5919 24 Apr 20 nicklas 257           AbortableProgressReporter progress = (AbortableProgressReporter)tmp;
5919 24 Apr 20 nicklas 258           progress.setAbort();
5919 24 Apr 20 nicklas 259           JSONObject jsonProgress = new JSONObject();
5919 24 Apr 20 nicklas 260           jsonProgress.put("name", name);
5919 24 Apr 20 nicklas 261           jsonProgress.put("percent", progress.getPercent());
5919 24 Apr 20 nicklas 262           jsonProgress.put("message", progress.getMessage());
5919 24 Apr 20 nicklas 263           jsonProgress.put("aborted", true);
5919 24 Apr 20 nicklas 264           json.put("progress", jsonProgress);
5919 24 Apr 20 nicklas 265         }
5919 24 Apr 20 nicklas 266       }
5740 20 Nov 19 nicklas 267       else if ("ReggieTheSnakeWasSummoned".equals(cmd))
5740 20 Nov 19 nicklas 268       {
5740 20 Nov 19 nicklas 269         sc = Reggie.getSessionControl(req);
6337 16 Jun 21 nicklas 270         dc = sc.newDbControl(":The Snake");
5740 20 Nov 19 nicklas 271         ActivityDef.REGGIE_THE_SNAKE_WAS_SUMMONED.merge(dc, 1).setUser("Indiana Jones");
5740 20 Nov 19 nicklas 272         dc.commit();
5740 20 Nov 19 nicklas 273         // Makes Reggie the Snake go away after at least 200 seconds
5740 20 Nov 19 nicklas 274         Application.getScheduler().schedule(new ActivityLog.SaveActivityLog(), 200000, true);
5740 20 Nov 19 nicklas 275       }
6864 04 Nov 22 nicklas 276       else if ("DownloadFileAsZip".equals(cmd))
6864 04 Nov 22 nicklas 277       {
6864 04 Nov 22 nicklas 278         json = null; // No JSON output
6864 04 Nov 22 nicklas 279         
6864 04 Nov 22 nicklas 280         sc = Reggie.getSessionControl(req);
6864 04 Nov 22 nicklas 281         dc = sc.newDbControl(":Download file as ZIP");
6864 04 Nov 22 nicklas 282         int fileId = Values.getInt(req.getParameter("fileId"));
6864 04 Nov 22 nicklas 283         String password = Values.getStringOrNull(req.getParameter("password"));
6864 04 Nov 22 nicklas 284         boolean remember = Values.getBoolean(req.getParameter("remember"));
6864 04 Nov 22 nicklas 285         
6864 04 Nov 22 nicklas 286         File f = File.getById(dc, fileId);
6864 04 Nov 22 nicklas 287         resp.setHeader("Content-Disposition", "attachment; filename="+f.getName()+".zip");
6864 04 Nov 22 nicklas 288         resp.setContentType("application/zip");
6864 04 Nov 22 nicklas 289         OutputStream out = resp.getOutputStream();
6864 04 Nov 22 nicklas 290         ZipParameters zipParameters = new ZipParameters();
6864 04 Nov 22 nicklas 291         zipParameters.setSourceExternalStream(true);
6864 04 Nov 22 nicklas 292         zipParameters.setFileNameInZip(f.getName());
6864 04 Nov 22 nicklas 293         zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
6864 04 Nov 22 nicklas 294         zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
6864 04 Nov 22 nicklas 295         if (password != null)
6864 04 Nov 22 nicklas 296         {
6864 04 Nov 22 nicklas 297           zipParameters.setEncryptFiles(true);
6864 04 Nov 22 nicklas 298           zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
6864 04 Nov 22 nicklas 299           zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
6864 04 Nov 22 nicklas 300           zipParameters.setPassword(password);
6864 04 Nov 22 nicklas 301           
6864 04 Nov 22 nicklas 302           sc.setUserClientSetting("reggie.zip-password", remember ? password : null);
6864 04 Nov 22 nicklas 303           Annotationtype.ZIP_PASSWORD.setAnnotationValue(dc, f, remember ? password : null);
6864 04 Nov 22 nicklas 304         }
6864 04 Nov 22 nicklas 305         ZipOutputStream zip = new ZipOutputStream(out);
6864 04 Nov 22 nicklas 306         zip.putNextEntry(null, zipParameters);
6864 04 Nov 22 nicklas 307         FileUtil.copy(f.getDownloadStream(0), zip);
6864 04 Nov 22 nicklas 308         zip.flush();
6864 04 Nov 22 nicklas 309         zip.closeEntry();
6864 04 Nov 22 nicklas 310         zip.finish();
6864 04 Nov 22 nicklas 311         dc.commit();
6864 04 Nov 22 nicklas 312         
6864 04 Nov 22 nicklas 313         out.flush();
6864 04 Nov 22 nicklas 314         out.close();
6864 04 Nov 22 nicklas 315       }
7115 17 Apr 23 nicklas 316       else if ("ViewTabular".equals(cmd))
7115 17 Apr 23 nicklas 317       {
7115 17 Apr 23 nicklas 318         json = null; // No JSON output
7115 17 Apr 23 nicklas 319         
7115 17 Apr 23 nicklas 320         sc = Reggie.getSessionControl(req);
7115 17 Apr 23 nicklas 321         dc = sc.newDbControl(":View tabular file");
7115 17 Apr 23 nicklas 322         int fileId = Values.getInt(req.getParameter("fileId"));
7115 17 Apr 23 nicklas 323         
7115 17 Apr 23 nicklas 324         File f = File.getById(dc, fileId);
7115 17 Apr 23 nicklas 325         Reader reader = new InputStreamReader(f.getDownloadStream(0), 
7115 17 Apr 23 nicklas 326           Values.getString(f.getCharacterSet(), "UTF-8"));
7115 17 Apr 23 nicklas 327         
7117 18 Apr 23 nicklas 328         Pattern columnSeparator = null;
7117 18 Apr 23 nicklas 329         // For VCF files we force tab since auto-detction will most likely find semicolon in the INFO field
7117 18 Apr 23 nicklas 330         if (f.getName().endsWith(".vcf")) columnSeparator = Pattern.compile("\\t");
7115 17 Apr 23 nicklas 331         resp.setContentType("text/html");
7115 17 Apr 23 nicklas 332         resp.setCharacterEncoding("UTF-8");
7115 17 Apr 23 nicklas 333         PrintWriter out = resp.getWriter();
7117 18 Apr 23 nicklas 334         TabularViewActionFactory.tabularFormat(reader, out, HTML.encodeTags(f.getName()), columnSeparator);
7115 17 Apr 23 nicklas 335         dc.commit();
7115 17 Apr 23 nicklas 336         out.flush();
7115 17 Apr 23 nicklas 337         out.close();
7115 17 Apr 23 nicklas 338         reader.close();
7115 17 Apr 23 nicklas 339       }
1897 06 Mar 13 nicklas 340       
1897 06 Mar 13 nicklas 341     }
1897 06 Mar 13 nicklas 342     catch (Throwable t)
1897 06 Mar 13 nicklas 343     {
1897 06 Mar 13 nicklas 344       t.printStackTrace();
5404 08 May 19 nicklas 345       if (json != null)
5404 08 May 19 nicklas 346       {
5404 08 May 19 nicklas 347         json.clear();
5404 08 May 19 nicklas 348         json.put("status", "error");
5404 08 May 19 nicklas 349         json.put("message", t.getMessage());
5404 08 May 19 nicklas 350         json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
5404 08 May 19 nicklas 351       }
5404 08 May 19 nicklas 352       else
5404 08 May 19 nicklas 353       {
5404 08 May 19 nicklas 354         resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, t.getMessage());
5404 08 May 19 nicklas 355       }
1897 06 Mar 13 nicklas 356     }
1897 06 Mar 13 nicklas 357     finally
1897 06 Mar 13 nicklas 358     {
1897 06 Mar 13 nicklas 359       if (dc != null) dc.close();
5404 08 May 19 nicklas 360       if (json != null)
5404 08 May 19 nicklas 361       {
5404 08 May 19 nicklas 362         json.writeJSONString(resp.getWriter());
5404 08 May 19 nicklas 363       }
1897 06 Mar 13 nicklas 364     }
1897 06 Mar 13 nicklas 365     
1897 06 Mar 13 nicklas 366   }
1897 06 Mar 13 nicklas 367
5375 18 Apr 19 nicklas 368   @Override
5375 18 Apr 19 nicklas 369   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
5375 18 Apr 19 nicklas 370     throws ServletException, IOException 
5375 18 Apr 19 nicklas 371   {
5375 18 Apr 19 nicklas 372     String cmd = req.getParameter("cmd");
5375 18 Apr 19 nicklas 373     JsonUtil.setJsonResponseHeaders(resp);
5375 18 Apr 19 nicklas 374     
5375 18 Apr 19 nicklas 375     JSONObject json = new JSONObject();
5375 18 Apr 19 nicklas 376     json.put("status", "ok");
5375 18 Apr 19 nicklas 377     JSONArray jsonMessages = new JSONArray();
1897 06 Mar 13 nicklas 378   
5375 18 Apr 19 nicklas 379     final SessionControl sc = Reggie.getSessionControl(req);
5375 18 Apr 19 nicklas 380     DbControl dc = null;
5375 18 Apr 19 nicklas 381     try
5375 18 Apr 19 nicklas 382     {
5375 18 Apr 19 nicklas 383
5375 18 Apr 19 nicklas 384       if ("SetLastWizardGroup".equals(cmd))
5375 18 Apr 19 nicklas 385       {
5375 18 Apr 19 nicklas 386         String wizardGroup = req.getParameter("group");
5375 18 Apr 19 nicklas 387         sc.setUserClientSetting("reggie.lastWizardGroup", wizardGroup);
5375 18 Apr 19 nicklas 388         jsonMessages.add("Last wizard is now: "+wizardGroup);
5375 18 Apr 19 nicklas 389       }
5375 18 Apr 19 nicklas 390
5375 18 Apr 19 nicklas 391       json.put("messages", jsonMessages);
5375 18 Apr 19 nicklas 392     }
5375 18 Apr 19 nicklas 393     catch (Throwable t)
5375 18 Apr 19 nicklas 394     {
5375 18 Apr 19 nicklas 395       t.printStackTrace();
5375 18 Apr 19 nicklas 396       json.clear();
5375 18 Apr 19 nicklas 397       json.put("status", "error");
5375 18 Apr 19 nicklas 398       json.put("message", t.getMessage());
5375 18 Apr 19 nicklas 399       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
5375 18 Apr 19 nicklas 400     }
5375 18 Apr 19 nicklas 401     finally
5375 18 Apr 19 nicklas 402     {
5375 18 Apr 19 nicklas 403       if (dc != null) dc.close();
5375 18 Apr 19 nicklas 404       json.writeJSONString(resp.getWriter());
5375 18 Apr 19 nicklas 405     }
5375 18 Apr 19 nicklas 406   }
5375 18 Apr 19 nicklas 407   
1897 06 Mar 13 nicklas 408 }