View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
19   */
20  package org.waarp.openr66.protocol.http.adminssl;
21  
22  import com.fasterxml.jackson.databind.node.ArrayNode;
23  import com.fasterxml.jackson.databind.node.ObjectNode;
24  import io.netty.buffer.ByteBuf;
25  import io.netty.channel.ChannelHandlerContext;
26  import io.netty.handler.codec.http.FullHttpRequest;
27  import io.netty.handler.codec.http.HttpMethod;
28  import io.netty.handler.codec.http.HttpResponseStatus;
29  import io.netty.handler.codec.http.QueryStringDecoder;
30  import io.netty.handler.codec.http.cookie.DefaultCookie;
31  import org.joda.time.DateTime;
32  import org.joda.time.format.DateTimeFormat;
33  import org.joda.time.format.DateTimeFormatter;
34  import org.waarp.common.command.exception.Reply421Exception;
35  import org.waarp.common.command.exception.Reply530Exception;
36  import org.waarp.common.database.DbPreparedStatement;
37  import org.waarp.common.database.data.AbstractDbData.UpdatedInfo;
38  import org.waarp.common.database.exception.WaarpDatabaseException;
39  import org.waarp.common.database.exception.WaarpDatabaseNoConnectionException;
40  import org.waarp.common.database.exception.WaarpDatabaseSqlException;
41  import org.waarp.common.digest.FilesystemBasedDigest;
42  import org.waarp.common.exception.InvalidArgumentException;
43  import org.waarp.common.file.DirInterface;
44  import org.waarp.common.json.JsonHandler;
45  import org.waarp.common.logging.WaarpLogLevel;
46  import org.waarp.common.logging.WaarpLogger;
47  import org.waarp.common.logging.WaarpLoggerFactory;
48  import org.waarp.common.role.RoleDefault.ROLE;
49  import org.waarp.common.utility.ParametersChecker;
50  import org.waarp.common.utility.Version;
51  import org.waarp.common.utility.WaarpShutdownHook;
52  import org.waarp.common.utility.WaarpStringUtils;
53  import org.waarp.gateway.kernel.http.HttpWriteCacheEnable;
54  import org.waarp.openr66.client.Message;
55  import org.waarp.openr66.client.SubmitTransfer;
56  import org.waarp.openr66.client.utils.OutputFormat;
57  import org.waarp.openr66.context.ErrorCode;
58  import org.waarp.openr66.context.R66FiniteDualStates;
59  import org.waarp.openr66.context.R66Result;
60  import org.waarp.openr66.context.task.SpooledInformTask;
61  import org.waarp.openr66.database.DbConstantR66;
62  import org.waarp.openr66.database.data.DbHostAuth;
63  import org.waarp.openr66.database.data.DbHostConfiguration;
64  import org.waarp.openr66.database.data.DbRule;
65  import org.waarp.openr66.database.data.DbTaskRunner;
66  import org.waarp.openr66.database.data.DbTaskRunner.Columns;
67  import org.waarp.openr66.protocol.configuration.Configuration;
68  import org.waarp.openr66.protocol.configuration.Messages;
69  import org.waarp.openr66.protocol.exception.OpenR66ProtocolBusinessException;
70  import org.waarp.openr66.protocol.localhandler.LocalChannelReference;
71  import org.waarp.openr66.protocol.localhandler.LocalServerHandler;
72  import org.waarp.openr66.protocol.localhandler.LocalTransaction;
73  import org.waarp.openr66.protocol.localhandler.ServerActions;
74  import org.waarp.openr66.protocol.localhandler.packet.ErrorPacket;
75  import org.waarp.openr66.protocol.localhandler.packet.RequestPacket;
76  import org.waarp.openr66.protocol.localhandler.packet.RequestPacket.TRANSFERMODE;
77  import org.waarp.openr66.protocol.localhandler.packet.TestPacket;
78  import org.waarp.openr66.protocol.networkhandler.NetworkTransaction;
79  import org.waarp.openr66.protocol.utils.NbAndSpecialId;
80  import org.waarp.openr66.protocol.utils.R66Future;
81  import org.waarp.openr66.protocol.utils.TransferUtils;
82  
83  import java.sql.Timestamp;
84  import java.util.ArrayList;
85  import java.util.Arrays;
86  import java.util.HashMap;
87  import java.util.List;
88  import java.util.Locale;
89  import java.util.Map;
90  import java.util.Map.Entry;
91  import java.util.Set;
92  
93  import static org.waarp.openr66.client.TransferArgs.*;
94  
95  /**
96   *
97   */
98  public class HttpResponsiveSslHandler extends HttpSslHandler {
99    private static final String B_CENTER_P2 = "</b></center></p>";
100 
101   private static final String FILTER2 = "Filter";
102 
103   private static final String ACTION2 = "ACTION";
104 
105   private static final String OPEN_R66_WEB_ERROR2 = "OpenR66 Web Error {}";
106 
107   /**
108    * Internal Logger
109    */
110   private static final WaarpLogger logger =
111       WaarpLoggerFactory.getLogger(HttpResponsiveSslHandler.class);
112 
113   public static final String LISTING_PAGE = "Listing.html";
114 
115   private enum REQUEST {
116     Logon("Logon.html"), Logout("Logon.html"), index("index.html"),
117     error("Error.html"), unallowed("NotAllowed.html"), Listing(LISTING_PAGE),
118     ListingReload(LISTING_PAGE), CancelRestart("CancelRestart.html"),
119     Export("Export.html"), Hosts("Hosts.html"), Rules("Rules.html"),
120     System("System.html"), SystemLimited("SystemLimited.html"),
121     Spooled("Spooled.html"), SpooledDetailed("Spooled.html"),
122     CreateTransfer("CreateTransfer.html");
123 
124     private final String header;
125 
126     /**
127      * Constructor for a unique file
128      *
129      * @param uniquefile
130      */
131     REQUEST(final String uniquefile) {
132       header = uniquefile;
133     }
134 
135     /**
136      * @param header
137      * @param headerBody
138      * @param body
139      * @param endBody
140      * @param end
141      */
142     REQUEST(final String header, final String headerBody, final String body,
143             final String endBody, final String end) {
144       this.header = header;
145     }
146 
147     /**
148      * Reader for a unique file
149      *
150      * @return the content of the unique file
151      */
152     public String read(final HttpResponsiveSslHandler handler) {
153       return handler.readFile(
154           Configuration.configuration.getHttpBasePath() + header);
155     }
156   }
157 
158 
159   public static final String LIMITROW1 = "LIMITROW";
160   public static final String REFRESH = "REFRESH";
161   private static final String XXXRESULTXXX = "XXXRESULTXXX";
162   private static final String XXXDATAJSONXXX = "XXXDATAJSONXXX";
163   private static final String XXXHOSTSIDSXXX = "XXXHOSTSIDSXXX";
164   private static final String XXXRULEIDSXXX = "XXXRULEIDSXXX";
165   private static final String XXXBLOCKSIZEXXX = "XXXBLOCKSIZEXXX";
166 
167   private String indexResponsive() {
168     final String index = REQUEST.index.read(this);
169     final StringBuilder builder = new StringBuilder(index);
170     WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXHOSTIDXXX.toString(),
171                                 Configuration.configuration.getHostId());
172     WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXADMINXXX.toString(),
173                                 Messages.getString(
174                                     "HttpSslHandler.2")); //$NON-NLS-1$
175     WaarpStringUtils.replace(builder, REPLACEMENT.XXXVERSIONXXX.toString(),
176                              Version.fullIdentifier());
177     return builder.toString();
178   }
179 
180   @Override
181   protected final String error(final String mesg) {
182     final String index = REQUEST.error.read(this);
183     return index.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(), mesg);
184   }
185 
186   private String unallowedResponsive(final String mesg) {
187     final String index = REQUEST.unallowed.read(this);
188     if (ParametersChecker.isEmpty(index)) {
189       return error(mesg);
190     }
191     return index.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(), mesg);
192   }
193 
194   @Override
195   protected final String logon() {
196     return REQUEST.Logon.read(this);
197   }
198 
199   private String setDbTaskRunnerJsonData(final String head, String errorText,
200                                          final String startid,
201                                          final String stopid,
202                                          final Timestamp tstart,
203                                          final Timestamp tstop,
204                                          final String rule, final String req,
205                                          final boolean pending,
206                                          final boolean transfer,
207                                          final boolean error,
208                                          final boolean done,
209                                          final boolean all) {
210     final String seeAll = checkAuthorizedToSeeAll();
211     DbPreparedStatement preparedStatement = null;
212     try {
213       preparedStatement =
214           DbTaskRunner.getFilterPrepareStatement(dbSession, getLimitRow(),
215                                                  false, startid, stopid, tstart,
216                                                  tstop, rule, req, pending,
217                                                  transfer, error, done, all,
218                                                  seeAll);
219       final String json =
220           DbTaskRunner.getJson(preparedStatement, getLimitRow());
221       return head.replace(XXXDATAJSONXXX, json);
222     } catch (final WaarpDatabaseException e) {
223       if (preparedStatement != null) {
224         preparedStatement.realClose();
225       }
226       logger.warn(OPEN_R66_WEB_ERROR2, e.getMessage());
227       errorText +=
228           Messages.getString("ErrorCode.17") + ": " + e.getMessage() + "<BR/>";
229     }
230     return head.replace(XXXRESULTXXX, errorText);
231   }
232 
233   private String listingReload() {
234     final String errorText = "";
235     if (params == null) {
236       return getHeadNoParam(REQUEST.Listing, errorText);
237     }
238     final List<String> parms = params.get(ACTION2);
239     String head = REQUEST.Listing.read(this);
240     if (parms != null) {
241       final String parm = parms.get(0);
242       final boolean isNotReload = !"Reload".equalsIgnoreCase(parm);
243       if (FILTER2.equalsIgnoreCase(parm) || !isNotReload) {
244         head = getFilter(errorText, head, isNotReload);
245       }
246     }
247     head =
248         resetOptionTransfer(head, "", "", "", "", "", "", false, false, false,
249                             false, true);
250     head = setDbTaskRunnerJsonData(head, errorText, "", "", null, null, "", "",
251                                    false, false, false, false, true);
252     return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
253   }
254 
255   private String getFilter(final String errorText, String head,
256                            final boolean isNotReload) {
257     String startid = getTrimValue("startid");
258     String stopid = getTrimValue("stopid");
259     if (isNotReload && startid != null && stopid == null) {
260       stopid = Long.MAX_VALUE + "";
261     }
262     if (isNotReload && stopid != null && startid == null) {
263       startid = (DbConstantR66.ILLEGALVALUE + 1) + "";
264     }
265     String start = getValue("start");
266     String stop = getValue("stop");
267     final String rule = getTrimValue("rule");
268     final String req = getTrimValue("req");
269     final boolean pending;
270     final boolean transfer;
271     final boolean error;
272     final boolean done;
273     boolean all;
274     pending = params.containsKey("pending");
275     transfer = params.containsKey("transfer");
276     error = params.containsKey("error");
277     done = params.containsKey("done");
278     all = params.containsKey("all");
279     if (pending && transfer && error && done) {
280       all = true;
281     } else if (!(pending || transfer || error || done)) {
282       all = true;
283     }
284     final Timestamp tstart = WaarpStringUtils.fixDate(start);
285     if (tstart != null) {
286       start = tstart.toString();
287     }
288     final Timestamp tstop = WaarpStringUtils.fixDate(stop, tstart);
289     if (tstop != null) {
290       stop = tstop.toString();
291     }
292     head =
293         setDbTaskRunnerJsonData(head, errorText, startid, stopid, tstart, tstop,
294                                 rule, req, pending, transfer, error, done, all);
295     head = resetOptionTransfer(head, startid == null? "" : startid,
296                                stopid == null? "" : stopid, start, stop,
297                                rule == null? "" : rule, req == null? "" : req,
298                                pending, transfer, error, done, all);
299     return head;
300   }
301 
302   private String listing() {
303     getParamsResponsive();
304     return listingReload();
305   }
306 
307   private String cancelRestart() {
308     getParamsResponsive();
309     if (params == null) {
310       return getHeadNoParam(REQUEST.CancelRestart, "");
311     }
312     String head = REQUEST.CancelRestart.read(this);
313     String errorText = "";
314     final List<String> parms = params.get(ACTION2);
315     final String seeAll = checkAuthorizedToSeeAll();
316     if (parms != null) {
317       final String parm = parms.get(0);
318       final boolean isNotReload = !"Reload".equalsIgnoreCase(parm);
319       if ("Search".equalsIgnoreCase(parm)) {
320         head = getHeadSearchCancelRestart(head, errorText);
321       } else if (FILTER2.equalsIgnoreCase(parm) || !isNotReload) {
322         head = getFilter(errorText, head, isNotReload);
323       } else if ("RestartAll".equalsIgnoreCase(parm) ||
324                  "StopAll".equalsIgnoreCase(parm) ||
325                  "StopCleanAll".equalsIgnoreCase(parm)) {
326         final RestartOrStopAll restartOrStopAll =
327             new RestartOrStopAll(head, errorText, seeAll, parm).invoke();
328         head = restartOrStopAll.getHead();
329         errorText = restartOrStopAll.getErrorText();
330       } else if ("Cancel".equalsIgnoreCase(parm) ||
331                  "CancelClean".equalsIgnoreCase(parm) ||
332                  "Stop".equalsIgnoreCase(parm)) {
333         // Cancel or Stop
334         final boolean stop = "Stop".equalsIgnoreCase(parm);
335         final String specid = getValue("specid");
336         final String reqd = getValue("reqd");
337         final String reqr = getValue("reqr");
338         final LocalChannelReference lcr =
339             Configuration.configuration.getLocalTransaction().getFromRequest(
340                 reqd + ' ' + reqr + ' ' + specid);
341         // stop the current transfer
342         ErrorCode result;
343         final long lspecid;
344         try {
345           lspecid = Long.parseLong(specid);
346         } catch (final NumberFormatException e) {
347           errorText += "<br><b>" + parm +
348                        Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
349           return head.replace(XXXRESULTXXX, errorText)
350                      .replace(XXXDATAJSONXXX, "[]");
351         }
352         DbTaskRunner taskRunner = null;
353         try {
354           taskRunner = new DbTaskRunner(authentHttp, null, lspecid, reqr, reqd);
355         } catch (final WaarpDatabaseException ignored) {
356           // nothing
357         }
358         if (taskRunner == null) {
359           errorText += "<br><b>" + parm +
360                        Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
361           return head.replace(XXXRESULTXXX, errorText)
362                      .replace(XXXDATAJSONXXX, "[]");
363         }
364         final ErrorCode code =
365             stop? ErrorCode.StoppedTransfer : ErrorCode.CanceledTransfer;
366         if (lcr != null) {
367           final int rank = taskRunner.getRank();
368           lcr.sessionNewState(R66FiniteDualStates.ERROR);
369           final ErrorPacket error =
370               new ErrorPacket("Transfer " + parm + ' ' + rank, code.getCode(),
371                               ErrorPacket.FORWARDCLOSECODE);
372           try {
373             // inform local instead of remote
374             LocalServerHandler.channelRead0(lcr, error);
375           } catch (final Exception ignored) {
376             // nothing
377           }
378           result = ErrorCode.CompleteOk;
379         } else {
380           // Transfer is not running
381           // But is the database saying the contrary
382           result = ErrorCode.TransferOk;
383           if (taskRunner != null && taskRunner.stopOrCancelRunner(code)) {
384             result = ErrorCode.CompleteOk;
385           }
386         }
387         if (taskRunner != null) {
388           if ("CancelClean".equalsIgnoreCase(parm)) {
389             TransferUtils.cleanOneTransfer(taskRunner, null, authentHttp, null);
390           }
391           final String tstart = taskRunner.getStart().toString();
392           final String tstop = taskRunner.getStop().toString();
393           head = resetOptionTransfer(head, String.valueOf(
394                                          taskRunner.getSpecialId() - 1), String.valueOf(
395                                          taskRunner.getSpecialId() + 1), tstart, tstop,
396                                      taskRunner.getRuleId(),
397                                      taskRunner.getRequested(), false, false,
398                                      false, false, true);
399         }
400         final String json = taskRunner.getJsonAsString();
401         head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
402         errorText += "<br><b>" + (result == ErrorCode.CompleteOk?
403             parm + Messages.getString("HttpSslHandler.5") :
404             //$NON-NLS-2$
405             parm + Messages.getString("HttpSslHandler.4")) +
406                      "</b>"; //$NON-NLS-1$
407       } else if ("Restart".equalsIgnoreCase(parm)) {
408         // Restart
409         final String specid = getValue("specid");
410         final String reqd = getValue("reqd");
411         final String reqr = getValue("reqr");
412         final long lspecid;
413         if (specid == null || reqd == null || reqr == null) {
414           errorText += "<br><b>" + parm +
415                        Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
416           return head.replace(XXXRESULTXXX, errorText)
417                      .replace(XXXDATAJSONXXX, "[]");
418         }
419         try {
420           lspecid = Long.parseLong(specid);
421         } catch (final NumberFormatException e) {
422           errorText += "<br><b>" + parm +
423                        Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
424           return head.replace(XXXRESULTXXX, errorText)
425                      .replace(XXXDATAJSONXXX, "[]");
426         }
427         final DbTaskRunner taskRunner;
428         String comment = "";
429         try {
430           taskRunner = new DbTaskRunner(authentHttp, null, lspecid, reqr, reqd);
431           final LocalChannelReference lcr =
432               Configuration.configuration.getLocalTransaction()
433                                          .getFromRequest(taskRunner.getKey());
434           final R66Result finalResult =
435               TransferUtils.restartTransfer(taskRunner, lcr);
436           comment = (String) finalResult.getOther();
437           final String tstart = taskRunner.getStart().toString();
438           final String tstop = taskRunner.getStop().toString();
439           head = resetOptionTransfer(head, String.valueOf(
440                                          taskRunner.getSpecialId() - 1), String.valueOf(
441                                          taskRunner.getSpecialId() + 1), tstart, tstop,
442                                      taskRunner.getRuleId(),
443                                      taskRunner.getRequested(), false, false,
444                                      false, false, true);
445           final String json = taskRunner.getJsonAsString();
446           head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
447         } catch (final WaarpDatabaseException e) {
448           errorText +=
449               Messages.getString("ErrorCode.17") + ": " + e.getMessage() +
450               "<BR/>";
451         }
452         errorText += "<br><b>" + comment + "</b>";
453       }
454     }
455     head =
456         resetOptionTransfer(head, "", "", "", "", "", "", false, false, false,
457                             false, true);
458     head = setDbTaskRunnerJsonData(head, errorText, "", "", null, null, "", "",
459                                    false, false, false, false, true);
460     return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
461   }
462 
463   private String getHeadSearchCancelRestart(String head, String errorText) {
464     final String followId = getTrimValue("followId");
465     if (followId != null) {
466       try {
467         final int limit = getLimitRow();
468         final DbTaskRunner[] dbTaskRunners =
469             DbTaskRunner.getSelectSameFollowId(followId, true, limit,
470                                                "*".equals(
471                                                    checkAuthorizedToSeeAll()));
472         final ArrayNode arrayNode = JsonHandler.createArrayNode();
473         final LocalTransaction localTransaction =
474             Configuration.configuration.getLocalTransaction();
475         int nb = 0;
476         for (final DbTaskRunner runner : dbTaskRunners) {
477           final ObjectNode node = runner.getJson();
478           node.put(Columns.SPECIALID.name(),
479                    Long.toString(runner.getSpecialId()));
480           if (localTransaction == null) {
481             node.put("Running", false);
482           } else {
483             node.put("Running", localTransaction.contained(runner.getKey()));
484           }
485           arrayNode.add(node);
486           nb++;
487           if (nb >= limit) {
488             break;
489           }
490         }
491         final String json = WaarpStringUtils.cleanJsonForHtml(
492             JsonHandler.writeAsString(arrayNode)
493                        .replaceAll("(\\\"\\{)([^}]+)(\\}\\\")", "\"{$2}\"")
494                        .replaceAll("([^\\\\])(\\\\\")([a-zA-Z_0-9]+)(\\\\\")",
495                                    "$1\\\\\"$3\\\\\""));
496         head = head.replace(XXXDATAJSONXXX, json);
497       } catch (final WaarpDatabaseNoConnectionException e) {
498         logger.warn(OPEN_R66_WEB_ERROR2, e.getMessage());
499         errorText +=
500             Messages.getString("ErrorCode.17") + ": " + e.getMessage() +
501             "<BR/>";
502         head = head.replace(XXXRESULTXXX, errorText);
503       }
504       head =
505           resetOptionTransfer(head, "", "", "", "", "", "", false, false, false,
506                               false, true);
507     } else {
508       final String startid = getTrimValue("startid");
509       final String stopid =
510           startid == null? null : Long.toString(Long.parseLong(startid) + 1);
511       head =
512           setDbTaskRunnerJsonData(head, errorText, startid, stopid, null, null,
513                                   null, null, false, false, false, false, true);
514       head =
515           resetOptionTransfer(head, startid == null? "" : startid, stopid, "",
516                               "", "", "", false, false, false, false, true);
517     }
518     return head;
519   }
520 
521   private String getHeadNoParam(final REQUEST request, final String s) {
522     String head = request.read(this);
523     head =
524         resetOptionTransfer(head, "", "", "", "", "", "", false, false, false,
525                             false, true);
526     head = setDbTaskRunnerJsonData(head, s, "", "", null, null, "", "", false,
527                                    false, false, false, true);
528     return head.replace(XXXRESULTXXX, "").replace(XXXDATAJSONXXX, "[]");
529   }
530 
531   private String export() {
532     getParamsResponsive();
533     String body = REQUEST.Export.read(this);
534     if (params == null) {
535       body =
536           resetOptionTransfer(body, "", "", "", "", "", "", false, false, false,
537                               true, false);
538       return body.replace(XXXRESULTXXX, "");
539     }
540     String start = getValue("start");
541     String stop = getValue("stop");
542     final String rule = getTrimValue("rule");
543     final String req = getTrimValue("req");
544     final boolean pending;
545     boolean transfer;
546     final boolean error;
547     final boolean done;
548     boolean all;
549     pending = params.containsKey("pending");
550     transfer = params.containsKey("transfer");
551     error = params.containsKey("error");
552     done = params.containsKey("done");
553     all = params.containsKey("all");
554     boolean toPurge = params.containsKey("purge");
555     if (toPurge) {
556       transfer = false;
557     }
558     if (pending && transfer && error && done) {
559       all = true;
560     } else if (!(pending || transfer || error || done)) {
561       all = true;
562     }
563     final Timestamp tstart = WaarpStringUtils.fixDate(start);
564     if (tstart != null) {
565       start = tstart.toString();
566     }
567     final Timestamp tstop = WaarpStringUtils.fixDate(stop, tstart);
568     if (tstop != null) {
569       stop = tstop.toString();
570     }
571     body =
572         resetOptionTransfer(body, "", "", start, stop, rule == null? "" : rule,
573                             req == null? "" : req, pending, transfer, error,
574                             done, all);
575     boolean isexported = true;
576     // clean a bit the database before exporting
577     try {
578       DbTaskRunner.changeFinishedToDone();
579     } catch (final WaarpDatabaseNoConnectionException e2) {
580       // should not be
581     }
582     // create export of log and optionally purge them from database
583     DbPreparedStatement getValid = null;
584     NbAndSpecialId nbAndSpecialId = null;
585     final String basename =
586         Configuration.configuration.getArchivePath() + DirInterface.SEPARATOR +
587         Configuration.configuration.getHostId() + '_' +
588         System.currentTimeMillis() + "_runners.xml";
589     final String filename =
590         Configuration.configuration.getBaseDirectory() + basename;
591     String errorMsg = "";
592     final String seeAll = checkAuthorizedToSeeAll();
593     try {
594       getValid = DbTaskRunner.getFilterPrepareStatement(dbSession, 0,
595                                                         // 0 means no limit
596                                                         true, null, null,
597                                                         tstart, tstop, rule,
598                                                         req, pending, transfer,
599                                                         error, done, all,
600                                                         seeAll);
601       nbAndSpecialId = DbTaskRunner.writeXMLWriter(getValid, filename);
602     } catch (final WaarpDatabaseNoConnectionException e1) {
603       isexported = false;
604       toPurge = false;
605       logger.warn("Export error: {}", e1.getMessage());
606       errorMsg = e1.getMessage();
607     } catch (final WaarpDatabaseSqlException e1) {
608       isexported = false;
609       toPurge = false;
610       logger.warn("Export error: {}", e1.getMessage());
611       errorMsg = e1.getMessage();
612     } catch (final OpenR66ProtocolBusinessException e) {
613       isexported = false;
614       toPurge = false;
615       logger.warn("Export error: {}", e.getMessage());
616       errorMsg = e.getMessage();
617     } finally {
618       if (getValid != null) {
619         getValid.realClose();
620       }
621     }
622     int purge = 0;
623     if (isexported && nbAndSpecialId != null) {
624       if (nbAndSpecialId.nb <= 0) {
625         return body.replace(XXXRESULTXXX, Messages.getString(
626             "HttpSslHandler.7")); //$NON-NLS-1$
627       }
628       // in case of purge
629       if (isexported && toPurge) {
630         // purge with same filter all runners where globallasttep
631         // is ALLDONE or ERROR
632         // but getting the higher Special first
633         final String stopId = Long.toString(nbAndSpecialId.higherSpecialId);
634         try {
635           purge = DbTaskRunner.purgeLogPrepareStatement(dbSession, null, stopId,
636                                                         tstart, tstop, rule,
637                                                         req, pending, transfer,
638                                                         error, done, all);
639         } catch (final WaarpDatabaseNoConnectionException ignored) {
640           // nothing
641         } catch (final WaarpDatabaseSqlException e) {
642           logger.warn("Purge error: {}", e.getMessage());
643         }
644       }
645     }
646     return body.replace(XXXRESULTXXX, "Export " + (isexported?
647         "<B>" + Messages.getString("HttpSslHandler.8") + //$NON-NLS-2$
648         "<A href='" + basename + "' target='_blank'>" + basename + "</A>" +
649         Messages.getString("HttpSslHandler.9") //$NON-NLS-4$
650         + (nbAndSpecialId != null? nbAndSpecialId.nb : 0) +
651         Messages.getString("HttpSslHandler.10") + purge
652         //$NON-NLS-1$
653         + Messages.getString("HttpSslHandler.11") + "</B>" :
654         //$NON-NLS-1$
655         "<B>" + Messages.getString("HttpSslHandler.12"))) + "</B>" +
656            errorMsg; //$NON-NLS-1$
657   }
658 
659   private String setCreateTransferJsonData(final String head,
660                                            String errorText) {
661     String result = head;
662     try {
663       final DbHostAuth[] dbHostAuths = DbHostAuth.getAllHosts();
664       ArrayNode arrayNode = JsonHandler.createArrayNode();
665       for (final DbHostAuth dbHostAuth : dbHostAuths) {
666         arrayNode.add(dbHostAuth.getHostid());
667       }
668       result =
669           result.replace(XXXHOSTSIDSXXX, JsonHandler.writeAsString(arrayNode));
670       final DbRule[] dbRules = DbRule.getAllRules();
671       arrayNode = JsonHandler.createArrayNode();
672       for (final DbRule dbRule : dbRules) {
673         arrayNode.add(dbRule.getIdRule());
674       }
675       result =
676           result.replace(XXXRULEIDSXXX, JsonHandler.writeAsString(arrayNode));
677       result = result.replace(XXXBLOCKSIZEXXX,
678                               "" + Configuration.configuration.getBlockSize());
679       // select only not yet executed transfers
680       return setDbTaskRunnerJsonData(result, errorText, "", "", null, null, "",
681                                      "", true, false, false, false, false);
682     } catch (final WaarpDatabaseException e) {
683       logger.warn(OPEN_R66_WEB_ERROR2, e.getMessage());
684       errorText +=
685           Messages.getString("ErrorCode.17") + ": " + e.getMessage() + "<BR/>";
686       return head.replace(XXXRESULTXXX, errorText);
687     }
688   }
689 
690   private String createTransfer() {
691     getParamsResponsive();
692     String head = REQUEST.CreateTransfer.read(this);
693     String errorText = "";
694     if (params == null) {
695       head = setCreateTransferJsonData(head, errorText);
696       return head.replace(XXXRESULTXXX, errorText)
697                  .replace(XXXDATAJSONXXX, "[]");
698     }
699     final List<String> parms = params.get(ACTION2);
700     if (parms != null) {
701       final String parm = parms.get(0);
702       final String rule = getTrimValue("rule");
703       final String host = getTrimValue("host");
704       final String filename = getTrimValue("filename");
705       String transferinfo = getTrimValue("transferinfo");
706       final String startdate = getTrimValue("startdate");
707       final String blocksize = getTrimValue("blocksize");
708       final String followid = getTrimValue("followid");
709       if (transferinfo == null) {
710         transferinfo = "";
711       }
712       String actionError = "";
713       int iaction = 0;
714       if ("Create".equalsIgnoreCase(parm)) {
715         iaction = 1;
716         actionError = Messages.getString(
717             "HttpSslHandler.CannotCreateTransfer");//$NON-NLS-1$
718       } else if ("Update".equalsIgnoreCase(parm)) {
719         iaction = 2;
720         actionError = Messages.getString(
721             "HttpSslHandler.CannotUpdateTransfer");//$NON-NLS-1$
722       }
723       if (iaction > 0) {
724         int iblocksize = Configuration.configuration.getBlockSize();
725         if (blocksize != null) {
726           try {
727             iblocksize = Integer.parseInt(blocksize);
728             if (iblocksize > Configuration.configuration.getBlockSize()) {
729               iblocksize = Configuration.configuration.getBlockSize();
730             }
731           } catch (final NumberFormatException e1) {
732             errorText =
733                 actionError + e1.getMessage() + B_CENTER_P2; //$NON-NLS-1$
734             head = setCreateTransferJsonData(head, errorText);
735             return head.replace(XXXRESULTXXX, errorText)
736                        .replace(XXXDATAJSONXXX, "[]");
737           }
738         }
739         long lfollowId = Long.MIN_VALUE;
740         if (followid != null) {
741           try {
742             lfollowId = Long.parseLong(followid);
743           } catch (final NumberFormatException e1) {
744             errorText =
745                 actionError + e1.getMessage() + B_CENTER_P2; //$NON-NLS-1$
746             head = setCreateTransferJsonData(head, errorText);
747             return head.replace(XXXRESULTXXX, errorText)
748                        .replace(XXXDATAJSONXXX, "[]");
749           }
750         }
751         DateTime dateTime = null;
752         if (startdate != null) {
753           final DateTimeFormatter formatter =
754               DateTimeFormat.forPattern("yyyy/MM/dd HH:mm");
755           try {
756             dateTime = formatter.parseDateTime(startdate);
757           } catch (final Exception e) {
758             errorText =
759                 actionError + e.getMessage() + B_CENTER_P2; //$NON-NLS-1$
760             head = setCreateTransferJsonData(head, errorText);
761             return head.replace(XXXRESULTXXX, errorText)
762                        .replace(XXXDATAJSONXXX, "[]");
763           }
764         }
765         if (iaction == 1) {
766           if (logger.isDebugEnabled()) {
767             final Set<Entry<String, List<String>>> entries = params.entrySet();
768             for (final Entry<String, List<String>> entry : entries) {
769               String vals = "";
770               for (final String val : entry.getValue()) {
771                 vals += val + ";";
772               }
773               logger.debug("CREATE {} = {}", entry.getKey(), vals);
774             }
775           }
776           // Create Runner
777           if (ParametersChecker.isEmpty(host, rule, filename)) {
778             errorText = actionError; //$NON-NLS-1$
779             head = setCreateTransferJsonData(head, errorText);
780             return head.replace(XXXRESULTXXX, errorText)
781                        .replace(XXXDATAJSONXXX, "[]");
782           }
783           try {
784             if (followid != null) {
785               final Map<String, Object> map = new HashMap<String, Object>();
786               map.put(FOLLOW_JSON_KEY, lfollowId);
787               transferinfo += " " + JsonHandler.writeAsStringEscaped(map);
788             }
789             final R66Future future = new R66Future(true);
790             final SubmitTransfer submitTransfer =
791                 new SubmitTransfer(future, host, filename, rule, transferinfo,
792                                    true, iblocksize, DbConstantR66.ILLEGALVALUE,
793                                    dateTime != null?
794                                        new Timestamp(dateTime.getMillis()) :
795                                        null);
796             submitTransfer.setNormalInfoAsWarn(false);
797             submitTransfer.run();
798             future.awaitOrInterruptible();
799             final OutputFormat outputFormat =
800                 new OutputFormat(SubmitTransfer.class.getSimpleName(), null);
801             final DbTaskRunner runner = future.getResult().getRunner();
802             if (future.isSuccess()) {
803               SubmitTransfer.prepareSubmitOkOutputFormat(runner, outputFormat);
804             } else {
805               SubmitTransfer.prepareSubmitKoOutputFormat(future, runner,
806                                                          outputFormat);
807             }
808             errorText = outputFormat.loggerOut();
809             head = setCreateTransferJsonData(head, errorText);
810             return head.replace(XXXRESULTXXX, errorText)
811                        .replace(XXXDATAJSONXXX, "[]");
812           } catch (final Exception e) {
813             logger.error("Create TaskRunner in error: {}", e.getMessage());
814             errorText = actionError + e.getMessage()
815                         //$NON-NLS-1$
816                         + B_CENTER_P2;
817             head = setCreateTransferJsonData(head, errorText);
818             return head.replace(XXXRESULTXXX, errorText)
819                        .replace(XXXDATAJSONXXX, "[]");
820           }
821         } else if (iaction == 2) {
822           if (logger.isDebugEnabled()) {
823             final Set<Entry<String, List<String>>> entries = params.entrySet();
824             for (final Entry<String, List<String>> entry : entries) {
825               String vals = "";
826               for (final String val : entry.getValue()) {
827                 vals += val + ";";
828               }
829               logger.debug("UPDATE {} = {}", entry.getKey(), vals);
830             }
831           }
832           final String owner = getTrimValue("OWNERREQ");
833           final String requester = getTrimValue("REQUESTER");
834           final String requested = getTrimValue("REQUESTED");
835           final String specialId = getTrimValue("SPECIALID");
836           if (ParametersChecker.isEmpty(rule, filename, owner, requested,
837                                         requester, specialId)) {
838             logger.debug("Some Fields are null: {} {} {} {} {} {}", rule,
839                          filename, owner, requested, requester, specialId);
840             errorText = actionError + " some arguments are empty"; //$NON-NLS-1$
841             head = setCreateTransferJsonData(head, errorText);
842             return head.replace(XXXRESULTXXX, errorText)
843                        .replace(XXXDATAJSONXXX, "[]");
844           }
845           // Try to update
846           try {
847             final long lspecialId = Long.parseLong(specialId);
848             logger.debug("Search for: {} {} {} {}", lspecialId, owner,
849                          requester, requested);
850             final DbTaskRunner runner =
851                 new DbTaskRunner(lspecialId, requester, requested, owner);
852             if (ParametersChecker.isNotEmpty(host) && !requested.equals(host)) {
853               errorText = actionError + " Requested Host cannot be changed"
854                           //$NON-NLS-1$
855                           + B_CENTER_P2;
856               head = setCreateTransferJsonData(head, errorText);
857               return head.replace(XXXRESULTXXX, errorText)
858                          .replace(XXXDATAJSONXXX, "[]");
859             }
860             if (ParametersChecker.isNotEmpty(rule) &&
861                 !runner.getRuleId().equals(rule)) {
862               runner.setRuleId(rule);
863             }
864             if (ParametersChecker.isNotEmpty(filename) &&
865                 !runner.getFilename().equals(filename)) {
866               runner.setFilename(filename);
867               runner.setOriginalFilename(filename);
868             }
869             if (dateTime != null &&
870                 !dateTime.isEqual(runner.getStart().getTime())) {
871               runner.setStart(new Timestamp(dateTime.getMillis()));
872             }
873             if (runner.getBlocksize() != iblocksize) {
874               runner.setBlocksize(iblocksize);
875             }
876             if (followid != null &&
877                 !followid.trim().equals(runner.getFollowId())) {
878               final Map<String, Object> map =
879                   DbTaskRunner.getMapFromString(transferinfo);
880               String outOfMap =
881                   DbTaskRunner.getOutOfMapFromString(transferinfo);
882               map.put(FOLLOW_JSON_KEY, lfollowId);
883               outOfMap += " " + JsonHandler.writeAsStringEscaped(map);
884               transferinfo = outOfMap;
885               runner.setFileInformation(transferinfo);
886               runner.setFollowId(lfollowId);
887             } else {
888               runner.setFileInformation(transferinfo);
889             }
890             runner.changeUpdatedInfo(UpdatedInfo.TOSUBMIT);
891             runner.update();
892             final OutputFormat outputFormat =
893                 new OutputFormat(SubmitTransfer.class.getSimpleName(), null);
894             SubmitTransfer.prepareSubmitOkOutputFormat(runner, outputFormat);
895             errorText = outputFormat.loggerOut();
896             head = setCreateTransferJsonData(head, errorText);
897             return head.replace(XXXRESULTXXX, errorText)
898                        .replace(XXXDATAJSONXXX, "[]");
899           } catch (final Exception e) {
900             errorText = actionError + e.getMessage()
901                         //$NON-NLS-1$
902                         + B_CENTER_P2;
903             logger.error("Update TaskRunner in error: {}", e.getMessage());
904             head = setCreateTransferJsonData(head, errorText);
905             return head.replace(XXXRESULTXXX, errorText)
906                        .replace(XXXDATAJSONXXX, "[]");
907           }
908         }
909       }
910     }
911     head = setCreateTransferJsonData(head, errorText);
912     return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
913   }
914 
915   private String setDbHostAuthJsonData(final String head, String errorText,
916                                        final String host, final String addr,
917                                        final boolean ssl,
918                                        final boolean isactive) {
919     DbPreparedStatement preparedStatement = null;
920     try {
921       preparedStatement =
922           DbHostAuth.getFilterPrepareStament(dbSession, host, addr, ssl,
923                                              isactive);
924       final String json = DbHostAuth.getJson(preparedStatement, getLimitRow());
925       return head.replace(XXXDATAJSONXXX, json);
926     } catch (final WaarpDatabaseException e) {
927       if (preparedStatement != null) {
928         preparedStatement.realClose();
929       }
930       logger.warn(OPEN_R66_WEB_ERROR2, e.getMessage());
931       errorText +=
932           Messages.getString("ErrorCode.17") + ": " + e.getMessage() + "<BR/>";
933     }
934     return head.replace(XXXRESULTXXX, errorText);
935   }
936 
937   private String hosts() {
938     getParamsResponsive();
939     String head = REQUEST.Hosts.read(this);
940     String errorText = "";
941     if (params == null) {
942       head = resetOptionHosts(head, "", "", false, true);
943       head = setDbHostAuthJsonData(head, errorText, null, null, false, true);
944       return head.replace(XXXRESULTXXX, errorText)
945                  .replace(XXXDATAJSONXXX, "[]");
946     }
947     final List<String> parms = params.get(ACTION2);
948     if (parms != null) {
949       final String parm = parms.get(0);
950       if ("Create".equalsIgnoreCase(parm)) {
951         final String host = getTrimValue("host");
952         String addr = getTrimValue("address");
953         String port = getTrimValue("port");
954         final String key = getTrimValue("hostkey");
955         final boolean ssl;
956         final boolean admin;
957         boolean isclient;
958         final boolean isactive;
959         final boolean isproxified;
960         ssl = params.containsKey("ssl");
961         admin = params.containsKey("admin");
962         isclient = params.containsKey("isclient");
963         isactive = params.containsKey("isactive");
964         isproxified = params.containsKey("isproxified");
965         if (port == null) {
966           port = "-1";
967         }
968         if ("-1".equals(port)) {
969           isclient = true;
970         }
971         if (isclient && addr == null) {
972           addr = "0.0.0.0";
973         }
974         if (host == null || addr == null || key == null) {
975           errorText = Messages.getString("HttpSslHandler.13"); //$NON-NLS-1$
976           head = resetOptionHosts(head, "", "", ssl, isactive);
977           head = setDbHostAuthJsonData(head, errorText, null, null, ssl, true);
978           return head.replace(XXXRESULTXXX, errorText)
979                      .replace(XXXDATAJSONXXX, "[]");
980         }
981         int iport = -1;
982         try {
983           iport = Integer.parseInt(port);
984         } catch (final NumberFormatException e1) {
985           errorText =
986               Messages.getString("HttpSslHandler.14") + e1.getMessage() +
987               B_CENTER_P2; //$NON-NLS-1$
988           head = resetOptionHosts(head, "", "", ssl, isactive);
989           head = setDbHostAuthJsonData(head, errorText, null, null, ssl, true);
990           return head.replace(XXXRESULTXXX, errorText)
991                      .replace(XXXDATAJSONXXX, "[]");
992         }
993         final DbHostAuth dbhost;
994         try {
995           dbhost = new DbHostAuth(host, addr, iport, ssl,
996                                   key.getBytes(WaarpStringUtils.UTF8), admin,
997                                   isclient);
998           dbhost.setActive(isactive);
999           dbhost.setProxified(isproxified);
1000           dbhost.insert();
1001         } catch (final WaarpDatabaseException e) {
1002           errorText = Messages.getString("HttpSslHandler.14") + e.getMessage()
1003                       //$NON-NLS-1$
1004                       + B_CENTER_P2;
1005           head = resetOptionHosts(head, "", "", ssl, isactive);
1006           head = setDbHostAuthJsonData(head, errorText, null, null, ssl, true);
1007           return head.replace(XXXRESULTXXX, errorText)
1008                      .replace(XXXDATAJSONXXX, "[]");
1009         }
1010         head = resetOptionHosts(head, host, addr, ssl, isactive);
1011         final String json = dbhost.getJsonAsString();
1012         head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
1013       } else if (FILTER2.equalsIgnoreCase(parm)) {
1014         final String host = getTrimValue("host");
1015         final String addr = getTrimValue("address");
1016         final boolean ssl = params.containsKey("ssl");
1017         final boolean isactive = params.containsKey("active");
1018         head = resetOptionHosts(head, host == null? "" : host,
1019                                 addr == null? "" : addr, ssl, isactive);
1020         head =
1021             setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
1022       } else if ("Update".equalsIgnoreCase(parm)) {
1023         final String host = getTrimValue("host");
1024         final String addr = getTrimValue("address");
1025         final String port = getTrimValue("port");
1026         final String key = getTrimValue("hostkey");
1027         final boolean ssl;
1028         final boolean admin;
1029         final boolean isclient;
1030         final boolean isactive;
1031         final boolean isproxified;
1032         ssl = params.containsKey("ssl");
1033         admin = params.containsKey("admin");
1034         isclient = params.containsKey("isclient");
1035         isactive = params.containsKey("isactive");
1036         isproxified = params.containsKey("isproxified");
1037         if (host == null || addr == null || port == null || key == null) {
1038           errorText = Messages.getString("HttpSslHandler.15"); //$NON-NLS-1$
1039           head = resetOptionHosts(head, "", "", ssl, isactive);
1040           head =
1041               setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
1042           return head.replace(XXXRESULTXXX, errorText)
1043                      .replace(XXXDATAJSONXXX, "[]");
1044         }
1045         final int iport;
1046         try {
1047           iport = Integer.parseInt(port);
1048         } catch (final NumberFormatException e1) {
1049           errorText =
1050               Messages.getString("HttpSslHandler.16") + e1.getMessage() +
1051               B_CENTER_P2; //$NON-NLS-1$
1052           head = resetOptionHosts(head, "", "", ssl, isactive);
1053           head =
1054               setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
1055           return head.replace(XXXRESULTXXX, errorText)
1056                      .replace(XXXDATAJSONXXX, "[]");
1057         }
1058         final DbHostAuth dbhost;
1059         try {
1060           dbhost = new DbHostAuth(host, addr, iport, ssl,
1061                                   key.getBytes(WaarpStringUtils.UTF8), admin,
1062                                   isclient);
1063           dbhost.setActive(isactive);
1064           dbhost.setProxified(isproxified);
1065           if (dbhost.exist()) {
1066             dbhost.update();
1067           } else {
1068             dbhost.insert();
1069           }
1070         } catch (final WaarpDatabaseException e) {
1071           errorText = Messages.getString("HttpSslHandler.16") + e.getMessage() +
1072                       B_CENTER_P2; //$NON-NLS-1$
1073           head = resetOptionHosts(head, "", "", ssl, isactive);
1074           head =
1075               setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
1076           return head.replace(XXXRESULTXXX, errorText)
1077                      .replace(XXXDATAJSONXXX, "[]");
1078         }
1079         head = resetOptionHosts(head, host, addr, ssl, isactive);
1080         final String json = dbhost.getJsonAsString();
1081         head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
1082       } else if ("TestConn".equalsIgnoreCase(parm)) {
1083         final String host = getTrimValue("host");
1084         if (ParametersChecker.isEmpty(host)) {
1085           errorText = Messages.getString("HttpSslHandler.17") + B_CENTER_P2;
1086           head = resetOptionHosts(head, "", "", false, true);
1087           head =
1088               setDbHostAuthJsonData(head, errorText, host, null, false, true);
1089           return head.replace(XXXRESULTXXX, errorText)
1090                      .replace(XXXDATAJSONXXX, "[]");
1091         }
1092         final DbHostAuth dbhost;
1093         try {
1094           dbhost = new DbHostAuth(host);
1095         } catch (final WaarpDatabaseException e) {
1096           errorText = Messages.getString("HttpSslHandler.17") + e.getMessage() +
1097                       B_CENTER_P2; //$NON-NLS-1$
1098           head = resetOptionHosts(head, "", "", false, true);
1099           head =
1100               setDbHostAuthJsonData(head, errorText, host, null, false, true);
1101           return head.replace(XXXRESULTXXX, errorText)
1102                      .replace(XXXDATAJSONXXX, "[]");
1103         }
1104         final R66Future result = new R66Future(true);
1105         final TestPacket packet = new TestPacket("MSG", "CheckConnection", 100);
1106         final Message transaction = new Message(
1107             Configuration.configuration.getInternalRunner()
1108                                        .getNetworkTransaction(), result, dbhost,
1109             packet);
1110         transaction.run();
1111         result.awaitOrInterruptible();
1112         head =
1113             resetOptionHosts(head, "", "", dbhost.isSsl(), dbhost.isActive());
1114         final String json = dbhost.getJsonAsString();
1115         head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
1116         if (result.isSuccess()) {
1117           errorText = Messages.getString("HttpSslHandler.18"); //$NON-NLS-1$
1118         } else {
1119           errorText = Messages.getString("HttpSslHandler.19")
1120                       //$NON-NLS-1$
1121                       + result.getResult().getCode().getMesg() + B_CENTER_P2;
1122         }
1123       } else if ("CloseConn".equalsIgnoreCase(parm)) {
1124         final String host = getTrimValue("host");
1125         if (ParametersChecker.isEmpty(host)) {
1126           errorText = Messages.getString("HttpSslHandler.17") + B_CENTER_P2;
1127           head = resetOptionHosts(head, "", "", false, true);
1128           head =
1129               setDbHostAuthJsonData(head, errorText, host, null, false, true);
1130           return head.replace(XXXRESULTXXX, errorText)
1131                      .replace(XXXDATAJSONXXX, "[]");
1132         }
1133         final DbHostAuth dbhost;
1134         try {
1135           dbhost = new DbHostAuth(host);
1136         } catch (final WaarpDatabaseException e) {
1137           errorText = Messages.getString("HttpSslHandler.17") + e.getMessage() +
1138                       B_CENTER_P2; //$NON-NLS-1$
1139           head = resetOptionHosts(head, "", "", false, true);
1140           head =
1141               setDbHostAuthJsonData(head, errorText, host, null, false, true);
1142           return head.replace(XXXRESULTXXX, errorText)
1143                      .replace(XXXDATAJSONXXX, "[]");
1144         }
1145         final boolean resultShutDown =
1146             NetworkTransaction.shuttingdownNetworkChannelsPerHostID(
1147                 dbhost.getHostid());
1148         head =
1149             resetOptionHosts(head, "", "", dbhost.isSsl(), dbhost.isActive());
1150         final String json = dbhost.getJsonAsString();
1151         head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
1152         if (resultShutDown) {
1153           errorText = Messages.getString("HttpSslHandler.21"); //$NON-NLS-1$
1154         } else {
1155           errorText = Messages.getString("HttpSslHandler.22"); //$NON-NLS-1$
1156         }
1157       } else if ("Delete".equalsIgnoreCase(parm)) {
1158         final String host = getTrimValue("host");
1159         if (ParametersChecker.isEmpty(host)) {
1160           errorText = Messages.getString("HttpSslHandler.23") + B_CENTER_P2;
1161           head = resetOptionHosts(head, "", "", false, true);
1162           head =
1163               setDbHostAuthJsonData(head, errorText, host, null, false, true);
1164           return head.replace(XXXRESULTXXX, errorText)
1165                      .replace(XXXDATAJSONXXX, "[]");
1166         }
1167         final DbHostAuth dbhost;
1168         try {
1169           dbhost = new DbHostAuth(host);
1170         } catch (final WaarpDatabaseException e) {
1171           errorText = Messages.getString("HttpSslHandler.24") + e.getMessage() +
1172                       B_CENTER_P2; //$NON-NLS-1$
1173           head = resetOptionHosts(head, "", "", false, true);
1174           head =
1175               setDbHostAuthJsonData(head, errorText, host, null, false, true);
1176           return head.replace(XXXRESULTXXX, errorText)
1177                      .replace(XXXDATAJSONXXX, "[]");
1178         }
1179         try {
1180           dbhost.delete();
1181         } catch (final WaarpDatabaseException e) {
1182           errorText = Messages.getString("HttpSslHandler.24") + e.getMessage() +
1183                       B_CENTER_P2; //$NON-NLS-1$
1184           head = resetOptionHosts(head, "", "", false, true);
1185           head =
1186               setDbHostAuthJsonData(head, errorText, host, null, dbhost.isSsl(),
1187                                     dbhost.isActive());
1188           return head.replace(XXXRESULTXXX, errorText)
1189                      .replace(XXXDATAJSONXXX, "[]");
1190         }
1191         final String json = dbhost.getJsonAsString();
1192         head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
1193         errorText = Messages.getString("HttpSslHandler.25") + host +
1194                     B_CENTER_P2; //$NON-NLS-1$
1195         head = resetOptionHosts(head, "", "", false, dbhost.isActive());
1196         return head.replace(XXXRESULTXXX, errorText)
1197                    .replace(XXXDATAJSONXXX, "[]");
1198       }
1199     }
1200     head = resetOptionHosts(head, "", "", false, true);
1201     head = setDbHostAuthJsonData(head, errorText, null, null, false, true);
1202     return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
1203   }
1204 
1205   private void createExport(final HashMap<String, String> rules,
1206                             final String rule, final int mode,
1207                             final int limit) {
1208     DbPreparedStatement preparedStatement = null;
1209     try {
1210       preparedStatement = DbRule.getFilterPrepareStament(dbSession, rule, mode);
1211       preparedStatement.executeQuery();
1212       int i = 0;
1213       while (preparedStatement.getNext()) {
1214         final DbRule dbrule = DbRule.getFromStatement(preparedStatement);
1215         rules.put(dbrule.getIdRule(), dbrule.getJsonAsString());
1216         i++;
1217         if (i > limit) {
1218           break;
1219         }
1220       }
1221       preparedStatement.realClose();
1222     } catch (final WaarpDatabaseException e) {
1223       if (preparedStatement != null) {
1224         preparedStatement.realClose();
1225       }
1226       logger.warn(OPEN_R66_WEB_ERROR2, e.getMessage());
1227     }
1228   }
1229 
1230   private String createExport(final String head, String errorText,
1231                               final String rule) {
1232     DbPreparedStatement preparedStatement = null;
1233     try {
1234       preparedStatement = DbRule.getFilterPrepareStament(dbSession, rule, -1);
1235       final String json = DbRule.getJson(preparedStatement, getLimitRow());
1236       preparedStatement.realClose();
1237       return head.replace(XXXDATAJSONXXX, json);
1238     } catch (final WaarpDatabaseException e) {
1239       if (preparedStatement != null) {
1240         preparedStatement.realClose();
1241       }
1242       logger.warn(OPEN_R66_WEB_ERROR2, e.getMessage());
1243       errorText +=
1244           Messages.getString("ErrorCode.17") + ": " + e.getMessage() + "<BR/>";
1245     }
1246     return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
1247   }
1248 
1249   private String rules() {
1250     getParamsResponsive();
1251     String head = REQUEST.Rules.read(this);
1252     final StringBuilder builderHead = new StringBuilder(head);
1253     fillHostIds(builderHead);
1254     head = builderHead.toString();
1255     String errorText = "";
1256     if (params == null) {
1257       head = resetOptionRules(head, "", null, -3);
1258       head = createExport(head, errorText, null);
1259       return head.replace(XXXRESULTXXX, errorText)
1260                  .replace(XXXDATAJSONXXX, "[]");
1261     }
1262     final List<String> parms = params.get(ACTION2);
1263     if (parms != null) {
1264       final String parm = parms.get(0);
1265       if ("Create".equalsIgnoreCase(parm) || "Update".equalsIgnoreCase(parm)) {
1266         final String rule = getTrimValue("rule");
1267         final String hostids = getTrimValue("hostids");
1268         final String recvp = getTrimValue("recvp");
1269         final String sendp = getTrimValue("sendp");
1270         final String archp = getTrimValue("archp");
1271         final String workp = getTrimValue("workp");
1272         final String rpre = getTrimValue("rpre");
1273         final String rpost = getTrimValue("rpost");
1274         final String rerr = getTrimValue("rerr");
1275         final String spre = getTrimValue("spre");
1276         final String spost = getTrimValue("spost");
1277         final String serr = getTrimValue("serr");
1278         final String mode = getTrimValue("mode");
1279         if (rule == null || mode == null) {
1280           errorText = Messages.getString("HttpSslHandler.26") + parm +
1281                       Messages.getString(
1282                           "HttpSslHandler.27"); //$NON-NLS-1$ //$NON-NLS-2$
1283           head = resetOptionRules(head, "", null, -3);
1284           head = createExport(head, errorText, null);
1285           return head.replace(XXXRESULTXXX, errorText)
1286                      .replace(XXXDATAJSONXXX, "[]");
1287         }
1288         int gmode = 0;
1289 
1290         TRANSFERMODE tmode = null;
1291         if ("send".equals(mode)) {
1292           tmode = RequestPacket.TRANSFERMODE.SENDMODE;
1293           gmode = -2;
1294         } else if ("recv".equals(mode)) {
1295           tmode = RequestPacket.TRANSFERMODE.RECVMODE;
1296           gmode = -1;
1297         } else if ("sendmd5".equals(mode)) {
1298           tmode = RequestPacket.TRANSFERMODE.SENDMD5MODE;
1299           gmode = -2;
1300         } else if ("recvmd5".equals(mode)) {
1301           tmode = RequestPacket.TRANSFERMODE.RECVMD5MODE;
1302           gmode = -1;
1303         } else if ("sendth".equals(mode)) {
1304           tmode = RequestPacket.TRANSFERMODE.SENDTHROUGHMODE;
1305           gmode = -2;
1306         } else if ("recvth".equals(mode)) {
1307           tmode = RequestPacket.TRANSFERMODE.RECVTHROUGHMODE;
1308           gmode = -1;
1309         } else if ("sendthmd5".equals(mode)) {
1310           tmode = RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE;
1311           gmode = -2;
1312         } else if ("recvthmd5".equals(mode)) {
1313           tmode = RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE;
1314           gmode = -1;
1315         }
1316         head = resetOptionRules(head, rule, tmode, gmode);
1317         if (logger.isDebugEnabled()) {
1318           logger.debug("Recv UpdOrInsert: " + rule + ':' + hostids + ':' +
1319                        (tmode != null? tmode.ordinal() : 0) + ':' + recvp +
1320                        ':' + sendp + ':' + archp + ':' + workp + ':' + rpre +
1321                        ':' + rpost + ':' + rerr + ':' + spre + ':' + spost +
1322                        ':' + serr);
1323         }
1324         final DbRule dbrule;
1325         try {
1326           dbrule =
1327               new DbRule(rule, hostids, (tmode != null? tmode.ordinal() : 0),
1328                          recvp, sendp, archp, workp, rpre, rpost, rerr, spre,
1329                          spost, serr);
1330           if ("Create".equalsIgnoreCase(parm)) {
1331             dbrule.insert();
1332           } else {
1333             if (dbrule.exist()) {
1334               dbrule.update();
1335             } else {
1336               dbrule.insert();
1337             }
1338           }
1339         } catch (final WaarpDatabaseException e) {
1340           errorText = Messages.getString("HttpSslHandler.28") + e.getMessage()
1341                       //$NON-NLS-1$
1342                       + B_CENTER_P2;
1343           head = resetOptionRules(head, "", null, -3);
1344           head = createExport(head, errorText, null);
1345           return head.replace(XXXRESULTXXX, errorText)
1346                      .replace(XXXDATAJSONXXX, "[]");
1347         }
1348         final String json = dbrule.getJsonAsString();
1349         head = head.replace(XXXDATAJSONXXX, '[' + json + ']');
1350       } else if (FILTER2.equalsIgnoreCase(parm)) {
1351         final String rule = getTrimValue("rule");
1352         final String mode = getTrimValue("mode");
1353         TRANSFERMODE tmode;
1354         int gmode = 0;
1355         if (mode != null) {
1356           if ("all".equals(mode)) {
1357             gmode = -3;
1358           } else if ("send".equals(mode)) {
1359             gmode = -2;
1360           } else if ("recv".equals(mode)) {
1361             gmode = -1;
1362           }
1363         }
1364         head = resetOptionRules(head, rule == null? "" : rule, null, gmode);
1365         final HashMap<String, String> rules = new HashMap<String, String>();
1366         boolean specific = false;
1367         if (params.containsKey("send")) {
1368           tmode = RequestPacket.TRANSFERMODE.SENDMODE;
1369           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1370           specific = true;
1371           createExport(rules, rule,
1372                        RequestPacket.TRANSFERMODE.SENDMODE.ordinal(),
1373                        getLimitRow() / 2);
1374         }
1375         if (params.containsKey("recv")) {
1376           tmode = RequestPacket.TRANSFERMODE.RECVMODE;
1377           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1378           specific = true;
1379           createExport(rules, rule,
1380                        RequestPacket.TRANSFERMODE.RECVMODE.ordinal(),
1381                        getLimitRow() / 2);
1382         }
1383         if (params.containsKey("sendmd5")) {
1384           tmode = RequestPacket.TRANSFERMODE.SENDMD5MODE;
1385           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1386           specific = true;
1387           createExport(rules, rule,
1388                        RequestPacket.TRANSFERMODE.SENDMD5MODE.ordinal(),
1389                        getLimitRow() / 2);
1390         }
1391         if (params.containsKey("recvmd5")) {
1392           tmode = RequestPacket.TRANSFERMODE.RECVMD5MODE;
1393           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1394           specific = true;
1395           createExport(rules, rule,
1396                        RequestPacket.TRANSFERMODE.RECVMD5MODE.ordinal(),
1397                        getLimitRow() / 2);
1398         }
1399         if (params.containsKey("sendth")) {
1400           tmode = RequestPacket.TRANSFERMODE.SENDTHROUGHMODE;
1401           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1402           specific = true;
1403           createExport(rules, rule,
1404                        RequestPacket.TRANSFERMODE.SENDTHROUGHMODE.ordinal(),
1405                        getLimitRow() / 2);
1406         }
1407         if (params.containsKey("recvth")) {
1408           tmode = RequestPacket.TRANSFERMODE.RECVTHROUGHMODE;
1409           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1410           specific = true;
1411           createExport(rules, rule,
1412                        RequestPacket.TRANSFERMODE.RECVTHROUGHMODE.ordinal(),
1413                        getLimitRow() / 2);
1414         }
1415         if (params.containsKey("sendthmd5")) {
1416           tmode = RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE;
1417           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1418           specific = true;
1419           createExport(rules, rule,
1420                        RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE.ordinal(),
1421                        getLimitRow() / 2);
1422         }
1423         if (params.containsKey("recvthmd5")) {
1424           tmode = RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE;
1425           head = resetOptionRules(head, rule == null? "" : rule, tmode, gmode);
1426           specific = true;
1427           createExport(rules, rule,
1428                        RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE.ordinal(),
1429                        getLimitRow() / 2);
1430         }
1431         if (!specific) {
1432           if (gmode == -1) {
1433             // recv
1434             createExport(rules, rule,
1435                          RequestPacket.TRANSFERMODE.RECVMODE.ordinal(),
1436                          getLimitRow() / 2);
1437             createExport(rules, rule,
1438                          RequestPacket.TRANSFERMODE.RECVMD5MODE.ordinal(),
1439                          getLimitRow() / 2);
1440             createExport(rules, rule,
1441                          RequestPacket.TRANSFERMODE.RECVTHROUGHMODE.ordinal(),
1442                          getLimitRow() / 2);
1443             createExport(rules, rule,
1444                          RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE.ordinal(),
1445                          getLimitRow() / 2);
1446           } else if (gmode == -2) {
1447             // send
1448             createExport(rules, rule,
1449                          RequestPacket.TRANSFERMODE.SENDMODE.ordinal(),
1450                          getLimitRow() / 2);
1451             createExport(rules, rule,
1452                          RequestPacket.TRANSFERMODE.SENDMD5MODE.ordinal(),
1453                          getLimitRow() / 2);
1454             createExport(rules, rule,
1455                          RequestPacket.TRANSFERMODE.SENDTHROUGHMODE.ordinal(),
1456                          getLimitRow() / 2);
1457             createExport(rules, rule,
1458                          RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE.ordinal(),
1459                          getLimitRow() / 2);
1460           } else {
1461             // all
1462             createExport(rules, rule, -1, getLimitRow());
1463           }
1464         }
1465         final StringBuilder builder = new StringBuilder("[");
1466         if (!rules.isEmpty()) {
1467           for (final String string : rules.values()) {
1468             builder.append(string).append(',');
1469           }
1470           rules.clear();
1471           builder.setLength(builder.length() - 1);
1472         }
1473         builder.append(']');
1474         head = head.replace(XXXDATAJSONXXX, builder.toString());
1475       } else if ("Delete".equalsIgnoreCase(parm)) {
1476         final String rule = getTrimValue("rule");
1477         if (ParametersChecker.isEmpty(rule)) {
1478           errorText = Messages.getString("HttpSslHandler.29"); //$NON-NLS-1$
1479           head = resetOptionRules(head, "", null, -3);
1480           head = createExport(head, errorText, null);
1481           return head.replace(XXXRESULTXXX, errorText)
1482                      .replace(XXXDATAJSONXXX, "[]");
1483         }
1484         final DbRule dbrule;
1485         try {
1486           dbrule = new DbRule(rule);
1487         } catch (final WaarpDatabaseException e) {
1488           errorText = Messages.getString("HttpSslHandler.30") + e.getMessage()
1489                       //$NON-NLS-1$
1490                       + B_CENTER_P2;
1491           head = resetOptionRules(head, "", null, -3);
1492           head = createExport(head, errorText, null);
1493           return head.replace(XXXRESULTXXX, errorText)
1494                      .replace(XXXDATAJSONXXX, "[]");
1495         }
1496         try {
1497           dbrule.delete();
1498         } catch (final WaarpDatabaseException e) {
1499           errorText = Messages.getString("HttpSslHandler.30") + e.getMessage()
1500                       //$NON-NLS-1$
1501                       + B_CENTER_P2;
1502           head = resetOptionRules(head, "", null, -3);
1503           head = createExport(head, errorText, null);
1504           return head.replace(XXXRESULTXXX, errorText)
1505                      .replace(XXXDATAJSONXXX, "[]");
1506         }
1507         errorText += Messages.getString("HttpSslHandler.31") + rule +
1508                      B_CENTER_P2; //$NON-NLS-1$
1509         head = resetOptionRules(head, "", null, -3);
1510         head =
1511             head.replace(XXXDATAJSONXXX, '[' + dbrule.getJsonAsString() + ']');
1512         return head.replace(XXXRESULTXXX, errorText)
1513                    .replace(XXXDATAJSONXXX, "[]");
1514       }
1515     }
1516     head = resetOptionRules(head, "", null, -3);
1517     head = createExport(head, errorText, null);
1518     return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
1519   }
1520 
1521   private String spooled(final boolean detailed) {
1522     // XXXSPOOLEDXXX
1523     if (request.method() == HttpMethod.POST) {
1524       getParamsResponsive();
1525     }
1526     final String spooled = REQUEST.Spooled.read(this);
1527     String uri;
1528     if (detailed) {
1529       uri = "SpooledDetailed.html";
1530     } else {
1531       uri = "Spooled.html";
1532     }
1533     final QueryStringDecoder queryStringDecoder =
1534         new QueryStringDecoder(request.uri());
1535     if (params == null) {
1536       params = new HashMap<String, List<String>>();
1537     }
1538     params.putAll(queryStringDecoder.parameters());
1539     String name = null;
1540     if (params.containsKey("name")) {
1541       name = getTrimValue("name");
1542     }
1543     int istatus = 0;
1544     if (params.containsKey("status")) {
1545       final String status = getTrimValue("status");
1546       try {
1547         istatus = Integer.parseInt(status);
1548       } catch (final NumberFormatException e1) {
1549         istatus = 0;
1550       }
1551     }
1552     if (spooled.contains("XXXSPOOLEDXXX")) {
1553       if (ParametersChecker.isNotEmpty(name)) {
1554         // name is specified
1555         uri = request.uri();
1556         if (istatus != 0) {
1557           uri += "&status=" + istatus;
1558         }
1559         final StringBuilder builder =
1560             SpooledInformTask.buildSpooledUniqueTable(uri, name);
1561         return spooled.replace("XXXSPOOLEDXXX", builder.toString());
1562       } else {
1563         if (istatus != 0) {
1564           uri += "&status=" + istatus;
1565         }
1566         final StringBuilder builder =
1567             SpooledInformTask.buildSpooledTable(detailed, istatus, uri);
1568         return spooled.replace("XXXSPOOLEDXXX", builder.toString());
1569       }
1570     }
1571     if (ParametersChecker.isNotEmpty(name)) {
1572       // name is specified
1573       uri = request.uri();
1574       if (istatus != 0) {
1575         uri += "&status=" + istatus;
1576       }
1577       final String builder =
1578           SpooledInformTask.buildSpooledUniqueJson(uri, name);
1579       return spooled.replace(XXXDATAJSONXXX, builder);
1580     } else {
1581       if (istatus != 0) {
1582         uri += "&status=" + istatus;
1583       }
1584       final String builder =
1585           SpooledInformTask.buildSpooledJson(detailed, istatus, uri);
1586       return spooled.replace(XXXDATAJSONXXX, builder);
1587     }
1588   }
1589 
1590   /**
1591    * Applied current lang to system page
1592    *
1593    * @param builder
1594    */
1595   @Override
1596   protected final void langHandle(final StringBuilder builder) {
1597     // i18n: add here any new languages
1598     WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURLANGENXXX.name(),
1599                              "en".equalsIgnoreCase(lang)? "checked" : "");
1600     WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURLANGFRXXX.name(),
1601                              "fr".equalsIgnoreCase(lang)? "checked" : "");
1602     WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURSYSLANGENXXX.name(),
1603                              "en".equalsIgnoreCase(Messages.getSlocale())?
1604                                  "checked" : "");
1605     WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURSYSLANGFRXXX.name(),
1606                              "fr".equalsIgnoreCase(Messages.getSlocale())?
1607                                  "checked" : "");
1608   }
1609 
1610   private void fillHostIds(final StringBuilder builder) {
1611     final ArrayList<String> hostsList = new ArrayList<String>();
1612     try {
1613       final DbHostAuth[] hosts = DbHostAuth.getAllHosts();
1614       for (final DbHostAuth dbHostAuth : hosts) {
1615         hostsList.add(dbHostAuth.getHostid());
1616       }
1617     } catch (final WaarpDatabaseNoConnectionException ignored) {
1618       // nothing
1619     }
1620     final StringBuilder hostsBuilder = new StringBuilder();
1621     for (final String string : hostsList) {
1622       if (hostsBuilder.length() != 0) {
1623         hostsBuilder.append(',');
1624       }
1625       hostsBuilder.append('\'').append(string).append('\'');
1626     }
1627     final String hosts = "[" + hostsBuilder + ']';
1628     WaarpStringUtils.replace(builder, XXXHOSTSIDSXXX, hosts);
1629   }
1630 
1631   private String system() {
1632     getParamsResponsive();
1633     DbHostConfiguration config = null;
1634     try {
1635       config = new DbHostConfiguration(Configuration.configuration.getHostId());
1636     } catch (final WaarpDatabaseException e2) {
1637       try {
1638         config =
1639             new DbHostConfiguration(Configuration.configuration.getHostId(), "",
1640                                     "", "", "");
1641         config.insert();
1642       } catch (final WaarpDatabaseException ignored) {
1643         // nothing
1644       }
1645     }
1646     if (params == null) {
1647       final String system = REQUEST.System.read(this);
1648       final StringBuilder builder = new StringBuilder(system);
1649       replaceStringSystem(config, builder);
1650       langHandle(builder);
1651       fillHostIds(builder);
1652       return builder.toString();
1653     }
1654     String extraInformation = null;
1655     if (params.containsKey(ACTION2)) {
1656       final List<String> action = params.get(ACTION2);
1657       for (final String act : action) {
1658         if ("Language".equalsIgnoreCase(act)) {
1659           lang = getTrimValue("change");
1660           final String sys = getTrimValue("changesys");
1661           Messages.init(new Locale(sys));
1662           extraInformation =
1663               Messages.getString("HttpSslHandler.LangIs") + "Web: " + lang +
1664               " OpenR66: " //$NON-NLS-1$
1665               + Messages.getSlocale();
1666         } else if ("Level".equalsIgnoreCase(act)) {
1667           final String loglevel = getTrimValue("loglevel");
1668           WaarpLogLevel level = WaarpLogLevel.WARN;
1669           if ("debug".equalsIgnoreCase(loglevel)) {
1670             level = WaarpLogLevel.DEBUG;
1671           } else if ("info".equalsIgnoreCase(loglevel)) {
1672             level = WaarpLogLevel.INFO;
1673           } else if ("warn".equalsIgnoreCase(loglevel)) {
1674             level = WaarpLogLevel.WARN;
1675           } else if ("error".equalsIgnoreCase(loglevel)) {
1676             level = WaarpLogLevel.ERROR;
1677           }
1678           WaarpLoggerFactory.setLogLevel(level);
1679           extraInformation = Messages.getString("HttpSslHandler.LangIs") +
1680                              level.name(); //$NON-NLS-1$
1681         } else if ("ExportConfig".equalsIgnoreCase(act)) {
1682           String base = Configuration.configuration.getBaseDirectory() +
1683                         DirInterface.SEPARATOR;
1684           final String directory =
1685               base + Configuration.configuration.getArchivePath();
1686           extraInformation = Messages.getString("HttpSslHandler.ExportDir")
1687                              //$NON-NLS-1$
1688                              + Configuration.configuration.getArchivePath() +
1689                              "<br>";
1690           final String[] filenames =
1691               ServerActions.staticConfigExport(directory, true, true, true,
1692                                                true, true);
1693           // hosts, rules, business, alias, roles
1694           base = base.replace('\\', '/');
1695           if (filenames[0] != null) {
1696             filenames[0] = filenames[0].replace('\\', '/').replace(base, "");
1697             extraInformation +=
1698                 "<A href='" + filenames[0] + "' target='_blank'>" +
1699                 filenames[0] + "</A> " +
1700                 Messages.getString("HttpSslHandler.33"); //$NON-NLS-1$
1701           }
1702           if (filenames[1] != null) {
1703             filenames[1] = filenames[1].replace('\\', '/').replace(base, "");
1704             extraInformation +=
1705                 "<A href='" + filenames[1] + "' target='_blank'>" +
1706                 filenames[1] + "</A> " +
1707                 Messages.getString("HttpSslHandler.32"); //$NON-NLS-1$
1708           }
1709           if (filenames[2] != null) {
1710             filenames[2] = filenames[2].replace('\\', '/').replace(base, "");
1711             extraInformation +=
1712                 "<A href='" + filenames[2] + "' target='_blank'>" +
1713                 filenames[2] + "</A> " +
1714                 Messages.getString("HttpSslHandler.44"); //$NON-NLS-1$
1715           }
1716           if (filenames[3] != null) {
1717             filenames[3] = filenames[3].replace('\\', '/').replace(base, "");
1718             extraInformation +=
1719                 "<A href='" + filenames[3] + "' target='_blank'>" +
1720                 filenames[3] + "</A> " +
1721                 Messages.getString("HttpSslHandler.45"); //$NON-NLS-1$
1722           }
1723           if (filenames[4] != null) {
1724             filenames[4] = filenames[4].replace('\\', '/').replace(base, "");
1725             extraInformation +=
1726                 "<A href='" + filenames[4] + "' target='_blank'>" +
1727                 filenames[4] + "</A> " +
1728                 Messages.getString("HttpSslHandler.46"); //$NON-NLS-1$
1729           }
1730         } else if ("Disconnect".equalsIgnoreCase(act)) {
1731           return logout();
1732         } else if ("Block".equalsIgnoreCase(act)) {
1733           final boolean block = params.containsKey("blocking");
1734           if (block) {
1735             extraInformation =
1736                 Messages.getString("HttpSslHandler.34"); //$NON-NLS-1$
1737           } else {
1738             extraInformation =
1739                 Messages.getString("HttpSslHandler.35"); //$NON-NLS-1$
1740           }
1741           Configuration.configuration.setShutdown(block);
1742         } else if ("Shutdown".equalsIgnoreCase(act)) {
1743           final String error;
1744           if (Configuration.configuration.getShutdownConfiguration().serviceFuture !=
1745               null) {
1746             error =
1747                 error(Messages.getString("HttpSslHandler.38")); //$NON-NLS-1$
1748           } else {
1749             error =
1750                 error(Messages.getString("HttpSslHandler.37")); //$NON-NLS-1$
1751           }
1752           WaarpShutdownHook.setRestart(false);
1753           newSession = true;
1754           clearSession();
1755           forceClose = true;
1756           shutdown = true;
1757           return error;
1758         } else if ("Restart".equalsIgnoreCase(act)) {
1759           String error;
1760           if (Configuration.configuration.getShutdownConfiguration().serviceFuture !=
1761               null) {
1762             error =
1763                 error(Messages.getString("HttpSslHandler.38")); //$NON-NLS-1$
1764           } else {
1765             error = error(Messages.getString("HttpSslHandler.39")
1766                           //$NON-NLS-1$
1767                           + Configuration.configuration.getTimeoutCon() * 2 /
1768                             1000 + Messages.getString(
1769                 "HttpSslHandler.40")); //$NON-NLS-1$
1770           }
1771           error = error.replace("XXXRELOADHTTPXXX",
1772                                 "HTTP-EQUIV=\"refresh\" CONTENT=\"" +
1773                                 Configuration.configuration.getTimeoutCon() *
1774                                 2 / 1000 + '"');
1775           WaarpShutdownHook.setRestart(true);
1776           newSession = true;
1777           clearSession();
1778           forceClose = true;
1779           shutdown = true;
1780           return error;
1781         } else if ("Validate".equalsIgnoreCase(act)) {
1782           final String bsessionr = getTrimValue("BSESSR");
1783           long lsessionr =
1784               Configuration.configuration.getServerChannelReadLimit();
1785           long lglobalr;
1786           long lsessionw;
1787           long lglobalw;
1788           long delay;
1789           try {
1790             if (bsessionr != null) {
1791               lsessionr = (Long.parseLong(bsessionr) / 10) * 10;
1792             }
1793             final String bglobalr = getTrimValue("BGLOBR");
1794             lglobalr = Configuration.configuration.getServerGlobalReadLimit();
1795             if (bglobalr != null) {
1796               lglobalr = (Long.parseLong(bglobalr) / 10) * 10;
1797             }
1798             final String bsessionw = getTrimValue("BSESSW");
1799             lsessionw =
1800                 Configuration.configuration.getServerChannelWriteLimit();
1801             if (bsessionw != null) {
1802               lsessionw = (Long.parseLong(bsessionw) / 10) * 10;
1803             }
1804             final String bglobalw = getTrimValue("BGLOBW");
1805             lglobalw = Configuration.configuration.getServerGlobalWriteLimit();
1806             if (bglobalw != null) {
1807               lglobalw = (Long.parseLong(bglobalw) / 10) * 10;
1808             }
1809             final String dtra = getTrimValue("DTRA");
1810             delay = Configuration.configuration.getDelayLimit();
1811             if (dtra != null) {
1812               delay = (Long.parseLong(dtra) / 10) * 10;
1813               if (delay < 100) {
1814                 delay = 100;
1815               }
1816             }
1817             Configuration.configuration.changeNetworkLimit(lglobalw, lglobalr,
1818                                                            lsessionw, lsessionr,
1819                                                            delay);
1820             final String dcomm = getTrimValue("DCOM");
1821             if (dcomm != null) {
1822               Configuration.configuration.setDelayCommander(
1823                   Long.parseLong(dcomm));
1824               if (Configuration.configuration.getDelayCommander() <= 100) {
1825                 Configuration.configuration.setDelayCommander(100);
1826               }
1827               Configuration.configuration.reloadCommanderDelay();
1828             }
1829             final String dret = getTrimValue("DRET");
1830             if (dret != null) {
1831               Configuration.configuration.setDelayRetry(Long.parseLong(dret));
1832               if (Configuration.configuration.getDelayRetry() <= 1000) {
1833                 Configuration.configuration.setDelayRetry(1000);
1834               }
1835             }
1836             extraInformation =
1837                 Messages.getString("HttpSslHandler.41"); //$NON-NLS-1$
1838           } catch (final NumberFormatException e) {
1839             extraInformation =
1840                 Messages.getString("HttpSslHandler.42"); //$NON-NLS-1$
1841           }
1842         } else if ("HostConfig".equalsIgnoreCase(act)) {
1843           logger.debug("DbHC update");
1844           config.setBusiness(getTrimValue("BUSINESS"));
1845           config.setRoles(getTrimValue("ROLES"));
1846           config.setAliases(getTrimValue("ALIASES"));
1847           config.setOthers(getTrimValue("OTHER"));
1848           logger.debug("DbHC update {}", config.toJson());
1849           try {
1850             config.update();
1851             extraInformation =
1852                 Messages.getString("HttpSslHandler.41"); //$NON-NLS-1$
1853           } catch (final WaarpDatabaseException e) {
1854             extraInformation =
1855                 Messages.getString("HttpSslHandler.43"); //$NON-NLS-1$
1856           }
1857         }
1858       }
1859     }
1860     final String system = REQUEST.System.read(this);
1861     final StringBuilder builder = new StringBuilder(system);
1862     replaceStringSystem(config, builder);
1863     langHandle(builder);
1864     fillHostIds(builder);
1865     if (extraInformation != null) {
1866       builder.append(extraInformation);
1867     }
1868     return builder.toString();
1869   }
1870 
1871   private void getParamsResponsive() {
1872     if (request.method() == HttpMethod.GET) {
1873       params = null;
1874     } else if (request.method() == HttpMethod.POST) {
1875       final Map<String, List<String>> paramsOld = params;
1876       final ByteBuf content = request.content();
1877       if (content.isReadable()) {
1878         final String param = content.toString(WaarpStringUtils.UTF8);
1879         final QueryStringDecoder queryStringDecoder2 =
1880             new QueryStringDecoder("/?" + param);
1881         params = queryStringDecoder2.parameters();
1882         boolean invalidEntry = false;
1883         for (final Entry<String, List<String>> paramCheck : params.entrySet()) {
1884           try {
1885             ParametersChecker.checkSanityString(paramCheck.getValue().toArray(
1886                 ParametersChecker.ZERO_ARRAY_STRING));
1887           } catch (final InvalidArgumentException e) {
1888             logger.error(
1889                 "Arguments incompatible with Security: " + paramCheck.getKey() +
1890                 ": {}", e.getMessage());
1891             invalidEntry = true;
1892           }
1893         }
1894         if (invalidEntry) {
1895           for (final Entry<String, List<String>> paramCheck : params.entrySet()) {
1896             paramCheck.getValue().clear();
1897           }
1898           params.clear();
1899           params = null;
1900           logger.error("No parameter validated since security issue found");
1901           return;
1902         }
1903         if (params.containsKey(REFRESH)) {
1904           final List<String> parms = params.get(ACTION2);
1905           if (parms != null) {
1906             final String parm = parms.get(0);
1907             if ("Disabling".equalsIgnoreCase(parm)) {
1908               setRefresh(0);
1909             } else {
1910               final String snb = getTrimValue(REFRESH);
1911               if (snb != null) {
1912                 try {
1913                   final int old = getRefresh();
1914                   setRefresh(Integer.parseInt(snb) * 1000);
1915                   if (getRefresh() < 0) {
1916                     setRefresh(old);
1917                   }
1918                 } catch (final Exception ignored) {
1919                   // ignore
1920                 }
1921               }
1922             }
1923           }
1924           params = paramsOld;
1925           return;
1926         }
1927         if (params.containsKey(LIMITROW1)) {
1928           final String snb = getTrimValue(LIMITROW1);
1929           if (snb != null) {
1930             try {
1931               final int old = getLimitRow();
1932               setLimitRow(Integer.parseInt(snb));
1933               if (getLimitRow() < 5) {
1934                 setLimitRow(old);
1935               }
1936             } catch (final Exception ignored) {
1937               // ignore
1938             }
1939           }
1940         }
1941       } else {
1942         params = null;
1943       }
1944     }
1945   }
1946 
1947   private void checkAuthentResponsive(final ChannelHandlerContext ctx) {
1948     newSession = true;
1949     if (request.method() == HttpMethod.GET) {
1950       String logon = logon();
1951       logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(), "");
1952       responseContent.append(logon);
1953       clearSession();
1954       writeResponse(ctx);
1955       return;
1956     } else if (request.method() == HttpMethod.POST) {
1957       getParamsResponsive();
1958       if (params == null) {
1959         String logon = logon();
1960         logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
1961                                  Messages.getString(
1962                                      "HttpSslHandler.EmptyLogin"));
1963         responseContent.append(logon);
1964         clearSession();
1965         writeResponse(ctx);
1966         return;
1967       }
1968     } else {
1969       sendError(ctx, HttpResponseStatus.METHOD_NOT_ALLOWED);
1970       return;
1971     }
1972     boolean getMenu = false;
1973     if (params != null && params.containsKey("Logon")) {
1974       String name = null;
1975       String password = null;
1976       List<String> values;
1977       if (!params.isEmpty()) {
1978         // get values
1979         if (params.containsKey("name")) {
1980           values = params.get("name");
1981           if (values != null) {
1982             name = values.get(0);
1983             if (ParametersChecker.isEmpty(name)) {
1984               getMenu = true;
1985             }
1986           }
1987         } else {
1988           getMenu = true;
1989         }
1990         // search the nb param
1991         if (!getMenu && params.containsKey("passwd")) {
1992           values = params.get("passwd");
1993           if (values != null) {
1994             password = values.get(0);
1995             getMenu = ParametersChecker.isEmpty(password);
1996           } else {
1997             getMenu = true;
1998           }
1999         } else {
2000           getMenu = true;
2001         }
2002       } else {
2003         getMenu = true;
2004       }
2005       if (!getMenu && name != null) {
2006         logger.debug("Name? {} Passwd? {}",
2007                      name.equals(Configuration.configuration.getAdminName()),
2008                      Arrays.equals(password.getBytes(WaarpStringUtils.UTF8),
2009                                    Configuration.configuration.getServerAdminKey()));
2010         if (name.equals(Configuration.configuration.getAdminName()) &&
2011             Arrays.equals(password.getBytes(WaarpStringUtils.UTF8),
2012                           Configuration.configuration.getServerAdminKey())) {
2013           authentHttp.getAuth().specialNoSessionAuth(true,
2014                                                      Configuration.configuration.getHostId());
2015           authentHttp.setStatus(70);
2016         } else {
2017           try {
2018             authentHttp.getAuth().connectionHttps(name,
2019                                                   FilesystemBasedDigest.passwdCrypt(
2020                                                       password.getBytes(
2021                                                           WaarpStringUtils.UTF8)));
2022           } catch (final Reply530Exception e1) {
2023             getMenu = true;
2024           } catch (final Reply421Exception e1) {
2025             getMenu = true;
2026           }
2027         }
2028         if (!authentHttp.isAuthenticated()) {
2029           authentHttp.setStatus(71);
2030           logger.info("Still not authenticated: {}", authentHttp);
2031           getMenu = true;
2032         }
2033         logger.debug("Identified: {}:{}", authentHttp.getAuth().isIdentified(),
2034                      authentHttp.isAuthenticated());
2035       }
2036     } else {
2037       getMenu = true;
2038     }
2039     if (getMenu) {
2040       String logon = logon();
2041       logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
2042                                Messages.getString("HttpSslHandler.BadLogin"));
2043       responseContent.append(logon);
2044       clearSession();
2045     } else {
2046       final String index = indexResponsive();
2047       responseContent.append(index);
2048       clearSession();
2049       admin = new DefaultCookie(
2050           R66SESSION + Configuration.configuration.getHostId(),
2051           Configuration.configuration.getHostId() +
2052           Long.toHexString(RANDOM.nextLong()));
2053       sessions.put(admin.value(), authentHttp);
2054       authentHttp.setStatus(72);
2055       logger.debug("CreateSession: {}:{}", uriRequest, admin);
2056     }
2057     writeResponse(ctx);
2058   }
2059 
2060   @Override
2061   protected void channelRead0(final ChannelHandlerContext ctx,
2062                               final FullHttpRequest msg) {
2063     final FullHttpRequest request = this.request = msg;
2064     final QueryStringDecoder queryStringDecoder =
2065         new QueryStringDecoder(request.uri());
2066     uriRequest = queryStringDecoder.path();
2067     logger.debug("Msg: {}", uriRequest);
2068     if (uriRequest.contains("gre/") || uriRequest.contains("img/") ||
2069         uriRequest.contains("app/") || uriRequest.contains("css/") ||
2070         uriRequest.contains("js/") || uriRequest.contains("datatable/") ||
2071         uriRequest.contains("res/") || uriRequest.contains("favicon.ico")) {
2072       HttpWriteCacheEnable.writeFile(request, ctx,
2073                                      Configuration.configuration.getHttpBasePath() +
2074                                      uriRequest, R66SESSION +
2075                                                  Configuration.configuration.getHostId());
2076       return;
2077     }
2078     if (uriRequest.contains(Configuration.configuration.getArchivePath())) {
2079       HttpWriteCacheEnable.writeFile(request, ctx,
2080                                      Configuration.configuration.getBaseDirectory() +
2081                                      uriRequest, R66SESSION +
2082                                                  Configuration.configuration.getHostId());
2083       return;
2084     }
2085     checkSession(ctx.channel());
2086     try {
2087       if (!authentHttp.isAuthenticated()) {
2088         logger.debug("Not Authent: {}:{}", uriRequest, authentHttp);
2089         checkAuthentResponsive(ctx);
2090         return;
2091       }
2092       String find = uriRequest;
2093       if (uriRequest.charAt(0) == '/') {
2094         find = uriRequest.substring(1);
2095       }
2096       REQUEST req = REQUEST.index;
2097       if (find.length() != 0) {
2098         find = find.substring(0, find.indexOf('.'));
2099         try {
2100           req = REQUEST.valueOf(find);
2101         } catch (final IllegalArgumentException e1) {
2102           req = REQUEST.index;
2103           logger.info("NotFound: {}:{}", find, uriRequest);
2104         }
2105       }
2106       switch (req) {
2107         case CancelRestart:
2108           if (authentHttp.getAuth().isValidRole(ROLE.TRANSFER)) {
2109             responseContent.append(cancelRestart());
2110           } else {
2111             responseContent.append(unallowedResponsive(
2112                 Messages.getString("HttpSslHandler.CancelRestartUnallowed")));
2113           }
2114           break;
2115         case Export:
2116           if (authentHttp.getAuth().isValidRole(ROLE.SYSTEM)) {
2117             responseContent.append(export());
2118           } else {
2119             responseContent.append(unallowedResponsive(
2120                 Messages.getString("HttpSslHandler.ExportUnallowed")));
2121           }
2122           break;
2123         case Hosts:
2124           if (authentHttp.getAuth().isValidRole(ROLE.HOST)) {
2125             responseContent.append(hosts());
2126           } else {
2127             responseContent.append(unallowedResponsive(
2128                 Messages.getString("HttpSslHandler.HostUnallowed")));
2129           }
2130           break;
2131         case ListingReload:
2132           responseContent.append(listingReload());
2133           break;
2134         case Listing:
2135           responseContent.append(listing());
2136           break;
2137         case Logout:
2138           responseContent.append(logout());
2139           break;
2140         case Rules:
2141           if (authentHttp.getAuth().isValidRole(ROLE.RULE)) {
2142             responseContent.append(rules());
2143           } else {
2144             responseContent.append(unallowedResponsive(
2145                 Messages.getString("HttpSslHandler.RulesUnallowed")));
2146           }
2147           break;
2148         case System:
2149           if (authentHttp.getAuth().isValidRole(ROLE.SYSTEM)) {
2150             responseContent.append(system());
2151           } else {
2152             responseContent.append(systemLimited());
2153           }
2154           break;
2155         case Spooled:
2156           responseContent.append(spooled(false));
2157           break;
2158         case SpooledDetailed:
2159           responseContent.append(spooled(true));
2160           break;
2161         case CreateTransfer:
2162           if (authentHttp.getAuth().isValidRole(ROLE.TRANSFER)) {
2163             responseContent.append(createTransfer());
2164           } else {
2165             responseContent.append(unallowedResponsive(
2166                 Messages.getString("HttpSslHandler.CreateTransferNotAllowed")));
2167           }
2168           break;
2169         default:
2170           responseContent.append(indexResponsive());
2171           break;
2172       }
2173       writeResponse(ctx);
2174     } finally {
2175       closeConnection();
2176     }
2177   }
2178 
2179   private class RestartOrStopAll {
2180     private final String seeAll;
2181     private final String parm;
2182     private String head;
2183     private String errorText;
2184 
2185     public RestartOrStopAll(final String head, final String errorText,
2186                             final String seeAll, final String parm) {
2187       this.head = head;
2188       this.errorText = errorText;
2189       this.seeAll = seeAll;
2190       this.parm = parm;
2191     }
2192 
2193     public String getHead() {
2194       return head;
2195     }
2196 
2197     public String getErrorText() {
2198       return errorText;
2199     }
2200 
2201     public RestartOrStopAll invoke() {
2202       final boolean stopcommand = "StopAll".equalsIgnoreCase(parm) ||
2203                                   "StopCleanAll".equalsIgnoreCase(parm);
2204       final String startid = getTrimValue("startid");
2205       final String stopid = getTrimValue("stopid");
2206       String start = getValue("start");
2207       String stop = getValue("stop");
2208       final String rule = getTrimValue("rule");
2209       final String req = getTrimValue("req");
2210       boolean pending;
2211       boolean transfer;
2212       boolean error;
2213       boolean all;
2214       pending = params.containsKey("pending");
2215       transfer = params.containsKey("transfer");
2216       error = params.containsKey("error");
2217       all = false;
2218       if (!(pending || transfer || error)) {
2219         all = true;
2220         pending = true;
2221         transfer = true;
2222         error = true;
2223       }
2224       final Timestamp tstart = WaarpStringUtils.fixDate(start);
2225       if (tstart != null) {
2226         start = tstart.toString();
2227       }
2228       final Timestamp tstop = WaarpStringUtils.fixDate(stop, tstart);
2229       if (tstop != null) {
2230         stop = tstop.toString();
2231       }
2232       head = resetOptionTransfer(head, startid == null? "" : startid,
2233                                  stopid == null? "" : stopid, start, stop,
2234                                  rule == null? "" : rule, req == null? "" : req,
2235                                  pending, transfer, error, false, all);
2236       final HashMap<String, String> map = new HashMap<String, String>();
2237       if (stopcommand) {
2238         if ("StopCleanAll".equalsIgnoreCase(parm)) {
2239           TransferUtils.cleanSelectedTransfers(dbSession, 0, map, authentHttp,
2240                                                head, startid, stopid, tstart,
2241                                                tstop, rule, req, pending,
2242                                                transfer, error, seeAll);
2243         } else {
2244           TransferUtils.stopSelectedTransfers(dbSession, 0, map, authentHttp,
2245                                               head, startid, stopid, tstart,
2246                                               tstop, rule, req, pending,
2247                                               transfer, error, seeAll);
2248         }
2249       } else {
2250         DbPreparedStatement preparedStatement = null;
2251         try {
2252           preparedStatement =
2253               DbTaskRunner.getFilterPrepareStatement(dbSession, 0, false,
2254                                                      startid, stopid, tstart,
2255                                                      tstop, rule, req, pending,
2256                                                      transfer, error, false,
2257                                                      all, seeAll);
2258           preparedStatement.executeQuery();
2259           while (preparedStatement.getNext()) {
2260             try {
2261               final DbTaskRunner taskRunner =
2262                   DbTaskRunner.getFromStatement(preparedStatement);
2263               final LocalChannelReference lcr =
2264                   Configuration.configuration.getLocalTransaction()
2265                                              .getFromRequest(
2266                                                  taskRunner.getKey());
2267               final R66Result finalResult =
2268                   TransferUtils.restartTransfer(taskRunner, lcr);
2269               final ErrorCode result = finalResult.getCode();
2270               final ErrorCode last = taskRunner.getErrorInfo();
2271               taskRunner.setErrorExecutionStatus(result);
2272               map.put(taskRunner.getKey(), taskRunner.getJsonAsString());
2273               taskRunner.setErrorExecutionStatus(last);
2274             } catch (final WaarpDatabaseException e) {
2275               // try to continue if possible
2276               logger.warn("An error occurs while accessing a Runner: {}",
2277                           e.getMessage());
2278             }
2279           }
2280           preparedStatement.realClose();
2281         } catch (final WaarpDatabaseException e) {
2282           if (preparedStatement != null) {
2283             preparedStatement.realClose();
2284           }
2285           logger.warn(OPEN_R66_WEB_ERROR2, e.getMessage());
2286           errorText +=
2287               Messages.getString("ErrorCode.17") + ": " + e.getMessage() +
2288               "<BR/>";
2289         }
2290       }
2291       final StringBuilder builder = new StringBuilder("[");
2292       if (!map.isEmpty()) {
2293         for (final String string : map.values()) {
2294           builder.append(string).append(',');
2295         }
2296         map.clear();
2297         builder.setLength(builder.length() - 1);
2298       }
2299       builder.append(']');
2300       head = head.replace(XXXDATAJSONXXX, builder.toString());
2301       return this;
2302     }
2303   }
2304 }